po długich bojach napisałem coś takiego:
czy ten kod jest poprawny czy zawiera jakieś znaczące błędy? Chce mierzyc okres sygnału o częstotliwości mniej wiecej 0.3Hz-500Hz.
Za wszelkie uwagi z góry dziękuję
#include <avr/io.h>
#include <avr/interrupts.h>
#include <avr/delay.h>
#define ICP PORTB0
uint16_t overflows, tstart1, tstart2;
uint32_t counts;
void init(void);
int main(void)
{
init();
while(1){};
}
void init(void)
{
DDRB=(0xFF|=(1)); //pinb0 jako wejscie, reszta wyjscia
TIMSK|=((1<<TICIE1)|(1<<TOIE1)) //właczenie przerwan input capture i timer overflow
TCCR1B|=((1<<CS10)|(1<<ICES1)) // timer bez prescalera, zbocze rosnace
overflows=tstart1=tstart2=0;
counts=0;
sei():
}
ISR(TIMER1_OVF_vect)//zliczanie ilosc przekrecen timera
{
overflows++;
}
ISR(TIMER1_CAPT_vect) //obsluga capture
{
if(!tstart1)
{
tstart1=ICR1;
}
else
{
tstart2=ICR1;
if(tstart2>tstart1)
{
counts=(uint32_t)tstart2-(uint32_t)tstart1+(unit32_t)counts*0xFFFF; //czas pomiedzy impulsami + ilosc cykli timera (zkladam, ze okres pomiedzy impulsami moze byc wiekszy niz kilka przekrecen sie timera
tstart1=tstart2=0; overflows=0;
}
else
{
counts=(uint32_t)0xFFFF-(uint32_t)tstart1+(uint32_t)tstart2+(uint32_t)(overflows-1)*0xFFFF; // j.w. ale z uwzglednieniem, ze jeden overflow byl pomiedzy impulsami
tstart1=tstart2=0; overflows=0;
}
}
}czy ten kod jest poprawny czy zawiera jakieś znaczące błędy? Chce mierzyc okres sygnału o częstotliwości mniej wiecej 0.3Hz-500Hz.
Za wszelkie uwagi z góry dziękuję