Lỗi delay với pic 16F1823

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • hieu13
    Thành viên chính thức
    • Mar 2013
    • 34

    #1

    Lỗi delay với pic 16F1823

    Code:
    #include <16F1823.h>
    
    #FUSES NOWDT //No Watch Dog Timer
    #FUSES INTRC_IO //Internal RC Osc, no CLKOUT
    #use delay(clock=4000000)
    #use rs232(baud=9600, xmit=PIN_C3,rcv=PIN_C4)
    
    void main(){
       while(1){
          printf( "Test " );
          delay_ms(1000);
    
       }
    }
    Code chỉ đơn giản vậy thôi, sử dụng thạch anh nội, 4Mhz.
    Đáng lẽ Uarst nhận đc chữ "Test " sau mỗi giây, nhưng kết quả lại là nhận rất nhanh, trong 1s chắc nhận ít nhất 1 chục chữ "Test" lun.
    Mình nghĩ nếu sai về clock thì sao Uarst send đúng kết quả được, vậy tai sao lại sai ở Delay ???
  • hieu13
    Thành viên chính thức
    • Mar 2013
    • 34

    #2
    Hix, đang kẹt chỗ này, muốn tạo 1 cái delay khoảng 1s mà cứ bị sai quài, nó chạy rất nhanh.
    Nếu là sai clock thì đáng lẽ UARST nó phải chạy sai lun chứ nhỉ ???

    Comment

    • bqviet
      Linux zealot
      • Jun 2007
      • 6170

      #3
      Nó sai là đương nhiên. Biến đầu vào của hàm delay_ms() thuộc kiểu unsigned char - tức là 1 byte. Vậy thì giá trị của nó chấp nhận chỉ nằm trong dải 0-255. Khi truyền giá trị 1000 cho nó thì thực tế nó chỉ lấy byte thấp (giá trị tí tẹo), còn byte cao thì nó vứt đi. Từ đó dẫn tới chỉ trễ được tí tẹo.

      Đọc mã nguồn thấy bản chất delay_ms là macro chứ không phải function, vì thế trình biên dịch không kiểm tra được biến đầu vào có đúng hay không, có bị tràn hay không.

      Cách khắc phục : thay bằng 4 lần gọi
      delay_ms(250); delay_ms(250); delay_ms(250); delay_ms(250);
      Phần mềm tự do hoặc không dùng máy tính nữa !.

      Comment

      • hieu13
        Thành viên chính thức
        • Mar 2013
        • 34

        #4
        delay_ms (time)
        time - a variable 0-65535(int16) or a constant 0-65535

        Trong CCS rõ ràng là ghi 16bit mà. Với lại trước giờ e vẫn để delay 0.5s hoặc 1s bình thường.

        Comment

        • hoangdai
          Thành viên tích cực
          • Nov 2005
          • 2720

          #5
          E dùng pic ko nhiều nhưng việc khai báo để sài delay_ms thì đầu vào vẫn lớn hơn 255, ko biết e nhầm lẫn gì ko? Chỉ là thêm 1 trường hợp để xem xét. E thì ko dùng pic mấy.


          Add: 97 Quán Nam - Lê Chân - Hải Phòng.
          Tel: 031 518648 Phone: 0904 283 505

          Comment

          • hieu13
            Thành viên chính thức
            • Mar 2013
            • 34

            #6
            Em nghĩ chắc có lẽ sai do phần #Fuse ... vì Uarst chạy send KQ qua đúng, nhưng chỉ là nó send 1 cách quá nhanh, mà đáng lẽ phải là 1s thì 1 lần, cái này nó chạy vèo vèo lun >.<

            Comment

            • OpenDoor
              Thành viên tích cực
              • Apr 2011
              • 251

              #7
              Lỗi này có thể phát sinh do một số nguyên nhân khác như là:
              1. Nguồn cấp chưa ổn định nên PIC bị reset liên tục.
              2. Mạch reset chưa đúng.
              3. Đã NOWDT nhưng vẫn không ngoại trừ WDT vẫn còn hoạt động.

              Comment

              • hieu13
                Thành viên chính thức
                • Mar 2013
                • 34

                #8
                1.Nguồn cấp là nguồn USB, xài dòng rất thấp nên mình nghĩ là nguồn sẽ ổn định.
                2.Có lẽ là do phần Reset, mình dùng tụ 10uF( lúc trc hay xài 1uf, tiếc là do hết đúng lúc nên lấy 10uf thay vào ) nhưng mình nghĩ, như vậy lúc nạp xả, nó reset chậm hơn thôi chứ.
                3.Cái này thì mình ko rõ.

                Mình thay
                printf( "Test " ); bằng printf( "%u ",stt ); stt++;
                nó chạy 1 lèo từ 0 -> 255 ( rất nhanh ) thì có lẽ chắc ko phải là do WDT đâu nhỉ ???

                Comment

                • hieu13
                  Thành viên chính thức
                  • Mar 2013
                  • 34

                  #9
                  Bây giờ thì nó thật sự có vấn đề rồi.
                  Mạch này chỉ đơn giản là PIC -> PL2303 -> PC

                  Code:
                  #include <16F1823.h>
                  
                  #FUSES NOWDT //No Watch Dog Timer
                  #FUSES INTRC_IO //Internal RC Osc, no CLKOUT
                  #use delay(clock=4000000)
                  #use rs232(baud=9600, xmit=PIN_C3,rcv=PIN_C4)
                  
                  void main(){
                     while(1){
                        printf( "%u ",stt );
                        stt++;
                        delay_ms(1000);
                  
                     }
                  }
                  Code chỉ có vậy. Cắm mạch vào PC (win7) nó find 2 new device : USB to COM và Microsoft Serial mouse. Kể từ lúc đó chuột nó chạy ko như ý mình nữa

                  Comment

                  • hieu13
                    Thành viên chính thức
                    • Mar 2013
                    • 34

                    #10
                    Ah wên nữa, E đã them vào khoảng 5-6 cái delay_ms(1000) nhưng có vẽ tốc độ send ko giảm bớt chút nào, có khi nào lệnh delay_ms ko chạy ko ???

                    Comment

                    • OpenDoor
                      Thành viên tích cực
                      • Apr 2011
                      • 251

                      #11
                      Em tự viết 1 hàm delay và điều khiển LED xem có được không.

                      Comment

                      • hieu13
                        Thành viên chính thức
                        • Mar 2013
                        • 34

                        #12
                        Đúng là sau khi cho vài chục vòng lặp for(...) thì tốc độ send đã giảm bớt, vậy kết luận là hàm delay_ms() ko chạy. Vậy rốt cục là sao, chẵng lẽ CCS cho 16F1823 ko chạy hàm delay_ms() được. Test với các loại PIC khác, delay vẫn bình thường.

                        Comment

                        • trimen
                          Thành viên tích cực
                          • Nov 2009
                          • 189

                          #13
                          bạn thử set những bit của thanh ghi OSCCON xem sao :

                          IRCF = 1101
                          SPLLEN = 0
                          SCS = 10

                          Comment

                          • queduong
                            Moderator
                            • Jul 2005
                            • 6781

                            #14
                            vì sử dụng dao động nội thay vì #use delay(clock= 4000000) bạn có thể thử với #use delay(internal = 4000000).

                            Bạn sử dụng CCS phiên bản bao nhiêu vậy ?
                            Tôi không sài CCS nhiều nhưng vừa test thử code của bạn trên bản 5.11 và proteus thấy nó chạy tốt
                            Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                            Comment

                            • duong_act
                              Thành viên tích cực
                              • Nov 2008
                              • 4903

                              #15
                              Tôi thấy trong datasheet nó ghi là :
                              "31KHz Low - Power Internal Osillator"
                              Có thể bạn nhầm và bạn biết laf 4MHz nó khác 31KHz như thế nào. Có thể UART phần mềm khởi tạo bằng giá trị mặc định trong header file ( vì đây dùng dao động nội khác với HS thông thường ) nên vẫn OK nhưng delay thì tính theo #use delay.

                              Comment

                              Về tác giả

                              Collapse

                              hieu13 Tìm hiểu thêm về hieu13

                              Bài viết mới nhất

                              Collapse

                              Đang tải...