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

[atmega328p][c] timer0 - miganie diodą

orbit323 07 Paź 2011 12:28 3819 7
REKLAMA
  • #1 10001628
    orbit323
    Poziom 9  
    witam. bawię się od początku tygodnia z procesorem atmega328p. do tej pory wszytsko szło ok, dziś chciałem wziąć się za timery. znalazłem najprostszy program dot. timera0, jedna nie działa on u mnie :) pozmienialem nazwy rejestrów tak, by pasowaly do mojej wersji atmegi. dioda zapala się i tak już zostaje - żadnych zmian. zegar wew. mam ustawiony na 8MHz. jestem początkujący, więc proszę o wyrozumiałość.

    
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    volatile uint8_t count;
    
    int main()
    {
      // Prescaler = FCPU/1024
      TCCR0A|=(1<<CS02)|(1<<CS00);
    
      //Enable Overflow Interrupt Enable
      TIMSK0|=(1<<TOIE0);
    
      //Initialize Counter
      TCNT0=0;
    
      //Initialize our varriable
      count=0;
    
      //Port C as out put
      DDRC|=0x0F;
    
      //Enable Global Interrupts
      sei();
    
      //Infinite loop
      while(1);
    }
    
    
    ISR(TIMER0_OVF_vect)
    {
      //This is the interrupt service routine for TIMER0 OVERFLOW Interrupt.
      //CPU automatically call this when TIMER0 overflows.
    
      //Increment our variable
      count++;
      if(count==30)
      {
         PORTC=~PORTC; //Invert the Value of PORTC
         count=0;
      }
    }
    
    
    
  • REKLAMA
  • #2 10001647
    mmacura
    Poziom 18  
    Do którego pinu podpięta jest dioda?
  • REKLAMA
  • #3 10001663
    orbit323
    Poziom 9  
    Podłączona jest do PC1
  • Pomocny post
    #4 10001679
    Andrzej__S
    Poziom 28  
    orbit323 napisał:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Bity CS00 i CS02 od preskalera są w rejestrze TCCR0B, a nie TCCR0A. Masz preskaler na 0 więc timer nie zlicza.
  • #5 10001700
    orbit323
    Poziom 9  
    dziekuje bardzo, teraz wszystko dziala :)

    Dodano po 2 [godziny] 38 [minuty]:

    a teraz następne pytanie:

    fusebitami mam ustawione 8MHz. Preskalerem dzielę na 1024, więc wychodzi 7812,5Hz. Jako że jest to timer0 to ma rozdzielczość 256, więc częstotliwość wychodzi 30,517... Hz. Z tego by wynikało, że mój licznik powinien dochodzić do 30 i powodować świecenie diody przez ~1s. Tak się jednak nie dzieje, trwa to ~8s. Gdzie moje rozumowanie jest złe? :)
  • REKLAMA
  • #6 10002247
    mirekk36
    Poziom 42  
    orbit323 napisał:

    fusebitami mam ustawione 8MHz. Preskalerem dzielę na 1024, więc wychodzi 7812,5Hz. Jako że jest to timer0 to ma rozdzielczość 256, więc częstotliwość wychodzi 30,517... Hz. Z tego by wynikało, że mój licznik powinien dochodzić do 30 i powodować świecenie diody przez ~1s. Tak się jednak nie dzieje, trwa to ~8s. Gdzie moje rozumowanie jest złe? :)


    Być może tylko wydaje ci się, że fusebity masz ustawione na 8MHz. To najczęstszy błąd początkujących, więc nie miej mi za złe, że zwracam na to uwagę. Bo niejedna osoba tu pisze, że ustawiła fusebity a potem się okazuje że nic takiego a przynajmniej prawidłowo nie zrobiła w tym zakresie.

    Bo oczywiście domyślnie w twoim procku masz oscylator ustawiony na 8MHz, tyle że przy okazji zaprogramowany jest fusebit CKDIV8 - co być może przeoczyłeś.
  • REKLAMA
  • #7 10002468
    orbit323
    Poziom 9  
    Ponownie dziękuje bardzo, znów wszystko się zgadza. Z taką pomocą to można wiele zdziałać.
    Ps. rady praktyczne z książki odnośnie dopytywania na forum działają doskonale :D
  • #8 13870592
    KonradIC13
    Poziom 10  
    Przepraszam, że odkopuję temat ale mam problem właśnie z timerem 0 w atmedze 328p i jak bym miał zakładać nowy temat to nazwał bym go prawie tak samo jak ten więc wolałem napisać w już istniejącym temacie.

    Chcę sprawdzić działanie 8-bit Timer/Counter0 w ATmega328P. Efekt do uzyskania prosty. Ustawiam pin C5 jako wyjście (na początku stan niski) i przy wystąpieniu pierwszego przerwania C5 jest ustawiane w stan wysoki (sygnalizacja diodą). Dzięki czemu wiem, że przerwanie od timera CTC działa.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Niestety program nie działa tak jak chcę. Po wgraniu wyjście C5 jest cały czas w stanie niskim. Sprawdziłem połączenia diody (kiedy przełożyłem fragment z ISR(...) do while wszystko działa, w pierwszym wykonaniem pętli while dioda się zapala). Udało mi się również uruchomić program jak należy na timer1 (przy incjalizacji dioda zgaszona i przy pierwszym przerwaniu zostaje zapalona) ale kiedy tylko przezbrajam program na timer0 to niestety klapa. Nie mam pojęcia co mi umyka i dlaczego to nie działa.

    Z góry dziękuję za pomoc.

    ________________________________

    błąd znaleziony......>< niepotrzebnie ustawiałem bit CS01 na wysoki, nie mam pojęcia czemu to robiłem, datasheeta mam przed nosem. Wpadłem na to jak okazało się, że podpięty programator blokował przerwanie i jak już go wypiąłem to nie zgadzała się częstotliwość przerwania...
REKLAMA