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.

ATXmega128A3U - Timer w trybie Pulse Width Capture - problem z rejestrem PER

Kudzu 29 Lis 2016 23:07 372 0
  • #1 29 Lis 2016 23:07
    Kudzu
    Poziom 14  

    Siedzę na problemem od kilku dni i nie mogę się dopatrzeć błędu. Dla niecierpliwych - sam problem opisany jest na samym końcu.

    Próbuję odczytywać dane z czujnika AM2302 z użyciem timera (timerów). Czujnik posiada jedną linię danych typu OC (lub coś w pobliżu). Komunikacja polega na tym, że master (MCU) w celu wybudzenia czujnika generuje stan niski o odpowiedniej długości, następnie slave generuje krótką odpowiedź, po czym przesyła 5 bajtów danych (2 baty wilgotności, 2 bajty temperatury i 1 bajt sumy kontrolnej).

    Wymyśliłem sobie, że wykorzystam dwa liczniki. Jeden, w trybie normalnym, wygeneruje odpowiednio długi sygnał wybudzający, a drugi licznik w trybie pomiaru długości impulsu będzie odbierał dane.

    I tak na początku programu konfiguruję liczniki:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W przerwaniu od RTC (co minutę) rozpoczynam transmisję czyli "ręcznie" ustawiam stan niski na linii danych i rozpoczynam odliczanie:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Po upływie ustawionego w rejestrze PER czasu, w przerwaniu od przepełnienia zatrzymuję licznik, ustawiam stan wysoki na linii danych i przełączam na wejście oraz uruchamiam drugi licznik w trybie PW Capture:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Teraz pozostaje już tylko odbiór danych i sprawdzanie czasów w przerwaniu od przechwycenia:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    I teraz dochodzę do sedna. Z dokumentacji zrozumiałem, że w trybie Pulse Width Capture licznik zeruje się w momencie nadejścia zbocza rosnącego, a zbocze opadające generuje zdarzenie z markerem czasowym. Wymyśliłem zatem, że przerwanie od przepełnienia licznika spełni rolę zabezpieczenia w razie braku/przerwy w danych oraz wykryje zakończenie transmisji.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ale tu dzieją się niezrozumiałe dla mnie rzeczy.
    Dla celów badawczych przerwanie od przepełnienia przełącza stan wyjścia testowego na wysoki. Powinno się to stać po przepełnieniu licznika od momentu jego uruchomienia, czyli od zakończenia sygnału startu. Tyle, że wg danych z analizatora, przepełnienie następuje po ok 36 us od momentu uruchomienia pierwszego licznika i zupełnie nie zależy od wartości, jakie wpisuję do rejestru PER.
    ATXmega128A3U - Timer w trybie Pulse Width Capture - problem z rejestrem PER

    Trochę do zagmatwane, ale jestem gotowy wyjaśniać.

    ************************************************************************************

    Rozwiązałem problem, a nawet dwa.

    Po pierwsze pomiar szerokości impulsu działa w trybie normalnym, więc zamiast
    Kod: c
    Zaloguj się, aby zobaczyć kod

    powinno być
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Po drugie byłem przekonany, że jeżeli wyłączę licznik
    Kod: c
    Zaloguj się, aby zobaczyć kod

    to przerwania też przestają działać, a tak nie jest. Zatem przerwanie od przepełnienia muszę uruchamiać odpowiednio późno.

    Temat zamykam.

    0 0
  Szukaj w 5mln produktów