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

Atmega8 - Timer nie działa poprawnie przy zegarze 8MHz i preskalerze 8

mali30 27 Kwi 2007 21:47 1308 2
REKLAMA
  • #1 3827685
    mali30
    Poziom 10  
    Posty: 14
    Witam.

    Napisałem sobie prosty kod:
    /**
     * Timer - test
     */
     
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    #define T0_INIT 0xFF //Wartość początkowa timera
    
    volatile uint32_t timer; //Odliczanie czasu przez timer
    
    /**
     * Przerwanie przepełnienia timera
     */
    SIGNAL ( SIG_OVERFLOW0 )
    {
        TCNT0 = T0_INIT;
    	if ( timer > 0 ) timer--;
    }
    
    /**
     * Inicjacja timera
     */
    void init_timer( void )
    {
    	TIMSK = _BV( TOIE0 );
    	TCNT0 = T0_INIT;
    	TCCR0 = _BV( CS01 );
    }
    
    /**
     * Głowny program
     */
    int main( void )
    {
        DDRD = 0xFF;
    	PORTD = 0xFF;
    	
    	init_timer();
    	
    	while ( 1 )
    	{
    	    cbi( PORTD, PD4 );
    		timer = 100000;
    		while ( timer ) {}
    		sbi( PORTD, PD4 );
    		timer = 100000;
    		while ( timer ) {}
    	}
    }

    Zegar jest ustawiony na 8MHz, preskaler również na 8. Z tego co wyliczyłem (a także inne programy które znalazłem do liczenia wartości dla timer'a) przerwanie powinno być wywoływane co 1µs, i między zapaleniem a zgaszeniem diody powinna być przerwa ok 100ms. Tymczasem wygląda jakby timer wogóle nie pracował, dioda się świeci przez cały czas. Gdzie robię błąd, i czy w ogóle na wewnętrznym generatorze można uzyskać taki czas ?


    ---
    Pozdrawiam, Michał
  • REKLAMA
  • #3 3827952
    mali30
    Poziom 10  
    Posty: 14
    Fakt, zapomniałem o włączeniu przerwań...

    I zmieniłem wartość początkową timera tak, że odmierza 10µs. Teraz działa ładnie :)

    ---
    Pozdrawiam, Michał
REKLAMA