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][C] Timer2 kwarc zegarkowy

vectra96 03 Lis 2009 20:24 2608 7
REKLAMA
  • #1 7211763
    vectra96
    Poziom 12  
    Witam, czy może ktoś spojrzeć na poniższy kod i napisać mi co w nim źle napisałem? Moim zamiarem było ustawienie przerwania na Timer2 z zewnętrznym kwarcem zegarkowym, aby co sekundę zmieniał wartość jakiejś zmiennej i wyświetlał ją na LCD. Niestety nie wiem dlaczego ale program nie odlicza mi sekundy ale mniej więcej minutę ;]

    Poniżej uproszczony kod programu. Gdy pisałem samo przerwanie dla Timera2 aby mrugał diodą działało prawidłowo.

    
    include <avr/io.h>
    #include "def.h"
    #include "lib\delay.c"
    #include "lib\lcd.c"
    #include "lib\eeprom.c"
    #include <avr/pgmspace.h>
    #include <math.h>
    #include <avr\interrupt.h>
    #define    PRG_RDB(addr)   pgm_read_byte(addr)
    
    ...
    
    SIGNAL (SIG_OVERFLOW2)               //funkcja obsługująca przerwanie od timera2
    {
    
    ...
    kod zmieniający wartość zmiennej sekund minut itd ...
    ...
    }
    
    ...
    
    int main(void)
    {   
    
       TIMSK &=~_BV(TOIE2);// Wył. przerwania TC2
       TCCR2 = _BV(CS20)|_BV(CS22);   // preskaler fclk
       ASSR |= _BV(AS2);   // TC2 z taktowania zegarem CPU na generator asynchroniczny
       TIFR   = 192;                                  //Tak się kasuje flagi przerwań
       TIMSK |= _BV(TOIE2);// włącz przerwania z TC2
       
       sei();                                    //odblokuj globalne przerwania
    
       while(1)                                 //pętla nieskończona
       {
       ...
       wyswietlanie na lcd godz
    delayms(500);                           //opóźnienie  
       ...
       }
    }
    
  • REKLAMA
  • Pomocny post
    #2 7211978
    Mad.
    Poziom 18  
    Sprawdzałem Twój kod inicjalizacji timera + przerwanie -> wszystko jest ok. Musisz mieć błąd w zliczaniu sekund lub w wyświetlaniu.

    Tak na marginesie to po co ustawiasz bit OCF2 w TIFR? Nie korzystasz z porównania (compare match), więc nie potrzebnie robisz to ustawienie. Wystarczy
    TIFR=(1 << TOV2);
  • REKLAMA
  • #3 7212026
    Konto nie istnieje
    Poziom 1  
  • #4 7213633
    vectra96
    Poziom 12  
    Z zmiana kondensatorów coś zmienia?
  • REKLAMA
  • #5 7213704
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #6 7215274
    vectra96
    Poziom 12  
    22pf, działać działają, ponieważ tak jak pisałem gdy wgram program migający diodą co sek to działa prawidłowo, więc chyba rzeczywiście błąd prawdopodobnie tkwi w procedurze wyświetlającej zmienna na LCD
  • Pomocny post
    #7 7215349
    Mad.
    Poziom 18  
    Tak na szybkiego możesz sprawdzić to:

    Wstaw w odpowiednich miejscach w swoim programie.
    int second=0;
    
    SIGNAL (SIG_OVERFLOW2)
    {
      second++;
    }
    
    int main(void)
    {  
      LCD_Initalize();
      LCD_Clear();
      
      while(1)
      {
        char t1[2];
        itoa(second,t1,10);
        LCD_WriteText(t1);
      } 
    }
  • #8 7215374
    vectra96
    Poziom 12  
    Dziękuję za pomoc , problem rozwiązany :)

    Okazało się faktycznie że miałem błąd w procedurze liczącej sekundę. Dziękuję wszystkim za pomoc zegarek działa!
REKLAMA