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

[Atmega16][C] Problem z timerem

Mad. 17 Paź 2009 22:40 1350 3
REKLAMA
  • #1 7141627
    Mad.
    Poziom 18  
    Mam problem aby zmienić taktowanie timera z wew. generatora atmegi na zew. kwarc zegarkowy (timer 1). Po podłączeniu kwarcu do wejść TOSC1 i TOSC2, ustawiłem flagę CS12 i zmieniłem liczbę zliczanych cykli. Po tych zmianach nic się nie dzieje (nie są zliczane sekundy itd.). Co jeszcze trzeba zrobić? Szukałem, ale niby nic więcej nie trzeba było ustawiać :-?

    Edit: Z wykorzystaniem timera2, zegarek działa z kwarcem 32768Hz przy przerwaniu (przepełnienie). Pomimo tego chciałbym wiedzieć, co zrobiłem źle na timerze 1. W przyszłości może będę chciał wykorzystać przerwania CTC.

    Poniżej kod mojego programu. Na wyświetlanie LCD nie zwracajcie większej uwagi, zrobiłem to na szybkiego :-P

        #define F_CPU 1000000L
        #include <avr/io.h>
        #include <avr/interrupt.h>
        #include <inttypes.h>
        #include <util/delay.h>
        #include <hd44780.c>
    
        /* zmienne globalne - sekundy, minuty, godziny */
        int second=0;
        int min=0;
        int hour=0;
    
        /* przerwanie dla timera1, zliczanie czasu */
        ISR(TIMER1_COMPA_vect)
        {
          if(++second==60)
          {
            second=0;
            if (++min==60)
            {
              min=0;
              if(++hour==24)
              hour=0;
            }
          }
        }
    
        int main(void)
        {
          TCCR1B |= (1 << WGM12); /* ustawia timer w tryb CTC */
          OCR1A=32768; /* zlicza cykle zagara */
          TCCR1B |= ((1 << CS10) | (1 << CS11) | (1 << CS12)); /* ustawia timer na pracę z zew. kwarcem */
          TIMSK |= (1 << OCIE1A); /* zezwolenie na przerwania dla CTC */
          sei(); /* zezwolenie globalne na przerwania */
         
          LCD_Initalize();
          LCD_Clear();
           
         /* Wyśietlanie czasu na LCD, na razie tylko sekundy*/
          while(1)
          {
            char t[2];
            itoa(second,t,10);
            LCD_GoTo(0,0);
            LCD_WriteText(t);
          }
        }


    Ogólnie zaczynam robić mój pierwszy projekt. Zegar + czujnik temperatury (do tego sterowanie urządzeniami). Zaznaczam, że jestem początkujacy ;-) Jeśli macie jakieś rady co do zegara to piszcie śmiało.
  • REKLAMA
  • Pomocny post
    #2 7141908
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 7141929
    Mad.
    Poziom 18  
    atom1477 napisał:
    Nie z zewnętrznym kwarcem, a z zewnętrznym źródłem sygnału.
    Dzięki za zwrócenie uwagi, pomyliłem pojęcia. Dopiero teraz zauważyłem to w dokumentacji :/ Ciągle nie pasowało mi to T1 pin ;)

    atom1477 napisał:
    Timer1 o ogóle nie może pracować z rezonatorem kwarcowym. Gdzie w taki razie go podłączyłeś (rezonator)?
    TOSC1 i TOSC2

    Edit: w timer2 też mam CTC, więc w sumie problem rozwiązany. Za bardzo skupiłem się na timerze1 ;) Na początku zrobiłem zegarek na wew. taktowaniu z preskalerem, ale okazał się mega niedokładny (po 1 czy 2 godz. spóźniał się około 5 sekund).
  • #4 7141998
    Konto nie istnieje
    Poziom 1  
REKLAMA