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 Timera w ATmega32

Grisza_01 29 Paź 2008 19:14 1690 3
REKLAMA
  • #1 5680789
    Grisza_01
    Poziom 10  
    Witam Kolegów.
    Mam mały problem. W zasadzie mój problem polega na tym, że działa coś co moim zdaniem nie powinno działać. Napisałem prosty kod na obsługę timera w ATmega 32. Prpgramik ma generować na 1-szym pinie PORTA sygnał o określonej częstotliwośći. Kod jest następujący:
    
    	#include <avr/io.h>
    	main()
    	{
    	DDRA=255;              //ustawienie PORTA jako wyjścia    
    	CCR0=0b00000101;  //ustawienie preskalera na 1/1024
    	
    	PORTA=0;
    	while(1)
    	{		
    	while (bit_is_clear(TIFR,TOV0));//dopóki flaga TOV0 jest wyzerowana
    	PORTA^=1;             //zanegowanie 1-szego wyjścia PORTA
    	TIFR=1<<TOV0;      //wyzerowanie flagi przepełnienia (TOV0)
    	}	
    	}


    W tej konfiguracji częstotliwość wewnętrzna zegara uC wynosi 1 MHz. Preskaler dzieli częstotliwość przez 1024. Chodzi o to, że licznik Timer0 zlicza do 255, po czym ustawia się flaga TOV0. Ustawienie flagi TOV0 ma skutkować zanegowaniem stanu na wyjściu P0 PORTA.
    Paradoks polega na tym, że ten program to realizuje a według mnie nie powinien. Pewnie okaże się, że powinien ale ja juz nie mam siły :)
    Bo wartość P0 podlega negacji po przepełnieniu się licznika, a zgodnie z kodem
               while (bit_is_clear(TIFR,TOV0));
    	PORTA^=1;      

    dopóki wartość TOV0 jest równa zero --> neguj wyjście P0 portu PORTA.
    Dodam, że napisałem to metodą prób i błędów , dlatego nie wiem czemu to działa :)
    Proszę o wyjaśnienie
    Dziękuję

    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • REKLAMA
  • #2 5680813
    marek-c
    Poziom 19  
    while(..); - wisi w tej pętli dopóki ...

    następnie odwraca bit portu


    Marek

    ps. reszty nie sprawdziłem tzn. nie sprawdziłem ustawienia timera i czy dobrze sprawdzasz (chyba tak)
    ps2. pisałeś w Pascalu :idea: bo ja tak :cry:
  • REKLAMA
  • #3 5681591
    Grisza_01
    Poziom 10  
    Dziękuję za odpowiedź. Wiem juz o co chodzi. Ten średnik za instrukcją "while" wszystko wyjaśnia - while (bit_is_clear(TIFR,TOV0));

    Problem może i był błahy, ale nie dawało mi to spokoju. Wiem juz o co chodzi.
    Dzięki i pozdrawiam
    Grzesiek
  • Pomocny post
    #4 5685311
    marek-c
    Poziom 19  
    o pie*.* średnik!!!!! ile ja czasu straciłem....

    No a druga wpadka: w avrstudio programowanie innym wsadem (poprzednim) niż projekt.... bo trzeba wskazać - samo się nie zmienia wraz z projektem!

    Marek
REKLAMA