MENTIONED BELLOW IS MY PROGRAM FOR FREQUENCY COUNTER USING INT MAIN() FUNCTION FREQUENCY COUNTING IS GOOD BUT NOT ABLE TO INSERT OTHER FEATURES IN IT AND FACING MANY ISSUES WHILE HANDELING THAT....
I TRIED IT CONVERTING IT INTO VOID SETUP AND VOID LOOP FUNCTION FORM BUT I AM NOT GETTING THE CORRECT FREQUENCY CAN ANYBODY HELP ME OUT IN THIS'
volatile uint16_t timerOverflow = 0; // Timer1 Overflows
volatile uint16_t Start= 0, End = 0; //
volatile uint16_t update1 = 0; // Flag
volatile uint16_t count = 0;
double freq = 0.0, freq1 = 0.0;
void InitTimer1(void)
{
TCNT1=0; //SETTING INTIAL TIMER VALUE
TCCR1B|=(1<<ICES1); //SETTING FIRST CAPTURE ON RISING EDGE ,(TCCR1B = TCCR1B | (1<<ICES1)
TIMSK1|=(1<<ICIE1)|(1<<TOIE1); //ENABLING INPUT CAPTURE AND OVERFLOW INTERRUPTS
}
void StartTimer1(void)
{
TCCR1B|=(1<<CS10); //STARTING TIMER WITH PRESCALER 1
sei(); //ENABLING GLOBAL INTERRUPTS
}
ISR (TIMER1_CAPT_vect)
{
static uint8_t flag = 1;
if(update1)
return;
if(flag)
{
Start = ICR1; //Read value counter
timerOverflow = 0;
flag = 0;
}
else
{
End = ICR1;
update1 = 1;
flag = 1;
}
}
ISR(TIMER1_OVF_vect )
{
timerOverflow++;
}
int main(void)
{
pinMode(8, INPUT);
digitalWrite(8,HIGH);
InitTimer1(); //CALLING FUNCTION INITTIMER1 TO INITIALIZE TIMER 1
StartTimer1();
Serial.begin(57600);
while(1)
{
if(update1)
{
freq = ((timerOverflow * 65536) + End - Start);
freq1 = 16000000/freq;
Serial.println(freq1);
update1=0;
timerOverflow=0; //CLEARING OVERFLOW COUNTERS
ICR1=0;
Start=0;
End=0;
TCNT1 = 0;
}
}
}