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

Przerwanie od licznika 8-bit ATmega32

kamdzie 04 Sty 2010 20:40 1733 5
REKLAMA
  • #1 7485462
    kamdzie
    Poziom 10  
    Witam!

    Mam problem z uzyskaniem przerwania od licznika 8-bitowego. Piszę w C i w żaden sposób nie mogę się doczytać jak skonfigurować rejestr TCCR0. Przerwanie potrzebne jest mi do całkowania numerycznego metodą trapezów sygnału z żyroskopu.
    Doczytałem się, że trzeba coś ustawić w rejestrze SREG, ale mało mi zostało czasu, a potrzebuję tego do pracy inż.
    Bardzo proszę o szybką pomoc ;-)
  • REKLAMA
  • REKLAMA
  • #3 7485548
    kamdzie
    Poziom 10  
    uwierz mi, że szukam już długo, ale nie znalazłem jeszcze podstawowych informacji do obsługi przerwań.
    Jak w ogóle to musi wyglądać, tzn jak sprawdzać przerwanie np z flagi TOV0?
    Poza tym

    </kod>
    nie działa
  • REKLAMA
  • REKLAMA
  • #5 7485762
    kamdzie
    Poziom 10  
    Ok.
    Może jestem ciemny, ten przykład jest w ogóle na licznik 16- bitowy, przeczytałem przykład na licznik 8-bitowy, ale wrzuciłem do avrstudio i niedziała :(

    Czy mógłby ktoś napisać prosty program, taki, żeby powiedzmy po przepełnieniu licznika flaga powodowała skok do danego miejsca i wykonanie określonej operacji?
  • #6 7487123
    OlekM
    Poziom 17  
    Od razu mówię, że tego nie kompilowałem a pora jest późna, więc mogą być drobne błędy.
    Generalnie jednak wygląda to tak:

    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    volatile char a;	//tak deklarujemy zmienne, które są używane i w kodzie 
    					//obsługi przerwania i w "standardowym" kodzie
    
    int main(void) {
    	TCNT0 = 0;				//wyzeruj timer
    	TCCR0B = 4;				//włącz go z prescalerem 256
    	TIMSK0 = (1<<TOIE0);	//pozwól timerowi na zgłaszanie przerwań
    	
    	sei();					//zezwól (globalnie) na obsługę przerwań
    
    	while(1) {
    		//tu standardowy program - nawet jeśli ma nic nie robić
    		//to nie usuwamy tej pętli
    	}
    }
    
    ISR(TIMER0_OVF_vect) {
    	//obsługa przerwania
    }
    


    Choć proponował bym na początek wypróbować wersję bez przerwań.
    Jej zaletą jest prostota a wadą nieco mniej przewidywalny czas reakcji na zdarzenie.

    
    #include <avr/io.h>
    
    int main(void) {
    	TCNT0 = 0;			//wyzeruj timer
    	TCCR0B = 4;			//włącz go z prescalerem 256
    	
    	while(1) {
    		if(TIFR & (1<<TOV1)) { //czy timer wystawił flagę przepełnienia
    			TIFR = (1<<TOV1); //skasuj flagę przepełnienia
    			
    			//ten kod wykona się po każdym przepełnieniu timera
    			
    		}
    	}
    }
    
REKLAMA