Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATmega128 - Timer3 jako pomiar częstotliwości [C/AVR Studio]

mały_zrw 02 Wrz 2013 09:56 1575 5
  • #1 02 Wrz 2013 09:56
    mały_zrw
    Poziom 9  

    Witam serdecznie.
    Napisałem prosty program do pomiaru częstotliwości. Chcę wykorzystać TIMER3 do pomiaru częstotliwości. Na wejście podaję sygnał prostokątny z generatora.

    Nie jestem pewien czy na wejście T3, czy na ICP3 powinienem podawać badany sygnał, ale program nie działa w obu przypadkach.

    Poniżej prezentuję kod programu i proszę o pomoc, co robię nie tak.
    Zadaję tryb CTC, preskaler na 1024 i przy zboczu narastającym chciałbym by program wywołał procedurę w przerwaniu. Przerwanie w ogóle nie występuje. Pojawia się tylko jednorazowo "Start" wysyłane przez UART. TCNT3 nie liczy impulsów, a tym samym po wykryciu zbocza do ICR3 nie zostanie wpisany wynik.
    Co robię nie tak?

    Kod programu:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    ]

    0 5
  • #2 02 Wrz 2013 12:40
    BlueDraco
    Specjalista - Mikrokontrolery

    Na jakiej podstawie twierdzisz, że przerwanie nie występuje? W Twoim programie nie widzę kodu, który umożliwiłby reakcję na przerwanie widoczną dla użytkownika.

    Słowo na 'v' się kłania... :)

    0
  • #3 02 Wrz 2013 13:06
    mały_zrw
    Poziom 9  

    Ok, zgadzam się, nie ma 'volatile' przy zmiennych. Wykorzystuję je w przerwaniach zatem powinny być volatile.

    Ale problem jest nadal, bo przecież program, gdy będzie się wykonywał, to w terminalu powinienem ujrzeć tekst "Sart", później program wchodzi w pętlę nieskończoną. W niej jeśli zmienna "icr" jest różna od 0 powinienem uzyskać dalsze wyniki (powinno się w terminalu pojawić wartości lub w ogóle jakieś znaki określające wartość zmiennych "icr" i "licznik", a tu się nic nie pojawia dalej). Te zmienne są przecież nadpisywane w obsłudze przerwania wartościami z rejestrów.

    Podmieniłem zatem na:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    ale nadal poza wyświetleniem tekstu "Start" program nie wyświetla mi wartości licznika TCNT3, ani zatrzaśniętej wartości z ICR3.

    0
  • Pomocny post
    #4 02 Wrz 2013 14:17
    BlueDraco
    Specjalista - Mikrokontrolery

    1. Czy w bitach konfiguracji wyłączyłeś tryb zgodności z ATmega103?

    2. Czy przeczytałeś ostatni akapit opisu bitu 6 (ICES) w rejestrze TCCR3B, strona 135 datasheet?

    0
  • #5 03 Wrz 2013 07:07
    mały_zrw
    Poziom 9  

    1) Kompatybilność z ATmegą103 mam wyłączoną w 'fusach'

    2) Można by to przetłumaczyć tak: "Jeżeli rejestr ICRn jest używany jako wartość TOP dla licznika, to pin ICPn zostaje odłączony i w konsekwencji funkcja Input Capture jest niedostępna."
    To chcąc zbudować układ przechwytujący sygnał wejściowy, taki jak w dokumentacji na stronie 118, nie mogę ustawiać rejestrów WGM tak by ICR3 nie był wartością TOP?
    Przecież podając sygnał prostokątny na ICP3, przechodzi on przez reduktor zakłóceń (nie włączam go), później następuje wykrycie zbocza (zadałem narastające). W tym czasie licznik TCNT3 zlicza impulsy. Gdy wykryte zbocze jest zgodne z tym co ustawiłem to ilość impulsów z TCNT3 ma być zatrzaśnięta w ICR3 i wystawia się flaga ICF3. Ja to tak rozumiem. Więc ICR3 przechowuje ilość impulsów dla jednego okresu sygnału wejściowego. Więc jak mam nie wykorzystywać ICR3 jako wartości TOP?
    Jak to się zatem robi? W jakim trybie powinien pracować TIMER3 jeśli chcę zaprogramować układ przechwytujący sygnał wejściowy?

    0
  • #6 04 Wrz 2013 09:37
    mały_zrw
    Poziom 9  

    Już wszystko w porządku. Dokonałem zmian w programie tak jak sugerował BlueDraco i się udało :) Oto wprowadzone modyfikacje:

    1) dodałem 'volatile' przed każdą zmienną i nadałem im typ uint32_t (wartości rejestrów ICR3 i TCNT3 są 16-bitowe)
    2) zmieniłem preskaler z 1024 na 1 (za pomocą bitów CS3x)
    3) zmieniłem tryb pracy z CTC na normalny (teraz wartością TOP nie jest już ICR3)

    Po tym zaczęło już działać, więc dodałem przerwanie, które zlicza przepełnienia przy niższych częstotliwościach. Chodzi mi o zakres do 2kHz, a zliczana ilość cykli świetnie to po obróbce pokazuje - adekwatnie do tego jaką zadaję częstotliwość z generatora. Do tego zmieniłem UART'a na wyświetlacz LCD, bo mi wygodniej było ;)

    Ogólnie działa już, więc zamieszczam kod dla porównania oraz zamykam temat. Dziękuję za wsparcie

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  Szukaj w 5mln produktów