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

Attiny2313 zegarek, czy opłaca się użyć timera? BASCOM

Marcin1326 24 Kwi 2007 16:37 3476 12
REKLAMA
  • #1 3817180
    Marcin1326
    Poziom 13  
    Posty: 120
    Pomógł: 2
    Ocena: 39
    Witam,
    Chcę zbudować bardzo prosty zegarek a tak właściwie stoper. Chciałbym żeby mylił się co najwyżej 1min/tydzień. Napisałem program z użyciem timera, ale zegarek po ośmiu godzinach spóźnia 20 sekund.
    Czy wewnętrzny oscylator działa stabilnie, to znaczy jeżeli ma częstotliwość odbiegającą od 4Mhz to taka będzie czy będzie się wahała i miała różne wartości?
    Czy mogę skalibrować zegarek programowo: tzn. wpisywać przy przerwaniu inną liczbę do timera? jeśli tak to jak to policzyć?

    Ja rozumowałem tak:
    zamiast 8h jest 7h 59min 40 sekund, z czego wynika, że zamiast 0,25 mikrosekund (czyli okres kwarcu 4 MHz) jest około 0,2498 mikrosekund i na tej podstawie wyliczyłem nową liczbę do wpisania do timera. Czy moje rozumowanie jest dobre?

    Config Portd.0 = Output
    Dim Sekundy As Byte , Minuty As Byte , Godziny As Byte
    
    Config Timer1 = Timer , Prescale = 64 : On Timer1 Co1s
    Enable Interrupts
    Enable Timer1
    
    Sekundy = 0
    Minuty = 0
    Godziny = 0
    
    Do
    Loop
    End
    
    Co1s:
    
    Incr Sekundy
       If Sekundy = 60 Then
          Sekundy = 0
          Incr Minuty
    
             If Minuty = 60 Then
                Minuty = 0
                Incr Godziny
    
             End If : End If
    
    Timer1 = 3036
    
    Cls
    Lcd Godziny ; ":" ; Minuty ; ":" ; Sekundy
    Toggle Portd.0
    Return
  • REKLAMA
  • #2 3817456
    shg
    Poziom 35  
    Posty: 2289
    Pomógł: 339
    Ocena: 135
    Po pierwsze, możesz jak najbardziej korzystać z timera (a właściwie to powinieneś, jeżeli chcesz pomniejszyć koszta o zakup zewnętrznego RTC).
    Po drugie - możesz kalibrować, możesz to robić długo i bezskutecznie.
    Po drugie i ćwierć - Wewnętrzny oscylator nie za bardzo nadaje się do tego celu. "Nieco" mu się zmienia częstotliwość wraz z temperaturą i napięciem zasilania.
    Po drugie i pół - Kwarc 4MHz (taki najtańszy) raczej do wzorów dokładności nie należy, one zawsze mają jakieś odchyłki (produkcyjne), możesz to trochę poprawić zamieniąjąc jeden z kondensatorów przy kwarcu na trymer, ale trochę to potrwa.
    Po trzecie - to się robi inaczej... Przede wszystkim dlatego że nigdy nie wiesz, w którym momencie wystąpi przerwanie, przez to nie wiesz, o ile cykli będzie opóźnione wywołanie przerwania. Aktualnie wykonywana instrukcja musi zawsze wykonać się do końca, jak zajmuje więcej niż jeden cykl, to przerwanie poczeka.

    Niestety od BASCOMa trzymam się z daleka. W każdym razie powinna być możliwość wywoływania procedury przerwania powodowanego przez zrównanie się licznika z wprowadzoną do odpowiedniego rejestru wartością (licznik jest potem resetowany).

    Ochłap kodu w C:
    /* Timer 1: */
    	/* Tryb CTC (zliczanie do wartosci TOP i restart od zera z wywolaniem przerwania)
    	** Wartosc TOP (koniec zliczania) w rejestrze OCR1A
    	** preskaler = 8 (timer taktowany 1/8 czestotliwosci glownego zegara) */
    	TCCR1A = 0;	
    	TCCR1B = _BV(CS11) | _BV(WGM12);
    
    	/* Przerwanie co 5000 krokow timera
    	** Zegar = 4MHz, preskaler = 8, stad czestotliwosc wywolywania przerwan:
    	** f = 4MHZ / 8 / 5000 = 100Hz
    	** Timer zlicza od zera do 4999 (w sumie 5000 cykli), potem reset i zliczanie od poczatku */
    	OCR1A = 4999;
    
    	/* Przerwanie gdy wartosc licznika osiagnie OCR1A */
    	TIMSK = _BV(OCIE1A);
    
  • #3 3817542
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Zastosuj dostępny kwarc zegarowy 4194304Hz.
    Config Timer1 = Timer , Prescale = 64
    Timer przepełni się co 1 s bez wartości początkowej! Włączasz go i zapominasz, że istnieje. W przerwaniu tylko Incr sekunda.
    Mam zegar na ATMEGA8 z budzikiem ustawiany z pilota RC5. Chodzi ok.
  • REKLAMA
  • #4 3817618
    Marcin1326
    Poziom 13  
    Posty: 120
    Pomógł: 2
    Ocena: 39
    Dzięki za odpowiedzi, bardziej przekonał mnie pomysł M.S. bo mam wrażenie że będzie bardziej stabilny. Jak tylko zdobędę taki kwarc to zabieram się za testy.
  • #5 3817669
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    [quote="M. S."]Zastosuj dostępny kwarc zegarowy 4194304Hz.
    Config Timer1 = Timer , Prescale = 64
    Timer przepełni się co 1 s bez wartości początkowej! Włączasz go i zapominasz, że istnieje. W przerwaniu tylko Incr sekunda.
    Mam zegar na ATMEGA8 z budzikiem ustawiany z pilota RC5. Chodzi ok.

    ...jak sobie poradziles z przypadkowymi resetami? jak sie zresetuje to zegar tez sie resetuje?
    pzdr.
  • #6 3817733
    Dr_DEAD
    Poziom 28  
    Posty: 829
    Pomógł: 126
    Ocena: 3
    autoservice napisał:

    ...jak sobie poradziles z przypadkowymi resetami? jak sie zresetuje to zegar tez sie resetuje?
    pzdr.

    A jest coś takiego jak przypadkowy reset? Jeżeli płytaka i soft niezawiera błędów i nikt nie spawa w promieniu 10 cm od urządzenia to nic nie ma prawa sie stać. Ani iskra elekrostatyczna o napięcu 5kV ani krótkofalówka nie zakłuci pracy urządzenia.
  • REKLAMA
  • #7 3818175
    shg
    Poziom 35  
    Posty: 2289
    Pomógł: 339
    Ocena: 135
    O ile kojarzę, to pamięć RAM nie jest czyszczona podczas resetu, więc zegarek conajwyżej odrobinkę się spóźni. Oczywiście to pod warunkiem, że na początku programu zmienne nie będą czyszczone.
    Gorzej jak reset wystąpi w momencie gdy jeden z liczników został zmieniony (np. minuty) a drugi jeszcze nie.
    Co do zjawiska przypadkowych resetów mam takie samo zdanie jak kolega Dr_DEAD. W prawidłowo zaprojektowanym układzie coś takiego nie ma prawa wystąpić, chyba że zostanie on narażony na pracę w warunkach w których pracować nie powinien.
  • #8 3818239
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Nie radzę sobie z przypadkowymi resetami bo zegarek chodzi w zaciszu sypialni i jedynymi przypadkowymi resetami są wyłaczenia prądu gdyż nie dorobiłem się jeszcze zasilania awaryjnego. Na początku miałem trochę problemów z podczerwienią w przerwaniu bo odbiornik łapał przypadkowe impulsy i stos się przepełniał. Wymiana odbiornika IRED i dołożenie filtra IRED rozwiązało sprawę.
  • REKLAMA
  • #9 3820713
    Marcin1326
    Poziom 13  
    Posty: 120
    Pomógł: 2
    Ocena: 39
    M. S. napisał:
    Zastosuj dostępny kwarc zegarowy 4194304Hz.
    Config Timer1 = Timer , Prescale = 64
    Timer przepełni się co 1 s bez wartości początkowej! Włączasz go i zapominasz, że istnieje. W przerwaniu tylko Incr sekunda.
    Mam zegar na ATMEGA8 z budzikiem ustawiany z pilota RC5. Chodzi ok.


    A jakie kondensatory przy kwarcu wrzucić??
  • #11 3824677
    gregoorr
    Poziom 18  
    Posty: 229
    Pomógł: 19
    Ocena: 34
    Ja w prostych projektach korzystam z programowego RTC i sprawuję się ok. Dołączasz kwarc zegarkowy 32768Hz, konfigurujesz przez Config Clock i po kłopocie.
  • #12 3826599
    Marcin1326
    Poziom 13  
    Posty: 120
    Pomógł: 2
    Ocena: 39
    przeprowadziłem próby z kwarcem 4194304Hz. Wszystko jest ok.

    gregoorr: To też niezły pomysł z tym kwarcem, ale nie byłem pewien czy można go podłączyć do attiny2313.
  • #13 3831568
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Kwarc 32768Hz stosuje się gdy uC ma asynchroniczny timer. Taki Timer - Timer2 znajduje się np. w MEGA8. Procek idzie wtedy na generatorze wewnętrznym, a Timer2 na kwarcu dołaczonym do końcówek XTAL. Co prawda nie studiowałem całej noty TINY2313, ale sądzę, że z tym uC się to nie uda.

Podsumowanie tematu

✨ Dyskusja dotyczy budowy prostego zegarka lub stopera o wysokiej dokładności (błąd do 1 minuty na tydzień) z wykorzystaniem mikrokontrolera Attiny2313 i programowania w BASCOM. Wewnętrzny oscylator mikrokontrolera nie jest stabilny ze względu na zmiany częstotliwości pod wpływem temperatury i napięcia zasilania, co powoduje znaczne odchyłki czasowe. Zalecane jest użycie zewnętrznego kwarcu zegarowego o częstotliwości 4,194,304 Hz, który pozwala na prostą konfigurację timera z preskalerem 64 i uzyskanie przerwania co 1 sekundę bez konieczności ustawiania wartości początkowej timera. Kalibracja programowa jest możliwa, ale trudna ze względu na nieprzewidywalność momentu wywołania przerwania i opóźnienia wynikające z wykonywania instrukcji. Kondensatory do kwarcu powinny mieć pojemność 22-33 pF, a fusebity w BASCOM ustawia się na 1111. Alternatywnie można zastosować kwarc 32,768 Hz do asynchronicznego timera (np. Timer2 w MEGA8), jednak Attiny2313 nie posiada takiego timera, więc ta metoda nie jest możliwa w tym mikrokontrolerze. W dyskusji poruszono także kwestie przypadkowych resetów, które w dobrze zaprojektowanym układzie nie powinny występować, a także problemy z zakłóceniami podczerwieni, które można rozwiązać przez wymianę odbiornika i dodanie filtra.
REKLAMA