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

Tryb Asynchroniczny Timer2 w ATmega8

mati088 31 Sie 2011 23:50 4125 3
REKLAMA
  • #1 9883547
    mati088
    Poziom 10  
    Witam. Mam następujący problem - chciałem użyć timera 2 do pracy asynchronicznej z zewnętrznym rezonatorem kwarcowym (zegarkowym) o częstotliwości 32,768 kHz. Czyli ATmega powinna być taktowana wewnętrznym szybkim oscylatorem, a jedynie ten timer zegarkowym.

    Kod:
    #include <avr/io.h>
    
    int main (void)
    {
       DDRD |= (1 << 0); // Ustawienie bitu LED jako wyjścia
       TCCR2 |= ((1 << CS21) | (1 << CS22)); //Ustawia timer z preskalerem Fcpu/256
       ASSR |= (1 << AS2);        // praca asynchroniczna
    
       while(1)
       {
       // Sprawdza wartość timera w pętli IF, prawda jeśli wartość wynosi 1 sekundę
    
          if (TCNT2 >=128)
          {
    	      PORTD ^= (1 << 0);   // zmiana stanu diody
    	      TCNT2 = 0;           // zerowanie timera
          }
       }
    }


    Wszystkie fuse bity są w ustawieniu standardowym - oscylator wewnętrzny 1MHz.

    Niestety po wgraniu programu okazuje się, że dioda się zapala po niecałej sekundzie i tak już zostaje.
    Nie mruga co sekundę.

    W czym leży błąd?
  • REKLAMA
  • Pomocny post
    #2 9883641
    dondu
    Moderator na urlopie...
    Nie korzystałem nigdy z trybu asynchronicznego, ale właśnie w tym, że jest on asynchroniczny wydaje mi się, że leży Twój problem. W szczególności myślę tutaj o dostępie do rejestrów timera w tym trybie. Poszukaj na ten temat informacji. Może tu coś znajdziesz: http://www.atmel.com/dyn/resources/prod_documents/doc2505.pdf


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



    EDIT:
    Klucz do sukcesu to datasheet i: TCN2UB OCR2UB TCR2UB w rejestrze ASSR
    Zmusiłeś mnie do poczytania więc znowu się czegoś dowiedziałem - dziękuję :)
  • REKLAMA
  • #3 9933736
    mati088
    Poziom 10  
    Udało mi się uruchomić tryb asynchroniczny, a zrobiłem to tak:

    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    int main (void)
    {
       ASSR |= (1 << AS2);             // tryb asynchroniczny
       TCCR2 |= (1 << CS22) | (1 << CS20);   // preskalery
       TIMSK |= (1 << TOIE2);             // odblokowanie przerwań z przepelnienia 
       while (ASSR & (1 << OCR2UB));  // Wait for registers to update
       sei();                 // pozwolenie na globalne przerwania
    
       TCCR1B |= (1 << WGM12); // Ustawia timer1 w tryb CTC
       OCR1A = 625; // Ustawia wartość pożądaną na 200Hz dla preskalera 1
       TCCR1B |= (1 << CS11); // Ustawia timer z preskalerem Fcpu/8
       TIMSK |= (1 << OCIE1A); // Zezwolenie na przerwania dla CTC  
      
       while(1) 
       {
              ...
       }
    }
    
    ISR(TIMER2_OVF_vect)     // przerwanie asynchroniczne z przepełnienia
    { 
           // [...]
    }
    ISR(TIMER1_COMPA_vect)              // przerwanie zwykłe
    {
         //  [...]
    }
    


    Timer1 praca z oscylatorem wewnętrznym, timer2 asynchroniczny z zewnętrznym.

    Dwa przerwania oddzielne dla każdego timera.

    Zastanawia mnie co dokładnie znaczy ta linijka - while (ASSR & (1 << OCR2UB));

    Dziękuję za podpowiedź z tym "PD0" itd. , ale dlaczego nie ma czegoś takiego dla portu C, np. PC0?

    Jeszcze jedno małe pytanie - czy sposób w którym kod multipleksujący wyświetlacz jest w drugim przerwaniu, kod naliczający sekundy w pierwszym a mechanizm zegarka w głównej pętli jest optymalny dla stabilności zegarka? Wczoraj były wykonywane pomiary i jednak troszkę różnicy w stosunku do standardowego zegarka jest.
  • #4 9933881
    dondu
    Moderator na urlopie...
    mati088 napisał:
    Zastanawia mnie co dokładnie znaczy ta linijka - while (ASSR & (1 << OCR2UB));

    Oczekiwanie na zgaszenie flagi OCR2UB. A do czego służy - szukaj w datasheet, jest opisane.


    mati088 napisał:
    Wczoraj były wykonywane pomiary i jednak troszkę różnicy w stosunku do standardowego zegarka jest.

    Różnice zawsze będą. Kalibracja jest niezbędna: http://mikrokontrolery.blogspot.com/2011/04/stopery-timery-itp.html
REKLAMA