|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
03-05-2013, 05:37 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Mar 2013
Bài gửi: 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); |
06-05-2013, 05:24 PM | #2 |
Nhập môn đệ tử
|
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); } |
03-06-2013, 10:32 AM | #3 |
Nhập môn đệ tử
Tham gia ngày: Jan 2013
Bài gửi: 7
: |
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 ! |
|
|