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

Wykorzystanie Timera0 w ATmedze8

mateo19851 04 Lip 2010 10:37 945 2
REKLAMA
  • #1 8258938
    mateo19851
    Poziom 16  
    Witam
    Chciałem wykorzystać Timer0 do tego aby dioda migała z określoną częstotliwością (co 1 s). Nie wiem co robie źle bo dioda cały czas świeci . Oto kod, którym programuje procesor :

    
    #define F_CPU 1000000L
    #include <avr/io.h>               
    #include <util/delay.h>
    #include<avr/interrupt.h>
    volatile unsigned int i;
    
    int main(void)
    {
    
    	i=0;
    	SREG|=_BV(7);
    	TCCR0|=_BV(0);
    	TCCR0|=_BV(2);
    	TCCR0&=~_BV(1);
    	TIFR|=_BV(TOV0);
    	DDRB|=_BV(PB0);
    	PORTB|=_BV(PB0);
    	while(1){
    	
    	}
    
    	
    }
    ISR(TIM0_OVF_vect){
    	i=i+1;
    	if(i>=4){
    		PORTB^=_BV(PB0);
    		i=0;
    	}
    
    }
    
  • REKLAMA
  • #2 8259026
    zerpo
    Poziom 22  
    Nie włączyłeś zezwolenia na przerwania Timer'a0, czyli:

    TIMSK |= 1<<TOIE0;

    Osobiście nie używam makra _BV(), dlatego napisałem z 1<<.
    Próbowałeś chyba to zrobić poprzez rejestr TIFR, ale on służy do sprawdzania, czy nastąpiło przerwanie (przepełnienie).

    Mała wskazówka:
    zamiast w dwóch linijkach:
     TCCR0|=_BV(0); 
     TCCR0|=_BV(2);

    Można w jednej:
     TCCR0|=_BV(0) | _BV(2); 

    Idąc dalej, aby było przejrzyściej, zamiast numerów bitów używaj nazw bitów, czyli:
     TCCR0|=_BV(CS00) | _BV(CS02); 

    O wiele łatwiej będzie rozszyfrowywać co tam się wpisało.

    Również globalne zezwolenie przerwań w Twoim przypadku:

    Można zastąpić o wiele czytelniejsza formą:

    a dezaktywacja przerwań:
  • #3 8259355
    mateo19851
    Poziom 16  
    Dziękuję za słuszne rady, z których na pewno skorzystam :)

    Z tym zezwoleniem na przerwanie to jeden błąd ale znalazłem jeszcze jeden. Przerwanie się inaczej nazywa dlatego nie chciało pójść. Dla ATmegi8 przerwanie od przepełnienia timera nazywa się TIMER0_OVF_vect .

    Pozdrawiam
REKLAMA