logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

obsługa Input Capture - czy prawidłowo?

poorchava 27 Maj 2009 10:06 1152 0
REKLAMA
  • #1 6580220
    poorchava
    Poziom 18  
    po długich bojach napisałem coś takiego:
    #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ę
  • REKLAMA
REKLAMA