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

Ustawienie timerów na ATmega128 - Zegar wewnętrzny 8MHz, Timer1 1s, Timer0 4ms, konfiguracja kodu

krzysiek_kutno 11 Lis 2022 22:58 354 6
REKLAMA
  • #1 20280224
    krzysiek_kutno
    Poziom 9  
    Witam po przeszukaniu forum niestety nie rozumiem bądź nie umiem ustawić tych timerów.
    Zegar wewnętrzny 8MHz - Atmega128
    w tym 1 potrzebuję około 1s
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    tutaj potrzeba 4ms
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Bardzo proszę o pomoc
  • REKLAMA
  • Pomocny post
    #2 20280295
    bart-projects
    Poziom 29  
    W sobotę o tej porze mogę się mylić :P
    W tabelce pisze chyba wyraźnie, że dla tego trybu CTC który ustawiłeś to okres ustala się w OCR1A i raczej powinieneś wtedy uruchomic przerwanie od OCIE1A i oczywiście wskazać adekwatny wektor przerwania.

    Ustawienie timerów na ATmega128 - Zegar wewnętrzny 8MHz, Timer1 1s, Timer0 4ms, konfiguracja kodu

    Sprawa 1 sekundy jest prosta. (8MHz/256)-1= 31249

    W tym małym Timer0 jesli miało by być rowno 4ms to przy Twoim prescalerze 128 i ustawieniu na tryb zwykły musiałbyś w każdym przerwaniu zamiast 0 wpisywać do Timera wartość 6 (tak żeby sobie już to dodał i przepełni się po 249 +6)
    Chyba, że go sobie też ustawisz na CTC i wtedy odpada ładowanie w przerwaniu a do OC0 wpiszesz jednorazowo 249.

    Nie zapomnij globalnie włączyć przerwań.

    BTW. Wpisywanie zera do tego Timer1 jest zbędne bo jak sama nazwa mówi "Clear on Compare" Timer jest wyzerowany więc to masło maślane ;) i niepotrzebna robota.
  • REKLAMA
  • #3 20280325
    krzysiek_kutno
    Poziom 9  
    Hmmm - dziękuję bardzo.
    A jeśli mogę spytać jak by to wyglądało w moim przykładzie ? Coś rozumiem - wiem że dzwony biją ale nie wiem gdzie - przepraszam.
    Chodzi o same deklaracje Timerów - i gdzie mam wpisać wartość 6 ewętalnie jak inaczej to zadeklarować.
  • Pomocny post
    #4 20280328
    bart-projects
    Poziom 29  
    Nie nie rób się kaczką albo sie prześpij ahahahahahaha :D

    OCIE1B zamieniasz na OCIE1A
    OCR1B zamieniasz na OCR1A
    zamieniasz wektor TIMER1_COMPB_vect na TIMER1_COMPA_vect
    kasujesz wszędzie to TCNT1=0 bo nie ma sensu

    Dla Timer0, w przerwaniu, pod linijką "dot ++ ; " dopisz TCNT0 = 6;

    To też można na palcach policzyć:
    8MHz to jest na sekundę a sekunda ma 1000ms
    8MHz/128prescaler = 62500 i to dzielisz przez 1000 = 62,5
    Potrzebujesz 4ms więc 62,5x4=250 i zawsze odejmujemy 1 na wejście w przerwanie.
    Wychodzi 249 a Timer kręci się do 255. 255-249=6
    Dlatego w trybie CTC wpisujemy 249 raz, a w trybie normalnym 6 w każdym przerwaniu.
  • REKLAMA
  • #5 20280353
    krzysiek_kutno
    Poziom 9  
    Uczyniłem jak mówisz i dla Timer0 teoretycznie zmienna "dot' po osiągnięciu 250 powinna dać 1 sek
    dot = 250 zostało osiągnięte po 22 sek około
    czyli nic się nie zmieniło - nie wiem gdzie leży błąd - czyli przerwanie zamiast 0,004 wychodzi mi 0,088 sek.
    Może fusebity są źle ustawione.
  • Pomocny post
    #6 20280356
    bart-projects
    Poziom 29  
    No fabrycznie nowa Mega128 wychodzi z zegarem 1MHz.
    Jeśli masz taką nową to przy przestawianiu na 8MHz nie zapomnij wyłączyć JTAG i koniecznie wyłącz bit M103C bo to jest bit który ją "cofa w rozwoju" ahahaha czyli robi kompatybilną ze starszą Atmegą103 i tam jest kilka zmian w rejestrach i sprzęcie przez co program na pewno dobrze działać nie będzie ;)

    Możesz ustawić LOW=E4, HIGH=D9, EXT=FF
  • REKLAMA
  • #7 20280360
    krzysiek_kutno
    Poziom 9  
    Miałem ustawione E4 - C9 - FF
    Ustawiłem jak mówiłeś i nadal jest lipa :(
    Dodam iż timer1 działa prawidłowo - jest mniej więcej 1sek
REKLAMA