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

ATMEGA8A - Jak zrealizować programowy tryb CTC dla licznika T0?

gpi_unit 15 Sie 2013 15:42 2016 10
REKLAMA
  • #1 12631121
    gpi_unit
    Poziom 12  
    Witam

    Chciałbym zrealizować programowy tryb CTC dla licznika T0.
    Program testowy zwiększa wartość rejestru OCR2 o jeden co sekundę (licznik T1).
    Taktowanie zegara 16 MHz. Licznik T0 i T2 mają ustawiony preskaler /1024.


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



    Inicjalizacja liczników
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Obsługa przerwania T2 i T1:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Program działa w ten sposób, że co sekundę zmnienia wartość OCR2 i w ten sposób zmienia się częstotliwość migania diody. Nie wiem jak zrealizować skrócenie odmierzania czasu od T0, bo nie ma on trybu CTC.

    Wymyśliłem takie coś, ale nie działa jak powinno

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 12631405
    perlon
    Poziom 20  
    A może by tak w ten deseń?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 12631440
    xHaKeReK
    Poziom 20  
    Nie bardzo rozumiem o co Ci chodzi ale najpierw zaplanuj dokladnie co masz zrobic albo opisz tu to Ci pomozemy. Za bardzo zagmatwane jak dla mnie i wkleiles tylko czesc kodu ze skromnym opisem.
    Who fails to plan plan to fail. Czy jakos tak.
    Pierwsza rzecz to to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Masz pomieszane A z B dla roznych rejestrow. Sprawdz tabelke w PDF. Pamietam ze dla licznikow 16 bitowych nie dalo sie zawsze zmieniac stanu pinow w intuicyjny sposob. Byly wyjatki i spora tabelka z opisem.
    Druga to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Te przerwanie jest wywolywane tylko gdy timer 0 sie przepelni. Wtedy wartosc licznik3 moze byc rozna. Zakladam ze program nigdy nie wiejdzie w petle if. Jesli tak to bardzo rzadko.
  • #4 12631668
    gpi_unit
    Poziom 12  
    Chciałbym zaimplementować tryb CTC w liczniku T0, który nie ma takiego trybu domyślnie. Brakuje mu rejestru OCR0 itp.

    W przykładzie zmieniam wartość OCR2. Zmiana tej wartości powoduje, że podłączona dioda miga ze zmienną częstotliwością. Timer T1 i T2 działa dobrze. Pozostaje mi przekopiować funkcjonalność timera 2 do timera 0. Teraz chyba dobrze przedstawiłem problematykę :)
  • #5 12631722
    xHaKeReK
    Poziom 20  
    Nie mozesz uzyc wylacznie timer-a 2?
    To nie ma prawa dzialac poniewaz sprawdzasz czy licznik 3 ma taka sama wartosc jak TCNT0. Licznik 3 zwieksza sie w przerwaniu co przepelnienie timera 0 ale TCNT0 zlicza caly czas niezaleznie od Twojego kodu i nigdy(prawie) przerwanie nie jest wykonywane gdy TCNT0 ma akurat wartosc licznika 3. TCNT0 zmienia sie wiele razy szybciej. Czasem moze wchodzi w ta petle if. Jesli wchodzi to rzadko. Mysle ze na tym polega problem.
  • #6 12631760
    gpi_unit
    Poziom 12  
    Teraz zrobiłem tak i wygląda na to, że niby działa.
    Czy takie coś ma sens działania, czy tylko tak mi się wydaje, że działa:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #7 12632358
    perlon
    Poziom 20  
    No chyba o to chodziło. Nieprawdaż? Zmienna OCR0 robi ci za softwarowy rejestr do porównania. Zwiększając OCR0 w wydłużasz czas do przepełnienia licznika i wywołania obsługi przerwania. Tylko w tym przypadku nie COMPARE_MATCH tylko OVEFLOW. Takie podejście działa ale jest o wiele mniej dokładne niż właściwe rozwiązanie sprzętowe. No i w zasadzie nie daje żadnych zysków bo i tak timer0 ma tylko jeden tryb i nic z tym nie zrobisz a tylko go zajmujesz dziwnymi manewrami.
  • #8 12632637
    BlueDraco
    Specjalista - Mikrokontrolery
    Może zacznij od napisania, jaką funkcjonalność chcesz uzyskać. PWM? Jaki okres, jaka rozdzielczość zmian okresu/wypełnienia?
  • REKLAMA
  • #9 12633260
    gpi_unit
    Poziom 12  
    No wiadomo, że nie będzie tak dokładne jak sprzętowe, ale zawsze coś.
    Do BlueDraco nie chodzi mi o PWM tylko o dołożenie trybu CTC do licznika T0 w ATmedze8.
  • #10 12633738
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie chodzi ci o dołożenie trybu CTC, bo może to zrobić tylko projektant układów scalonych. Chodzi Ci o jakąś funkcjonalność, tylko nie chcesz albo nie potrafisz napisać o jaką. Gdybyś podał parametry tego, co chcesz uzyskać, zapewne dałoby się coś wymyślić.
    Nie da się "dołożyć trybu CTC". Być może da się uzyskać taką funkcjonalność, jakiej potrzebujesz, ale bez podstawowych informacji to raczej niemożliwe.
  • #11 12634137
    gpi_unit
    Poziom 12  
    Wiadomo, że nie mogę tak sobie po prostu dołożyć CTC, bo przerwanie mam nie od COMPARE_MATCH tylko OVEFLOW. Problem już został rozwiązany.
REKLAMA