RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

CCS C for PIC16F877A

Collapse
This topic is closed.
X
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • huybo02
    Đệ tử 4 túi
    • Aug 2006
    • 61

    #286
    Nguyên văn bởi cuopbienquin View Post
    Mình mới học về PIC.Cho hỏi ADC module có chức năng gì,công dụng ntn trên PIC? Mình nghĩ cho một điện thế analog thì nó xuất ra tín hiệu digital.Mình đã có đọc đoạn code này nhưng chưa hiểu rõ :
    Code:
    #include <16F877.h>
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    #device 16F877*=16 ADC=8 
    #use delay(clock=10000000)
    Int8 adc;
    main()
    {
    setup_adc(adc_clock_internal);
    setup_adc_ports(AN0);
    set_adc_channel(0);
    delay_ms(10);
    while(true)
    {
    adc=read_adc();
    output_B(adc);
    }
    }
    Bạn nào đã đi trước thì giải thích giùm mình nhé,mình cần luôn file mô phỏng proteuss để hiểu rõ hơn.Cám ơn nhiều.Chúc vui.
    ADC là chức năng chuyển đổi tín hiệu analog -> digital (Analog Digital Converter). Nó dùng 1 điện áp để so sánh (Vref) tùy độ phân giải mà điện áp này được chia là nhiểu mức khác nhau (2^n) với 16F877A ADC 10 bit tức Vref dc chia thành 2^10 = 1024 mức. Mỗi mức ADC cách nhau tương ứng với Vref/số mức. Vref = 5V thì mỗi mức ADC của 16F877 ứng với 5V/1024 = 4.88mV. Điện áp trên cổng AN sẽ được so sánh để ra được mức ADC tương ứng. 0V ứng với ADC =0, 4.88mV ứng với ADC =1...Kết quả được chứa trong 2 thanh ghi ADRESH:ADRESL.
    Còn mạch cho code trên thì bạn mắc 1 cầu chia áp để đưa điện áp vào chân AN0 là được. Dùng biến trở cho gọn.
    Còn PWM thì bạn đọc trong datasheet đó chương 8 phần CAPTURE/COMPARE/PWM MODULES và xem thêm bên ứng dụng điều khiển PID cho động cơ DC.
    Last edited by namqn; 18-08-2007, 05:18 PM.

    Comment

    • anh_gioi
      Đệ tử 6 túi
      • Oct 2006
      • 147

      #287
      [QUOTE][QUOTE]

      cho em hỏi] về đo nhiệt độ dùng pic 16f877A với ạ.code này em copy của anh linhnc308.nhưng về lắp vẫn chưa chay.trong code nó bị báo lỗi
      [QUOTE] // trisa = 0xFF;
      // trisb = 0x01;
      // trisd = 0x00;[QUOTE]
      em nghĩ là nó khai báo cho cổng ra vào nên em đã thay nó bằng :
      set_tris_a(0xff);
      set_tris_b(0x01);
      set_tris_d(0x00);
      thế là nó hết báo lỗi,nhưng vẫn ko đc.em đã lắp mạch thật cho nó nhưng nó vẫn im lìm ko báo biếc gì cả(bứ lắm cơ!)
      các anh cho em lời khuyên với.
      note: đây là mạch và code em mượn của anh linhnc308,mong anh cố gắng giúp cho kẻ ngốc nghếch này.em đã lắp mạch đúng,và mặc dù em đã lấy file hex của anh nạp vào mà nó vẫn im lìm ạ,

      Comment

      • anh_gioi
        Đệ tử 6 túi
        • Oct 2006
        • 147

        #288
        sao ko post file từ máy tính đc nhỉ? thui khi khác post sau vậy.lại vẫn dậm chân 1 chỗ.chán thật

        Comment

        • cuopbienquin
          Đệ tử 2 túi
          • Jun 2007
          • 43

          #289
          Nguyên văn bởi nhh View Post
          Đây là chương trình dùng ngắt Timer0 định thì 1s.
          Đầu tiên led ở chân RB0 sáng, sau 1s sẽ dịch sang trái, nghĩa là led 1 trên chân RB1 sáng , lần lượt như vậy cho các led trên portB và lặp lại mãi mãi.
          Code:
          //****************************************************
          // Author  : nhh
          // Date    : 02/04/06
          // Hardware: PIC16F877A
          //****************************************************
          #include <16F877A.h>
          #fuses NOWDT,PUT,XT,NOPROTECT
          #use delay(clock=4000000)
          #use fast_io(b)
          #byte portb=0x06
          #define led pin_B0
          int16 count;
          int8 a;
          //Chuong trinh ngat TMR0
          #int_timer0
          void interrupt_timer0()
          {
          set_timer0(6);
          ++count;
          if(count==2000)
             {
          count=0;
          a=a<<1;  // dich trai a 1bit
             }
          if(a==256)
             {
          a=1;
          count=0;
             }
          }
          //Chuong trinh chinh
          main()
          {
          set_tris_b(0);
          enable_interrupts(global);
          enable_interrupts(int_timer0);
          setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
          set_timer0(6);
          count=0;
          a=1;
          while(true)
             {
          portb=a;
             }
          }
          Mình đang học về Timer .Theo bài này thì khi với thạch anh 4Mhz thì thời gian cho mồi dòng lệnh là 100us hay sau 100us thì timer sẽ báo tràn và quay trở lại 0. Có phải biến count là gán cho "mỗi dòng lệnh",nghĩa là khi count=2000 <=>delay 2000x100us= 20s chứ không phải 1s.
          Tiếp theo ,về vấn đề thanh ghi pres_scaler ,mình không hiểu chế độ div _2,div_ 4 ảnh hưởng thề nào tới thời gian thực thi mỗi dòng lệnh,timer làm việc ra sao???Mình cũng có đọc chế độ hoạt động và xem block diagram mà chả hiểu gì cả.Mong các bạn giúp đỡ.Chúc vui
          Last edited by cuopbienquin; 22-08-2007, 05:24 PM.
          Sống trên đời cần phải có một tấm lòng.

          Comment

          • dtdat1909
            Đệ tử 1 túi
            • Jun 2007
            • 11

            #290
            không phải như bạn nghĩ đâu. mad thời gian định thời được tính theo công thức:
            t=4*256*prescaler/Fosc
            ở đây 4 hình như là số chu kỳ trong một lệnh đếm
            prescaler là tỷ lệ mà ta quy định cho Timer, nó được xem là clock cho timer khi timer đếm(tần số dùng để đếm cho Timer bằng OSC/prescaler).
            Fosc là tần số xung clock cung cấp cho mạch.
            khi viết rtcc_div_2 có nghĩa là: tần số cung cấp cho bộ đếm Timer0 bằng
            Fosc/2.

            Comment

            • cuopbienquin
              Đệ tử 2 túi
              • Jun 2007
              • 43

              #291
              Đây là mã code mình viết ngắt đơn giản cho LCD.Khi nhấn button 1(RB4) thì LCD hiển thị chữ 'X' dòng 1,button 2 thì LCD hiển thị dòng 2 chữ 'K'.Nhưng khi chạy thì nó bào lỗi ở dòng "void main(void)" là 'A numeric expression must be here'

              Code:
              =============================================================================*/
              #include <16F877A.h>
              #include <DEFS_16F877A.h>
              #fuses XT,NOWDT,NOPROTECT,NOLVP
              #use delay(clock=4000000)
              #define RS  RD0
              #define RW  RD1
              #define E   RD2
              #define LCD PORTC
              /*Ham yeu cau goi lenh dieu khien LCD*/
              void comnwrt(void)
              {
               RS = 0;
               RW = 0;
               E  = 1;
               E  = 0;
               delay_ms(1);
              }
              /*Ham yeu cau goi du lieu hien thi len LCD*/
              void datawrt(void)
              {
               RS = 1;
               RW = 0;
               E  = 1;
               E  = 0;
               delay_ms(1);
              }
              #int_RB
               void ngat_RB(void)
               {
                if(RBIE && RBIF)
                  {
                   if (RB4==0)
                    {
                    while(RB5==1)
                     {
                      LCD = 0x83;
                      comnwrt();
                      LCD = 'X';
                      datawrt();
                      
                     }
                    }
                   if (RB5==0)
                    {
                    while(RB4==1)
                     {
                      LCD = 0xC3;
                      comnwrt();
                      LCD = 'K';
                      datawrt();
                      
                     }
                    }
                  }
                 
                void main(void)
                  {
                   set_tris_b(0b01100000);
                   set_tris_c(0);
                   set_tris_d(0);
                   LCD = 0x38;      //   Hai hang, ma tran dot 5*7, 8 bit interface
                   comnwrt();
                   LCD = 0x0C;      //   Bat hien thi, tat con tro
                   comnwrt();
                    while(true)
                    {
                    }
                  }
              Last edited by namqn; 29-08-2007, 10:52 PM.
              Sống trên đời cần phải có một tấm lòng.

              Comment

              • namqn
                Trưởng lão PIC bang
                • Feb 2006
                • 3020

                #292
                Khi chạy chương trình đó bạn nhận được thông báo lỗi đó? Thông báo lỗi đó xuất hiện ở đâu?

                Nếu bạn chạy chương trình với phần cứng của bạn theo cách thông thường, chỉ có bộ vi điều khiển và LCD, bộ phận hiển thị duy nhất mà bạn có là màn hình LCD, làm cách nào bạn nhận được thông báo lỗi đó, khi LCD chưa hoạt động đúng.

                Tôi đoán là bạn muốn nói khi biên dịch chương trình thì nhận được thông báo lỗi đó. Bạn xem thử các ví dụ mẫu của CCS C để biết người ta khai báo main() ra sao. Bạn cũng kiểm tra lại code xử lý ngắt RB của bạn, dường như bạn đang thiếu một dấu '}'.

                Thân,
                Biển học mênh mông, sức người có hạn.

                Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
                http://www.picvietnam.com/forum/showthread.php?t=1263

                Comment

                • thaithienanh
                  Đệ tử 7 túi
                  • Jul 2006
                  • 189

                  #293
                  Tội nặng, nặng tội

                  Bạn phạm phải trọng tội rùi chắc hình phạt phải là "tử hình" thui đó mà

                  Lỗi của bạn là thiếu một dấu móc khoá "}" ở cuối hàm, ngay trên void main ấy thêm vào là OK

                  Lần này tha lần sau là tử hình thiệt đó nghen .
                  Thân.
                  _____________________________Tri nhân tri tự bất tri tâm_____________________________
                  _ _ _ _ _ _ _ _ Yêu mến tất cả anh em Picvietnam.com _ _ _ _ _ _ _ _
                  . . . . . . . . . . . . . . . . Để post đuợc một câu hỏi rõ ràng xin tham khảo link sau : . . . . . . . . . . . . . . .
                  . . . . . . . . . . . . . . . . . http://www.picvietnam.com/forum/showthread.php?t=1263. . . . . . . . . . . . . . . .

                  Comment

                  • cuopbienquin
                    Đệ tử 2 túi
                    • Jun 2007
                    • 43

                    #294
                    Cám ơn các bạn nhiều,mình đã biết sai rồi.Nhưng khi mô phỏng bằng Proteuss thì không như ý muốn,LCD cứ lặng thinh.Đây là mạch mô phỏng

                    code:#include <16F877A.h>
                    #include <DEFS_16F877A.h>
                    #fuses XT,NOWDT,NOPROTECT,NOLVP
                    #use delay(clock=4000000)
                    #define RS RD0
                    #define RW RD1
                    #define E RD2
                    #define LCD PORTC
                    /*Ham yeu cau goi lenh dieu khien LCD*/
                    void comnwrt(void)
                    {
                    RS = 0;
                    RW = 0;
                    E = 1;
                    E = 0;
                    delay_ms(1);
                    }
                    /*Ham yeu cau goi du lieu hien thi len LCD*/
                    void datawrt(void)
                    {
                    RS = 1;
                    RW = 0;
                    E = 1;
                    E = 0;
                    delay_ms(1);
                    }
                    #int_RB
                    void ngat_RB(void)
                    {
                    if(RBIE && RBIF)
                    {
                    if (RB4==0)
                    {
                    while(RB5==1)
                    {
                    LCD = 0x83;
                    comnwrt();
                    LCD = 'X';
                    datawrt();

                    }
                    }
                    if (RB5==0)
                    {
                    while(RB4==1)
                    {
                    LCD = 0xC3;
                    comnwrt();
                    LCD = 'K';
                    datawrt();

                    }
                    }
                    }
                    }

                    void main(void)
                    {
                    set_tris_b(0b00110000);
                    set_tris_c(0);
                    set_tris_d(0);
                    LCD = 0x38; // Hai hang, ma tran dot 5*7, 8 bit interface
                    comnwrt();
                    LCD = 0x0C; // Bat hien thi, tat con tro
                    comnwrt();
                    while(true)
                    {
                    }
                    }

                    Mình làm mạch này chủ yếu để hiểu cơ bản và tiếp tục làm phần kết hợp keypadphone và LCD ,mạch nhu cầu như sau

                    Mình cần :nhấn phím trên keypad thì LCD sẽ hiển thị trên LCD và khi nhấn button thì nó xóa một ký tự hiển thị .Mình có tham khảo source code trong CCS nhưng chả biết dùng như thế nào,đây là code ứng dụng:
                    #include <16F877.h>
                    #fuses HS,NOWDT,NOPROTECT,NOLVP
                    #use delay(clock=20000000)



                    #include <lcd.c>
                    #include <kbd.c>


                    void main() {
                    char k;

                    lcd_init();
                    kbd_init();

                    lcd_putc("\fReady...\n");

                    while (TRUE) {
                    k=kbd_getc();
                    if(k!=0)
                    if(k=='*')
                    lcd_putc('\f');
                    else
                    lcd_putc(k);
                    }
                    }
                    Last edited by cuopbienquin; 30-08-2007, 06:13 PM.
                    Sống trên đời cần phải có một tấm lòng.

                    Comment

                    • cuopbienquin
                      Đệ tử 2 túi
                      • Jun 2007
                      • 43

                      #295
                      Xin lỗi mình pót bài này mà không thấy bác nào trả lời giùm .Có lẽ do nhiều luồng mới quá nên các bác không để ý.Hôm nay mình post lại vậy.Mình có cuốn Interfacing PIC nhưng viết bằng ASM,mà mình thì đang cần C.Không biết bác nào có sách Interfacing PICmaf viết bằng C khồng nhỉ?
                      Sống trên đời cần phải có một tấm lòng.

                      Comment

                      • thaithienanh
                        Đệ tử 7 túi
                        • Jul 2006
                        • 189

                        #296
                        Bạn Cướp biển chuẩn bị chạy trước đi nhé, mình đã "lắp đạn vào súng" rùi đây này

                        Do bạn phạm các tội sau :
                        - Chưa khai báo cho phép ngắt RB ở void main : phải thêm vào đó 2 dòng : enable_interrupts(global);
                        enable_interrupts(int_RB);
                        - Ở trên mạch ứng dụng chẳng thấy điện trở treo lên nguồn đâu nữa

                        Tài liệu thì mình không có và rất ít đọc (do lười )

                        Nhưng góp ý thế này : muốn học từ Sample của CCS thì phải :

                        Bạn mở code cái Driver mà CCS hỗ trợ lên, đọc kỹ định nghĩa của các hàm mà Driver hỗ trợ (để khi dùng thì gọi ra trong chương trình), xem Driver đó sử dụng những chân nào của VDK, nối đúng chân mà dùng
                        _____________________________Tri nhân tri tự bất tri tâm_____________________________
                        _ _ _ _ _ _ _ _ Yêu mến tất cả anh em Picvietnam.com _ _ _ _ _ _ _ _
                        . . . . . . . . . . . . . . . . Để post đuợc một câu hỏi rõ ràng xin tham khảo link sau : . . . . . . . . . . . . . . .
                        . . . . . . . . . . . . . . . . . http://www.picvietnam.com/forum/showthread.php?t=1263. . . . . . . . . . . . . . . .

                        Comment

                        • cuopbienquin
                          Đệ tử 2 túi
                          • Jun 2007
                          • 43

                          #297
                          chà mình đã chuẩn bị chạy rồi .mình biết sau khi mình post bài mình đã thiếu yêu cầu như bạn comment và vẽ lại mạch mô phỏng như bạn nhắc nhở.Nhưng vẫn cứ lặng thinh.Mong bạn và các bạn trong diễn đàn chạy thử lại và test giùm mình như bạn đã nói,và cùng correct lại mạch và code như yêu cầu mình mong muốn xem sao.Còn về ứng dụng trong CCS ,rất phức tạp.Mình muốn tự mình lập trình theo yêu cầu ,post code xem mình sai đúng chỗ nào,để sữa lỗi và tiện học hỏi luôn như vạy dễ hiểu hơn.Mong các bạn thông cảm .Chúc vui
                          Sống trên đời cần phải có một tấm lòng.

                          Comment

                          • thaithienanh
                            Đệ tử 7 túi
                            • Jul 2006
                            • 189

                            #298
                            Đã test lại giúp bạn, tất cả đều ổn, mình gửi luôn cái hình để bạn xem lại, còn về code mình chỉ thêm đúng vào 2 câu mà mình đã nói ở trên
                            Attached Files
                            _____________________________Tri nhân tri tự bất tri tâm_____________________________
                            _ _ _ _ _ _ _ _ Yêu mến tất cả anh em Picvietnam.com _ _ _ _ _ _ _ _
                            . . . . . . . . . . . . . . . . Để post đuợc một câu hỏi rõ ràng xin tham khảo link sau : . . . . . . . . . . . . . . .
                            . . . . . . . . . . . . . . . . . http://www.picvietnam.com/forum/showthread.php?t=1263. . . . . . . . . . . . . . . .

                            Comment

                            • cuopbienquin
                              Đệ tử 2 túi
                              • Jun 2007
                              • 43

                              #299
                              Mình thật sự cảm ơn bạn thaithienthanh rất nhiều về vấn đề này.Mình đã làm lại và chạy ngon lành.Nhưng để thực tế hơn mình đã làm một cái keypadcalulate thay cho mấy cái button .Mạch như sau:

                              Code:#include <16F877A.h>
                              #include <DEFS_16F877A.h>
                              #fuses XT,NOWDT,NOPROTECT,NOLVP
                              #use delay(clock=4000000)
                              #define RS RD0
                              #define RW RD1
                              #define E RD2
                              #define LCD PORTC
                              /*Ham yeu cau goi lenh dieu khien LCD*/
                              void comnwrt(void)
                              {
                              RS = 0;
                              RW = 0;
                              E = 1;
                              E = 0;
                              delay_ms(1);
                              }
                              /*Ham yeu cau goi du lieu hien thi len LCD*/
                              void datawrt(void)
                              {
                              RS = 1;
                              RW = 0;
                              E = 1;
                              E = 0;
                              delay_ms(1);
                              }
                              #int_RB
                              void ngat_RB(void)
                              {
                              if(RBIE && RBIF)
                              {
                              //hang A
                              if ((RB0) && (RB4))
                              {
                              LCD = '7';
                              datawrt();


                              }
                              if (RB0 && RB5)
                              {

                              LCD = '8';
                              datawrt();


                              }
                              if (RB0 && RB6)
                              {

                              LCD = '9';
                              datawrt();


                              }
                              if (RB0 && RB7)
                              {

                              LCD = ':';
                              datawrt();


                              }
                              //Hang B
                              if ((RB1) && (RB4))
                              {
                              LCD = '4';
                              datawrt();


                              }
                              if (RB1 && RB5)
                              {

                              LCD = '5';
                              datawrt();


                              }
                              if (RB1 && RB6)
                              {

                              LCD = '6';
                              datawrt();


                              }
                              if (RB1 && RB7)
                              {

                              LCD = 'x';
                              datawrt();


                              }
                              //Hang C
                              if ((RB2) && (RB4))
                              {
                              LCD = '1';
                              datawrt();


                              }
                              if (RB2 && RB5)
                              {

                              LCD = '2';
                              datawrt();


                              }
                              if (RB2 && RB6)
                              {

                              LCD = '3';
                              datawrt();


                              }
                              if (RB2 && RB7)
                              {

                              LCD = '-';
                              datawrt();


                              }
                              //Hang D
                              if ((RB3) && (RB4))
                              {
                              LCD = 0x0C;
                              comnwrt();


                              }
                              if (RB3 && RB5)
                              {

                              LCD = '0';
                              datawrt();


                              }
                              if (RB3 && RB6)
                              {

                              LCD = '=';
                              datawrt();


                              }
                              if (RB3 && RB7)
                              {

                              LCD = '-';
                              datawrt();


                              }

                              }
                              }

                              void main(void)
                              {
                              set_tris_b(0b00001111);
                              set_tris_c(0);
                              set_tris_d(0);
                              portb=0;
                              portc=0;
                              portd=0;

                              enable_interrupts(global);
                              enable_interrupts(int_RB);
                              ext_int_edge(H_TO_L);
                              LCD = 0x38; // Hai hang, ma tran dot 5*7, 8 bit interface
                              comnwrt();
                              LCD = 0x0C; // Bat hien thi, tat con tro
                              comnwrt();

                              while(true)
                              {
                              }
                              }
                              Khi compile thì chương trình dịc ok nhưng khi mô phỏng mình lại thấy LCD tiếp tục đứng im .Hee, mong các bạn tiếp tục giúp đỡ cho trọn vẹn nha.
                              Mình làm về project này là để làm một cái smallcal có dạng như trên hình vẽ, mình cùng đang tìm hiểu thuật toán của nó,đây là thuật toán trong sách Interfacing PIC về các phép tình đơn giản:
                              Calculate result
                              IF key = ‘+’, Add
                              IF key = ‘-‘, Subtract
                              IF key = ‘x’, Multiply
                              IF key = ‘/’, Divide
                              Add Add Num1 + Num2
                              Load result, CALL Two digits
                              Subtract Subtract Num1 – Num2
                              IF result negative, load minus sign, CALL Display character
                              Load result, CALL Display character
                              Multiply
                              REPEAT
                              Add Num1 to Result
                              Decrement Num2
                              UNTIL Num2= 0
                              Load result, CALL Two digits
                              Divide
                              REPEAT
                              Subtract Num2 from Num1
                              Increment Result
                              UNTIL Num1 negative
                              Add Num2 back onto Num1 for Remainder
                              Load Result, CALL Display character
                              Load Remainder, CALL Display character
                              Two digits
                              Divide result by 10, load MSD, CALL Display character
                              Load LSD, CALL Display character
                              Mình viết bằng ASM thì được chứ còn CCS thì non tay lắm .Mong các bạn giúp đỡ mình hoàn thành project này.Cảm ơn nhiều.Chúc vui.
                              Attached Files
                              Last edited by cuopbienquin; 01-09-2007, 04:13 PM.
                              Sống trên đời cần phải có một tấm lòng.

                              Comment

                              • cuopbienquin
                                Đệ tử 2 túi
                                • Jun 2007
                                • 43

                                #300
                                Đã lâu rồi mà không thấy các bác trả lời giùm nhỉ.mình sốt ruột quá
                                Sống trên đời cần phải có một tấm lòng.

                                Comment

                                Working...