Mình vẫn chưa giả qứyt6 được chỗ đếm xung, đó là do trục quay chậm( khoảng >0.5s/vòng) nên xảy ra trường hợp là khi có tín hiệu 0 tồn tại khoảng vài trăm ms(có lẽ vậy) nên số xung đếm không đúng, vị dụ mình xuất ra led giá trị xung đếm được, thì khi có tín hiệu xung thì giá trị xuất ra rất lớn.Mình muốn viết sao cho khi giá trị xung xuống 0 thì chỉ tăng biến đếm lên 1 giá trị, nhưng vẫn chưa ổn.Mình đã dùng timer0 ở chế độ counter, timer1 định thì nhưng giá trị biến đếm vẫn tăng liên tục.
Chương trình sau mình viết để hiển thị giá trị của biến đếm của timer0 sau mỗi 5s, tuy nhiên giá trị hiển thị lớn hơn giá trị thực rất nhiều, không hiểu tại sao.Mình dùng chân RA4 để đọc xung :
#include <16F877A.h>
#priority EXT,TIMER1,timer0
#fuses NOWDT,PUT,XT,NOPROTECT,NOLVP,HS
#device *=16
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(d)
#byte porta=0x05
#byte portb=0x06
#byte portd=0x08
unsigned char led1,led2,led3;
int16 count=0 ;
int16 int_count1;
int32 x=0;
int32 sovong;
void convert_bcd(int32 x);
#define INTS_PER_SECOND1 95 //ngat sau moi 5s
#int_timer0
void interrupt_timer0()
{
++count;
}
#INT_TIMER1 // Chuong trinh ngat Timer 1
void Timer11_isr() // Ham duoc goi khi TImer1 tran (65535->0)
{ // Xap xi 19 lan / giay
if(--int_count1==0)
{
int_count1 = INTS_PER_SECOND1;
sovong = get_timer0();
count = 0;
set_timer0(0);
}
}
void init()
{
int_count1 = INTS_PER_SECOND1;//19 lan 1 giay
setup_timer_0 (RTCC_DIV_1|RTCC_EXT_H_TO_L); // Timer0 is Counter
set_timer0(0);
set_timer1(0);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); // Timer1 is Timer
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
count = 0;
}
void convert_bcd(int32 x)
{
led1 = x / 100;
x = x %100;
led2 = x / 10;
led3 = x % 10;
{
char maled7[] = {0x7e,0x18,0xec,0xe6,0xd2,0xb6,0xbe,0x62,0xfe,0xf6 };
portb = (maled7[led3]); output_low(PIN_D5); delay_us(90); output_high(pin_D5);
portb = (maled7[led2]); output_low(PIN_D6); delay_us(90); output_high(pin_D6);
portb = (maled7[led1]); output_low(PIN_D7); delay_us(90); output_high(pin_D7);
}
}
void main(void)
{
init();
set_tris_a(0xFf);
set_tris_b(0x00);
set_tris_d(0x00);
// khoi tao gia tri
sovong=0;
while(true)
{
x=sovong;
convert_bcd(x);
}}
|