Thông báo

Collapse
No announcement yet.

Lỗi delay với pic 16F1823

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • 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 ???

  • #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


    • #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


      • #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


        • #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


          • #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


            • #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


              • #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


                • #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


                  • #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


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

                      Comment


                      • #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


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

                          IRCF = 1101
                          SPLLEN = 0
                          SCS = 10

                          Comment


                          • #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


                            • #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...
                              X