Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Podstawy - timer. Jak działa timer? Jak liczyć początkową wartość?

thenkles 11 Feb 2007 16:14 2669 1
  • #1
    thenkles
    Level 11  
    Witam, próbuję zrobić program do migania diodą w zakresie ok. 1-30 Hz i postanowiłem użyć do tego timera. Wyprodukowałem coś takiego:

    #include <avr/io.h>
    #include <compat/deprecated.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    
    
    SIGNAL(SIG_OVERFLOW1){
    
    	TCNT0 = 8190;
            PORTA=~PORTA;
    
    }
    
    void main(){
    
    	DDRA=255;
    	PORTA=0;
    	
    	TCNT1 = 8190;
    	TCCR1A = 0x00;
    	TCCR1B = _BV(CS10)|_BV(CS12);
    	TIMSK = _BV(TOIE1);
    	sei();
    	while(1);
    
    }
    


    Ale trochę nie umiem skapować, jak naprawdę działa ten timer. Niby ma liczyć od 0 do 65536 i wywołać przerwanie, ale z moich obserwacji, jakoś dziwnie to się zachowuje, tzn. nie odmierza czasu tak jak, bym chciał. Jak prawidłowo liczyć początkową wartość licznika? I czy mój kod jest dobry?
  • #2
    johny_w
    Level 21  
    Witam. W przerwaniu ustawiasz licznik timera0, a nie timera1 - dlatego nie działa.

    Jeżeli chodzi o działanie timera w tym trybie (normal) liczy on od wartości TCNT do 65536. W twoim przypadku więc przerwanie wywoła się po (65536-8190) 57346 cyklach timera. Po wywołaniu przerwania wartość TCNT ustawiana jest na 0, ale u Ciebie znów zmieniasz ją na 8190 i przerwanie znów wywoła się po 57346.

    Teraz przeliczenie tego na sekundy:

    1. Odstęp czasowy pomiędzy dwoma cyklami timera: 1/(Fosc/prescaler).
    2. Odstęp pomiędzy dwoma wywołaniami przerwania: (65536-TCNT)*pkt1.

    Przykład:

    uC chodzi na kwarcu 8Mhz.
    Prescaler (dzielnik częstotliwości) dla timer1 ustawiony jest na 1024, czyli jego częstotliwość to 7,8125kHz.

    Czas między dwoma cyklami to 1/7812,5 = 128us.

    Przerwanie wywoła się po 57346 cyklach, czyli po 57346*0,000128s = 7,3s

    ,pozdrawiam