Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[LPC2138][C] - Timer T0 jako timer programowy i generator. Czy się da?

Electix 28 Dec 2012 16:36 2445 8
  • #1
    Electix
    Level 21  
    Witam serdecznie.

    Próbuję rozwiązać taki problem:

    Wybrałem sobie Timer0 jako TickTimer na którym realizuje liczniki programowe. Rdzeń działa na 60MHz, a peryferia na 30MHz. Ustawiłem sobie tak ten timer, że generuje mi przerwanie co 10ms (100Hz) i zrealizowałem to na przerwaniu od porównania dla kanału Match0. Przy porównaniu następuje przerwanie w którym sobie obsługuję liczniki programowe i następuje reset licznika.
    Chciałem wykorzystać jeszcze ten timer do generacji sygnału prostokątnego o częstotliwości 100Hz. Ale nie mam pomysłu jak to zrealizować.

    Chciałem zrobić tak:
    Do kanału Match1 wpisać połowę okresu zliczania Match0 i przy porównaniu ustawiać jedynkę na pinie Match0.1. Myślałem że dzięki temu w połowie trwania okresu zliczania na Match0 na wyjściu Match0.1 nastąpi jedynka i będzie ona trwać do resetu licznika(który następuje przy porównaniu od Match0). Niestety tak nie jest. Zapala się jedynka i cały czas jest włączona. Gdy ustawię na przełączanie pinu, to pojawia się na wyjściu prostokąt, ale ma on częstotliwość 50Hz, czyli połowę okresu Match0 i jest on zależny tylko od ustawienia rejestru Match0, nie mam na niego wpływu rejestrem Match1, na którego wyjściu sobie wymyśliłem że będę generował potrzebny mi przebieg.

    Pytanie: Czy da się jakoś zrealizować moje założenie?
  • Helpful post
    #3
    BlueDraco
    MCUs specialist
    Np. zaprogramuj timer na 200 Hz, ustaw wyjście jako toggle on match, a to, co robisz, rób w co drugim przerwaniu (np. if (++ cnt & 1)). Zdaje się, że ten timer nie ma trybu PWM niestety.
  • #4
    Electix
    Level 21  
    Freddie Chopin wrote:
    No ale masz ustawianie jedynki na Match1, to do szczęścia brakuje tylko ustawiania zera przy Match0...


    Ucieszyłem się z tej podpowiedzi, ale to nie zadziałało... :(

    BlueDraco wrote:
    Np. zaprogramuj timer na 200 Hz, ustaw wyjście jako toggle on match, a to, co robisz, rób w co drugim przerwaniu (np. if (++ cnt & 1)).


    No właśnie chciałem uniknąć takiego rozwiązania, jeśli się da. Bo na to wpadłem, wcześniej, ale trochę komplikuje mi to resztę kodu...
  • Helpful post
    #5
    BlueDraco
    MCUs specialist
    Nie rozumiem, co Ci to komplikuje - dorzucasz do obsługi przerwania jedną zmienną (o ile już takiej nie masz), jeden if i nawiasy klamrowe, w które zamykasz dotychczasowy kod (kasowanie zgłoszenia przerwania ma zostać przed if).
  • #6
    Electix
    Level 21  
    Ja zupełnie nie rozumiem, dlaczego to nie chce działać, tak jak sobie wymyśliłem... Czyżby moduł licznikowy w tych mikrokontrolerach miał aż takie ograniczenia funkcjonalne? :/

    UM do tego MCU, w niektórych momentach jest nieściśle napisany, albo ja do końca nie rozumiem jego przesłania.

    Czy może mi ktoś wyjaśnić jak działa tryb MATCH w tych timerach w połączeniu z generacją sygnałów na wyjściach?

    Ja robię tak. Ustawiam Timer w tryb czasomierza. Do rejestru porównania Match0 wpisuję wartość żeby osiągnąć czas 50ms. Do rejestru Match1 wpisuję wartość dla czasu 100ms. Dodatkowo dla Match1 ustawiam wywołanie przerwania i zerowanie licznika. Rejestr EMR ustawiam tak aby EM0 i EM1 były odzwierciedlanie na wyjściu i dla Match0 włączam ustawianie wyjścia, a dla Match1 zerowanie. Ustawiam powiązanie pinu P0.5 z wyjściem timera i oczekuję tam sygnału prostokątnego o częstotliwości 100Hz i wypełnieniu 50%. Przy okazji pracy Timera mam przerwanie co 100ms do obsługi liczników programowych.

    Niestety to są moje oczekiwania, bo w praktyce, oprócz prawidłowej pracy liczników programowych, na wyjściu MATCH0.1 mam cały czas stan niski.
    Dopiero włączenie trybu toggle powoduje generację sygnału na wyjściu 50Hz.

    Nie ogarniam jak to działa. W takim przypadku generacja poszczególnych stanów jest bez sensu, bo wygląda na to że przełącza pin na stałe w jeden stan, chyba że odbywa się to przełączenie jednorazowo z opóźnieniem wartości rejestru Match..?

    Na dodatek próba zabawy z wyjściem MATCH0.0 kończy się w ogóle brakiem sygnału. Czy to spowodowane jest tym że pin ten jest współdzielony z I2C i żeby to działało trzeba z zewnątrz podciągnąć ten pin rezystorem?
  • Helpful post
    #7
    Freddie Chopin
    MCUs specialist
    Problem z timerem jest taki, że Match0 jest przyporządkowany do pinu Tx.0, Match1 do pinu Tx.1 itd., więc za jeden pin odpowiada tylko jeden rejestr porównania i jeden typ "akcji". Do generowania PWM w LPC zwykle jest jeden specjalny timer oznaczony PWM.

    Jeszcze jedną alternatywną metodą byłoby ustawienie Match na 50% okresu timera i w przerwaniu przestawianie pinu, ale to jest metoda w 50% ręczna [;

    4\/3!!
  • Helpful post
    #8
    BlueDraco
    MCUs specialist
    Jeden kanał steruje jednym wyjściem. Nie ma możliwości zerowania wyjścia od jednego kanału i ustawiania tego samego wyjścia przez inny kanał.
    Napisałem wyżej - ustaw okres 5 ms, tryb toggle i odpalaj swoją reakcję programową na timer w co drugim przerwaniu. Nie rozumiem, na czym polega problem. Będziesz miał falę prostokątną 100 Hz.
  • #9
    Electix
    Level 21  
    Przeczytałem dokładnie UM'a i dostępne materiały na temat tych timerów. Zrobiłem trochę testów i skończyło się, że zastosowałem rozwiązanie jakie proponował BlueDraco. Okazuje się, że moje wymagania względem tych timerów były trochę zbyt wyśrubowane. To są bardzo fajne urządzenia, na dodatek o dużej pojemności zliczania, ale gdy korzysta się z resetu w trybie MATCH, do ograniczenia pojemności liczników, odbiera się w tym momencie funkcjonalność reszty rejestrów Match. Ponoć można zgrabnie nimi "zaaranżować" zdarzenia czasowe w liczniku, ale wymaga to resetu licznika poprzez przepełnienie. Przy jego pojemności, może to zajmować wieki...

    Dziękuję za pomoc w temacie i tym samym go zamykam.

    Pozdrawiam :)