Ðăng Nhập

View Full Version : Hỏi code đọc encoder bằng timer0 pic16f887


skyline0808
03-05-2013, 05:37 PM
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
06-05-2013, 05:24 PM
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);
}

trungsonkmt
03-06-2013, 10:32 AM
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 !