سلام.
برای محاسبه فرکانس سیگنال متصل به میکرو من از وقفه خارجی صفر و وقفه تایمر صفر استفاده کردم و توی قسمت وقفه ان یه شمارش گر گذاشتم که هنگامی که لبه بالارونده سیگنال خارجی رخ داد یکی بشمارد و برای قطع برنامه هنگامی که این شمارش گر برابر با 2 شد وقفه عمومی را قطع کند.
توی برنامه این شمارشگر برای یه سری از فرکانس ها چند تا از اعداد را نمی شمارد مثلا بعد از 1 میره 4 و یا اینکه پرشی می شمارد مثلا 1، 14، 28 و ....
چرا این اتفاق رخ می دهد و چه طور میشه رفعش کرد؟
کد:
#define xtal 8000000#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#include <lcd.h>
unsigned long int counter=0;
unsigned long int end=0;
int off=0;
#asm
.equ __lcd_port = 0x1b;
#endasm //connect LCD to IC
interrupt [EXT_INT0] void external_signal_starting(void)
{
TCCR0=0x02;
// MCUCR=0b00001000;
//GICR=0b10000000;
PORTB.1^=1; end=end+1;
}
interrupt [TIM0_OVF] void count(void)
{
TCNT0=0b10011100;
counter=counter+1;
PORTB.0^=1;
}
interrupt [EXT_INT1] void external_signal_ending(void)
{
//MCUCR=0b00000011;
//GICR=0b01000000;
PORTB.1^=1;
//off=off+1;
}
void main()
{
char buffer[15];
MCUCR=0b00001011;
GICR=0b11000000;
TCCR0=0x00;
TCNT0=0b10011100;
DDRA=0xff;
DDRD=0x00;
DDRB=0xff;
//PORTB=0xFF;
TIMSK=0x01;
#asm("sei");
while(1)
{
// if (off==2) { GICR=0x00; TCCR0=0x00;}
if (end=2) #asm("cli");
lcd_gotoxy(0,0);
sprintf(buffer,"NUMBER %2d",end);
lcd_init(16);
lcd_clear();
lcd_gotoxy(0,1);
lcd_puts (buffer);
}
}