Hỏi code đọc encoder bằng timer0 pic16f887

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • skyline0808
    Nhập môn đệ tử
    • Mar 2013
    • 1

    #1

    Hỏi code đọc encoder bằng timer0 pic16f887

    Mình có viết code đọc encoder bằng timer0 của pic16f887 bằng CCS, k biết sai chỗ nào mà không chạy được. Có ai biết chỉ mình với

    CODE CUA MINH NHƯ SAU:
    signed int32 encoder1 = 0;

    void interrupt_timer0(void)
    {
    if ( RA5 == 0 ) // chan B encoder 2 (RB5) xuong 0
    encoder1 ++;
    else encoder1 --;
    }

    Phần khởi tạo ngắt như sau:
    TRISA = 0b111111; // PORTA là ngõ vào
    PORTA = 0B000000; // khai báo trạng thái bang đầu của portA
    setup_timer_0 (T0_DIV_2|T0_EXT_H_TO_L); // Timer0 is Counter, ngắt cạnh xuống
    enable_interrupts(int_timer0);
    set_timer0(0);
    enable_interrupts(GLOBAL);
  • phamquocgia
    Nhập môn đệ tử
    • Jan 2010
    • 8

    #2
    code này hình như sau 256*2 = 512 xung thì timer 0 mới tràn. lúc đó nó mới tính biến encoder1 +1 hay -1.
    Bạn nên dùng ngắt ngoài RB0 hoặc ngắt port B để đọc encoder cho dễ!
    ví dụ ngắt ngoài( chân A encoder nối với RB0)
    #include <16f887.h>
    #device *=16
    #use delay(clock=20000000)
    #fuses HS
    int count;
    #int_EXT
    void EXT_isr(void)
    {
    count++;
    }
    void main()
    {
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_EXT);
    }

    Comment

    • trungsonkmt
      Nhập môn đệ tử
      • Jan 2013
      • 7

      #3
      Sai khi đếm xung như bạn phamquocgia đã viết thì bạn thiết lập timer để lấy denta T để tính vận tốc như thế này :

      #include <16f877a.h>
      #FUSES HS,NOWDT,NOPROTECT,NOLVP
      #use delay(clock=20M)

      #INT_TIMER0
      void ngat_timer()
      {
      //Khoi dong lai timer
      set_timer0(<so nao do>);//số này tùy bạn chọn để có đc denta T như mong muốn
      // sau đấy là gì thì làm ở đây
      // Ví dụ như : lấy số xung đếm được làm vận tốc thực theo khoảng denta T này
      }

      void main()
      {
      //Khai báo vào / ra....
      ...
      //Thiết lập timer0
      enable_interrupts(global); //Cho phep ngat toan cuc
      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);//chon xung nội và chia tần 256
      enable_interrupts(INT_TIMER0);//Cho phep ngat Timer 0
      set_timer0(<so nao do>);//số này tùy bạn chọn để có đc denta T như mong muốn
      ...
      //Tiếp tục các việc khác ở đây


      }

      // Biết thế . HẾT !

      Comment

      Working...