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

đếm ngoài dùng timer0

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • p2009kc
    Nhập môn đệ tử
    • Jun 2009
    • 6

    #1

    đếm ngoài dùng timer0

    Em mới n/cứu về PIC, khi viết c.trình dùng timer để đếm nhưng không được, em cũng không biết code sai ở đâu nữa. Các bác chỉ giúp em với, các bác thông cảm em vẫn còn gà lắm.
    Code em viết như sau:
    Code:
    #include <16F877A.h>
    #fuses NOWDT,PUT,XT,NOPROTECT
    #use delay(clock=4000000)
    #byte PORTB = 0x06
    int8 leds;
    
    #int_timer0
    void interrupt_timer0()
    {
       set_timer0(0);
       ++leds;
       if(leds == 255)
          {
             leds=1;
           }
    }
    
    void main(void)
    {       enable_interrupts(global);
            enable_interrupts(int_timer0);
            setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2);
            set_timer0(0);  
            leds=1;
             while (1)
                {
                   PORTB=leds;
                }
    }
    Mạch điện có 8 leds đấu vào cổng B, xung 1Hz bên ngoài đưa vào RA4.
    Last edited by namqn; 09-06-2009, 11:10 PM. Lý do: định dạng code
  • Mr.Bi
    Đệ tử 7 túi
    • Jul 2007
    • 188

    #2
    u nhầm oy , khai báo trên của u là timer0 làm bộ counter . Có phải í u là
    + vô ngắt timer0 thì biến leds tăng
    + ra hàm chính sẽ lấy giá trị leds đó xuất ra PORTB ?
    Nếu vậy thì phải khai báo lại chỗ này setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2);

    Comment

    • phamhoangthong
      Nhập môn đệ tử
      • Oct 2007
      • 6

      #3
      u sai chổ này nè ! biến led của em chỉ tăng sau 256 second ! Có phải khi có 1 clock vào thì giá trị bộ counter của timer0 tăng lên 1. Nhưng khi giá trị bộ counter là 256 thì interrupt_timer mới thực hiện => portB tăng theo chu kỳ 1/256 Hz

      Comment

      • p2009kc
        Nhập môn đệ tử
        • Jun 2009
        • 6

        #4
        Cám ơn bác Mr.Bi và bác phamhoangthong nhưng em sửa vẫn không được. Ý của em như bác Mr.Bi đã nói nhưng bác bảo sửa setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2); thành gì? Còn như bác phamhoangthong nói vậy thì sau 256 second thì led phải sáng nhưng ở đây không thấy gì các bác ạ.
        Các bác giúp em nhé vì em thực hiện trên cả mô phỏng và mạch đều không được.

        Comment

        • lequocbao
          Đệ tử 6 túi
          • Oct 2008
          • 137

          #5
          xung 1hz thì cần gì phải dùng tới timer0 hả bạn?dùng đại chân io bình thường là tốt rùi!

          bạn thử thêm:
          set_tris_a(0xff);
          set_tris_b(0x00); thử coi.
          set_timer_0(0); xung vào *2 vậy là có 128 xung 1hz (tương đương 128s)vào chân ra4 thì xảy ra ngắt.

          còn không được thì bỏ quách thằng |RTCC_DIV_2 đi(hình như là dùng ở chế độ counter không có tiết mục này).
          bạn muốn cứ có 1 xung thì xảy ra ngắt thì bạn phải set_timer_0(255); chứ bạn!
          Last edited by lequocbao; 10-06-2009, 06:42 PM.
          A&A

          Comment

          • p2009kc
            Nhập môn đệ tử
            • Jun 2009
            • 6

            #6
            Cám ơn bác lequocbao nhiều, em đã làm được rồi, nguyên do đúng như bác, nói do em thiếu: set_tris_a(0xff); set_tris_b(0x00); phải set_timer_0(255); để đúng 1 second thì phải set_timer_0(255);
            Trước đó em đã thử ngắt trên R0 thì đã OK rồi.

            Comment

            • p2009kc
              Nhập môn đệ tử
              • Jun 2009
              • 6

              #7
              Cám ơn bác lequocbao nhiều, em đã làm được rồi, nguyên do đúng như bác nói do em thiếu: set_tris_a(0xff); set_tris_b(0x00); phải set_timer_0(255); để đúng 1 second thì phải set_timer_0(255);
              Trước đó em đã thử ngắt trên R0 thì đã OK rồi.

              Comment

              Working...