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

Konfiguracja timera xmega32E5 czyli jak przetłumaczyć kod z Xmega "A"

chemik22 17 Gru 2017 18:44 888 4
REKLAMA
  • #1 16897287
    chemik22
    Poziom 14  
    Ostatnio zapragnąłem męczyć się z tym maleństwem (xmega32E5).. Próbuje skonfigurować timer tak aby udało mi się zmierzyć szerokość impulsu na jednym z portów. Dla Xmega128A3U nie stanowi to problemu i mój kod konfiguracji timera wygląda tak:


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



    W pozostałej części kodu odpalam/wyłączam timer za pomocą: "TCC0.CTRLA=TC_CLKSEL_DIV1_gc/TCD0.CTRLA=TC_CLKSEL_OFF_gc" i odczytuje sobie wartość CCA w odpowiednich przerwaniach i wszystko jest ok.


    Problem mam natomiast z Xmega32E5 gdzie starałem się przetłumaczyć to co powyżej na jego język. Wyszło mi tak:


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



    Problem w tym że to co dostaję jako wynik pomiaru w tym przypadku to są jakieś bzdury (wynik niemal zawsze taki sam). Największy problem miałem z przełożeniem maski bitowej Xmega serii A "TC0_CCAEN_bm" na serię E... oznaczyłem to za pomocą "???" w powyższym kodzie.


    Uprzedzając pytanie to w procedurze przerwania dla Xmegi "E" ręczne kasuję flagę timera (TCD5.INTFLAGS = TCD5.INTFLAGS) która nie wiedzieć czemu tu dla odmiany nie chce się sama skasować jak to miała w zwyczaju czynić Xmega "A"...


    Czy ktoś by mógł powiedzieć co robię źle ?
  • REKLAMA
  • #2 16897541
    tmf
    VIP Zasłużony dla elektroda
    Przede wszystkim nie widzę, aby kolega odpalił zegar dla tego timera - rejestr CTRLA - preskaler. Bez taktowania nic nie zmierzy. No i należy ustawić PER, bo domyślnie ma 0 i też to nie zadziała.
  • REKLAMA
  • #3 16898024
    chemik22
    Poziom 14  
    Rejestru PER faktycznie nie definiowałem (podobne jak w xmega128a3u dla którego kod działa bez takiej definicji) myślałem że nie jest to koniecznie podczas gdy chcę zmierzyć "szerokość pulsu". Niemniej ustawienie rejestru PER nic nie zmienia.. Co do odpalenia zegara to robię to w ramach przerwania za pomocą: "TCD5.CTRLA=TC45_CLKSEL_DIV64_gc" i tu bym nie szukał błędu.


    Bardziej mnie zastanawia czy problem nie leży w mojej konfiguracji tego timera (jak wspominałem kod przedstawiony powyżej dla xmega "A" działa). Największa moja wątpliwość sprowadza się do pytania:


    Czy konfiguracja z xmega "A": "TCn.CTRLB = TC0_CCAEN_bm" w przypadku xmega seria "E" odpowiada konfiguracji: "TCn.CTRLE=TC45_CCAMODE_CAPT_gc" ? Bo w serii "E" nie widzę bitów konfigurujących "CCnEN_bm"


    No chyba że jeszcze coś innego...
  • REKLAMA
  • #4 16903591
    Kwarcu
    Poziom 13  
    Kiedyś coś pisałem na Xmega32E5, tutaj mam funkcję do inicjalizacji timera do pomiaru okresu (zdarzenie z komparatora A). Może ci się przyda.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 16905555
    chemik22
    Poziom 14  
    W zasadzie to w między czasie rozwiązałem problem i działający kod wygląda tak:


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



    Może komuś się przyda. Można swobodnie odczytywać w przerwaniach wartości TCC4_CCA/TCC4_CCB które pozwalają na jednoczesny pomiar okresu sygnału (pośrednio częstotliwości) i szerokości impulsu. To jest to czego nie można zrobić na Xmega A za pomocą jednego timera więc pod tym względem seria E jest fajna ;)
REKLAMA