PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Hỏi code đọc encoder bằng timer0 pic16f887 (http://www.picvietnam.com/forum/showthread.php?t=32197)

skyline0808 03-05-2013 05:37 PM

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 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 !


Múi giờ GMT. Hiện tại là 02:41 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam