CCS C for PIC16F877A

Collapse
This topic is closed.
X
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • sandro_bk
    Đệ tử 4 túi
    • Jul 2007
    • 66

    #271
    chào các bạn mình mới học pic nên chưa biết nhiều mong được sự giúp đỡ,
    tui có vài câu hỏi mong được chỉ giáo
    tui sử dụng ngắt timer nhưng thấy lệnh
    set_timer0(); ko có tác dụng nghĩa là đặt số mấy cũng ko thấy thay đổi
    thậm chí ko có lệnh đó vẫn chạy như thường
    bạn nào làm ngắt timer rùi chỉ mình với
    Code:
    #include <18F4331.h>
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=4000000)
    
    int i=0;
    void main()
    {
    	setup_timer_0(rtcc_div_32);
            set_timer0(10);   ????nếu đặt 1 thì bao lâu mới ngắt
    	enable_interrupts(int_rtcc);
    	enable_interrupts(global);
    	while(true)
    	{
    	}
    }
    
    #int_rtcc
    void ngat_timer()
    {
    	i++;
    	output_D(i);
    	
    }
    cấu hỏi thứ 2 là khi giao tiếp máy tính mình truyền từ PC đến pic
    dùng lệnh getc(); thì chỉ thu được 1 kí tự
    ví dụ truyền số 12 thì thu được 2 số 1 và 2
    có bạn nào biết lệnh nào để lấy 1 chuỗi ko?
    Last edited by namqn; 18-07-2007, 05:48 PM.

    Comment

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

      #272
      Về timer 0 và hàm set_timer0(), bạn đọc thêm tài liệu hướng dẫn của CCS C (trang 206, ver. 4, 01/2007) và datasheet của chip.

      Về getc(), nếu bạn dùng nó thì tất nhiên chỉ lấy được 1 ký tự là nó đã trở về. Bạn đọc thêm về hàm gets() trong tài liệu hướng dẫn của CCS C (đã nêu trên, trang 148) để đọc 1 chuỗi ký tự.

      Nếu bạn chưa biết tài liệu đó lấy ở đâ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

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

        #273
        cho em hỏi cái bài LCD ở trên mà em đã hỏi ý ạ.em đã cho hiển thị được rùi, nhưng :
        khi chạy lượt đầu tiên thì nó bị mất 1 kí tự đầu tiên,ở cả 2 hàng luôn.và chạy lượt sau nó ko bị mất,đúng như lập trình.
        em đã khai báo 0x80 và 0xc0 cho 2 hàng ạ

        Comment

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

          #274
          Nguyên văn bởi anh_gioi View Post
          cho em hỏi cái bài LCD ở trên mà em đã hỏi ý ạ.em đã cho hiển thị được rùi, nhưng :
          khi chạy lượt đầu tiên thì nó bị mất 1 kí tự đầu tiên,ở cả 2 hàng luôn.và chạy lượt sau nó ko bị mất,đúng như lập trình.
          em đã khai báo 0x80 và 0xc0 cho 2 hàng ạ
          Mất theo kiểu nào vậy bạn? Không hiển thị ra ở vị trí đó hay là những ký tự nằm cùng hàng bị dịch qua bên trái một vị trí hay là hiển thị sai ở vị trí đó?

          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

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

            #275
            dạ .LCD quét lần đầu tiên nó bị dịch sang trai 1 ki tu.(như : ANH_GIOI thì nó còn NH_GIOI).quét lần thứ hai thì nó ko bị mất như trên nữa.
            e bị mất cả 2 hàng luôn mới đau chứ

            Comment

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

              #276
              Nguyên văn bởi anh_gioi View Post
              dạ .LCD quét lần đầu tiên nó bị dịch sang trai 1 ki tu.(như : ANH_GIOI thì nó còn NH_GIOI).quét lần thứ hai thì nó ko bị mất như trên nữa.
              e bị mất cả 2 hàng luôn mới đau chứ
              Hiện tượng này có nhiều khả năng là do thuật toán của bạn, lượt chạy đầu tiên con trỏ của chuỗi ký tự bị sai chẳng hạn. Bạn kiểm tra lại thuật toán của chương trình. Ở đầu vòng lặp chính nên có lệnh đặt giá trị cho con trỏ dùng để truy xuất chuỗi ký tự.

              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

              • nguyen.geo
                Đệ tử 2 túi
                • Jan 2007
                • 27

                #277
                Nguyên văn bởi anh_gioi View Post
                dạ .LCD quét lần đầu tiên nó bị dịch sang trai 1 ki tu.(như : ANH_GIOI thì nó còn NH_GIOI).quét lần thứ hai thì nó ko bị mất như trên nữa.
                e bị mất cả 2 hàng luôn mới đau chứ
                Ban ơi theo mình thì bạn hãy đặt giá trị trễ thêm 1 tí nữa là được thôi mình cũng đã gặp trường hợp nảy rồi lỗi này thường xuất hiện với các câu lệnh như là xóa màn hình, về đầu dòng, dịch con trỏ. Thưởng thì mình đặt trễ sau xóa màn hình 2ms, sau lệnh chức năng khác cho LCD ( Trường hợp RS = 0) là 10 us thì nó làm việc bình thường.các lệnh hiển thị dữ liệu thì không cần. Bạn thử theo cách của mình nhé. chúc bạn thành công !

                Comment

                • tuanta
                  Nhập môn đệ tử
                  • Jul 2007
                  • 1

                  #278
                  Lỗi với chân RB3

                  Xin chào,

                  Mình đang sử dụng con PIC16F873A, chương trình viết trên CCS C. Mình gặp một lỗi rất khó hiểu là khi làm việc với portB, có duy nhất chân RB3 là mình không sao điều khiển được. Chẳng hạn mình dùng lệnh output_high(PIN_B3) thì không bao giờ nó High cả. Mạch test mình làm cũng rất đơn giản, giống như mạch của NHH post thôi. Mình đã nghĩ là do con PIC của mình nó hỏng riêng chân đấy, nên mình đã thử mua mấy con PIC16F873A khác về dùng, tình trạng vẫn hệt như vậy. Sau đó mình lại tiếp tục thử bằng cách chuyển sang con PIC16F876A xem sao, thì lỗi gặp cũng y hệt! Xin mọi người lời khuyên.

                  (Mạch nạp mình dùng là Galep-4).
                  Nguyên văn bởi nhh View Post
                  Chào cả nhà!

                  Để lập trình cho PIC, mọi người có thể chọn cho mình những ngôn ngữ lập trình khác nhau như ASM, CCS C, HT-PIC, pascal, basic,...
                  Với nhh, đầu tiên tìm hiểu và viết chương trình cơ bản bằng ASM để hiểu rõ cấu trúc sau đó thì viết bằng CCS C cũng viết lại những cái cơ bản và đi dần lên, tốc độ lúc này nhanh hơn khi viết bằng ASM rất nhiều.

                  Khi viết bằng CCS C thông thường thì dịch ra file.hex có dài hơn so với khi viết bằng ASM. Hai ngôn ngữ CCS C và HT-PIC được ưa chuộng hơn cả, CCS C dễ học,gần gũi với ASM còn HT-PIC là dạng ANSI C.

                  Để lập trình và biên dịch CCS C, dùng chương trình PIC C Complier,sau khi soạn thảo các bạn ấn F9
                  để dịch,nếu thành công sẽ có thông báo như sau:



                  Ngoài ra, để xem code ASM như thế nào,sau khi dịch bạn chọn mục C/ASM List như hình dưới đây:



                  Link download trình biên dịch CCS C ở đây: http://www.tailieuvietnam.net/downlo...CCSC_3.249.rar
                  Phiên bản mới hơn tải tại: www.kho.tailieuvietnam.net, vào Download Home > Điện tử tàn thư > Vi điều khiển - Vi xử lý - PLC

                  Chúng ta cùng nhau tìm hiểu lần lượt các phần sau:

                  1.I/O + Delay
                  2.Timer và ngắt Timer
                  3.Ngắt ngoài
                  4.ADC, PWM,... (tập trung mổ xẻ nhiều)
                  5......

                  Tạm thời cứ như vậy đã, sau này sẽ tính tiếp!
                  Nào,chúng ta bắt đầu thôi!
                  Nguyên văn bởi nhh View Post
                  Chương trình này làm nhấp nháy con led ở chân RB0 1s sáng, 1s tắt.
                  Code:
                  #include<16F877A.h>
                  #fuses NOWDT,PUT,HS,NOPROTECT
                  #use delay(clock=10000000)
                  main()
                  {
                  while(true)
                  	{
                  	output_high(PIN_B0);
                  	delay_ms(1000);
                  	output_low(PIN_B0);
                  	delay_ms(1000);
                  	}
                  }
                  Trên đây:
                  Code:
                  #include<16F877A.h>
                  Khai báo con PIC bạn sử dụng, file này chương trình viết sẵn nhằm khai báo các bit, thanh ghi quan trọng trong con pic này.Các bạn có thể vào thư mục cài đặt C:\Program Files\PICC\Devices\16F877A.h để xem nó khai báo được những gì trong đó!
                  Code:
                  #fuses NOWDT,PUT,HS,NOPROTECT
                  Thiết lập các config
                  Code:
                  #use delay(clock=10000000)
                  Khai báo tần số dao động cấp cho PIC
                  Code:
                  output_high(PIN_B0)
                  Xuất ra chân RB0 mức logic 1 (tức 5V), do khi thực hiện hàm này đã bao hàm luôn việc tác động lên thanh ghi TRISB (dùng chọn chân I/O) do vậy ta không cần viết lệnh chọn chân I/O nữa.
                  Code:
                  output_low(PIN_B0)
                  Ngược lại
                  Code:
                  delay_ms(1000)
                  Tạo trễ khoảng thời gian theo mili giây là 1000 (tức 1s)
                  Chú ý hàm này chỉ có tác dụng khi có khai báo tần số dao động cấp cho PIC

                  Và bây giờ thử làm cho tất cả 8 led nối với portB chớp tắt 1s xem nào!Phải chăng ta sẽ làm như sau (Viết trong vòng lặp while):
                  Code:
                  {
                  output_high(PIN_B0);
                  output_high(PIN_B1);
                  output_high(PIN_B2);
                  output_high(PIN_B3);
                  output_high(PIN_B4);
                  output_high(PIN_B5);
                  output_high(PIN_B6);
                  output_high(PIN_B7);
                  delay_ms(1000);
                  output_low(PIN_B0);
                  output_low(PIN_B1);
                  output_low(PIN_B2);
                  output_low(PIN_B3);
                  output_low(PIN_B4);
                  output_low(PIN_B5);
                  output_low(PIN_B6);
                  output_low(PIN_B7);
                  delay_ms(1000);
                  }
                  Viết như thế này thì quá dài và thiếu chính xác nữa, có cách nào khác hay hơn không ? Sao ta không xuất đẩy hẳn portB lên mức cao,tạo trễ 1s rồi ép cho nó xuống mức thấp,tạo trễ 1s cùng một lúc nhỉ !
                  Bài tiếp theo sẽ đưa ra câu trả lời....

                  Comment

                  • picpicpic
                    Đệ tử 2 túi
                    • Jan 2006
                    • 36

                    #279
                    Bạn chú ý chân RB3 là chân cực thu hở, muốn sử dụng, bạn mắc thêm 1 điện trở kéo lên.
                    ************************************************** **
                    The only wrong thing would be to deny what your heart truly feels!
                    ************************************************** **

                    Comment

                    • c828
                      Nhập môn đệ tử
                      • Jan 2006
                      • 1

                      #280
                      chào các Bác mình mới học ccs c được vài ngày nhưng khi viết ct hiển thị trên 2 led 7 doan và mô phỏng trên proteus thì không được, mong các bác cho em đoạn code. cám ơn
                      Chỉ có thuyền mới hiểu...!!!!!!

                      Comment

                      • sphinx9
                        Nhập môn đệ tử
                        • Jun 2007
                        • 1

                        #281
                        mấy anh cho em hỏi xíu ạ tại seo khi em xài các lệnh
                        trisb=0;
                        rb0=1;
                        rb1=1;
                        rb2=1;
                        rb3=1;
                        hoặc các lệnh:
                        output_high(pin_b0);
                        output_high(pin_b1);
                        output_high(pin_b2);
                        output_hgh(pin_b3);
                        mà nếu em gắn ở các chân đó là led thì nó sáng lần lược ở rb0 rb1 rb2 rb3 chứ nó ko sáng ở cả 4 chân bật debug của protus lên thì
                        trisb=0b11110000 : cái này thì đúng rùi
                        portb=0b00001000 : còn cái này seo kì wá
                        nhưng nếu em lắp vào đó dộng cơ thì lại khác em lắp vào rb0 động cơ ocn2 mấy cái kia là led thì động cơ way led ở rb3 sáng còn ở rb1 rb2 tắt
                        nhưng nếu em xài lệnh
                        portb=0b00001111; thì nó lại sáng bình thường
                        mấy anh giải thích giùm em với
                        cám ơn

                        Comment

                        • dvnccbmacbt
                          Đệ tử 4 túi
                          • May 2007
                          • 65

                          #282
                          Chào mọi người! Em có 1 thắc mắc muốn hỏi : Với ngắt RB4-7 thì dòng lệnh ext_int_edge( H_to_L ) hình như không có tác dụng. Em thử bỏ hoặc thay thế bằng ( L_to_H ) thì thấy không có thay đổi gì. Hình như mặc định là H_to_L . Em có đọc trong datasheet PIC18f4550 thì chỉ thấy nói đến chọn cạnh lên xuống ở ngắt ngoài RB0, còn ở RB4-7 thì không thấy nói rõ. Em không hiểu rõ chỗ này. Mong mọi người chỉ bảo.

                          Comment

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

                            #283
                            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.
                            Last edited by namqn; 15-08-2007, 04:44 PM.
                            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

                              #284
                              Ui sao hông có anh nào replay luồng này hết vậy

                              To @c828 : việc quét 2 led rất đơn giản, chắc là do bạn chưa nắm đuợc quét led là gì rồi, bây giờ mình sẽ cho bạn một ví dụ cơ bản nhất về quét led (có kèm file Proteus và notepad), sau đó thì bạn nghiền ngẫm code khoảng vài phút chắc sẽ hiểu thui

                              To @sphinx9 : Cách diễn giải câu hỏi của bạn hơi khó hiểu một chút nhưng mình cũng loáng thoáng hiểu đuợc và xin trả lời là : đó là điểm yếu của Proteus nên không cần thắc mắc và cũng không thể giải thích (mình nói thật đó đừng nghe giọng văn trả lời cụt ngủn mà hiểu lầm nhá )

                              To @dvnccbmacbt : Ngắt RB dùng để ghi nhận sự kiện "có sự thay đổi bất kỳ" trên các chân từ RB4 đến RB7 cho nên việc chọn sườn ngắt không có vai trò ý nghĩa ở đây

                              To @cuopbienquin : ADC = Analog Digital Convert như vậy ý nghĩa của nó là một bộ chuyển đổi từ tín hiệu "tương tự" sang giá trị "số" tương ứng. Tuỳ vào việc lựa chọn điện áp tham chiếu và độ phân giải mà giá trị cho ra sẽ khác, ví dụ khi ta lựa chọn là ADC=8 và Vref = 5V thì khi đó nếu tín hiệu đưa vào bộ ADC là 5V thì giá trị số trả ra là 11111111 (8bit) = 255, công thức tổng quát lúc này sẽ là :
                              Value (giá trị "số") = 255 (max value của 8 bit) * X (tín hiệu đưa vào) / 5 (Vref)
                              Bạn tham khảo thêm tại bài trước nhá link đây :
                              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

                                #285
                                PWm là bộ điều chế đọ rộng xung.Mình đang tìm hiểu cái module này nó hoạt độnh ntn?Mình đã đọc tổng quan về nó là dùng để điều khiển động cơ như tốc độ,tần số..
                                Mình muốn hiểu rõ hơn cấu trúc mạch ntn trong VDK PIC,kết nối với động cơ ra sao.BẠn nào đã tìm hiểu rồi thì hướng dẫn gíp mình nha.Mình đang rất cần.Chúc vui
                                Sống trên đời cần phải có một tấm lòng.

                                Comment

                                Working...