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

Dlaczego wyświetlane są inne kody przycisków? LPC1114, obsługa pilota RC5.

KamilCWK 05 Sep 2015 17:15 1821 22
  • #1
    KamilCWK
    Level 11  
    Proszę o zerknięcie w mój kod obsługi RC5, ponieważ wyświetla zupełnie inne kody przycisków niż powinien. Gdzie i co ewentualnie zmienić ?
    Code: c
    Log in, to see the code
  • #3
    Badmaneq
    Level 23  
    Jaką częstotliwością taktujesz uc, dokładnie to pytam o wartość SystemCoreClock ?
  • #4
    KamilCWK
    Level 11  
    @GrzegorzKostka: Docelowo zamierzam to tak zrobić :) Nie zeruję flagi przerwania na początku bo w diabli poszedł by mój algorytm.

    @Badmaneq: 48 000 000 Hz
  • #5
    Badmaneq
    Level 23  
    Skoro taktowanie 48 MHz, to
    LPC_TMR16B0->MR0 = (SystemCoreClock / delayIn_us) - 1 ; // odlicz ilosc us

    nie odliczy poprawną ilość us, ponieważ 48000000/444 = 108108,10810810810810810810810811 obcinając cześć ułamkową masz 108108 a to znacznie przekracza rozdzielczość tego timera. Masz dwa wyjścia
    1. Wykorzystać preskaler LPC_TMR16B0->PR , najlepiej ustawiony w ten sposób żeby licznik timera inkrementował sie dokładnie co 1 us
    2. Skorzystać z timera 32 bitowoweg np. CT32B0
  • #6
    KamilCWK
    Level 11  
    Ustawiłem prescaler na 1 MHz ale jeszcze coś nie tak :(
    Help me :)
  • #7
    Badmaneq
    Level 23  
    Nie chcę mi się analizować Twojego kodu, być może ma prawo działać. Jesteś pewien że poprawnie przesuwasz bity ?
    Code: c
    Log in, to see the code

    Wrzucam dla Ciebie notę aplikacyjną AN10722 do dekodowania RC5. Wystarczy trochę pozmieniać nazwy rejestrów i będzie działać na Twoim uC, dodatkową zaletą jest możliwość dowolnego definiowania czasów co pozwoli na dekodowanie innych standardów pilotów opartych na kodowaniu manchester.
    Code: c
    Log in, to see the code
  • #8
    KamilCWK
    Level 11  
    Właśnie staram się rozgryźć kod zawarty w tym pdfie. Nie wiem jak "przetłumaczyć" kod podany niżej żeby był zrozumiały dla LPC1114
    Code: c
    Log in, to see the code

    PINSEL1 i poniżej raczej sobie poradzę bo wydaję mi się że chodzi o ustawienie pinu i timera, gorzej z tym powyżej.
  • #9
    Badmaneq
    Level 23  
    Również nie znam LPC2xxx :)
    Ale... kod przed PINSEL1 przerwanie od timera wiąże z funkcja RC5_Isr i zdaje się odblokowuje kanały porównywające.

    1. Musisz skonfigurować pin, użyj kodu z Twojego 1-szego postu z tym że niech generuje przerwanie na 2 zbocza (opadające, rosnące) oraz odblokuj przerwanie od portu NVIC_EnableIRQ.
    2. Skonfiguruj timer z preskalerem na 1 MHz i rejestrem porównującym 12 ms = 12000 us. Następnie włącz i odblokuj przerwanie od tego timera.
    3. Rozpocznij odliczanie timera.
  • #10
    KamilCWK
    Level 11  
    Moja funkcja RC5_Init:
    Code: c
    Log in, to see the code

    Jeszcze pozostała mi funkcja RC5_Isr, a dokładnie ten kawałek
    Code: c
    Log in, to see the code

    Co ten warunek if (T0IR & 1) sprawdza ?
  • #11
    Badmaneq
    Level 23  
    KamilCWK wrote:
    Co ten warunek if (T0IR & 1) sprawdza ?

    Sprawdza czy została ustawiona flaga od rejestru MR0 timera. Ściągnij sobie UM od LPC serii 2000, naprawdę nie jest straszny.
    Code: c
    Log in, to see the code

    Odliczy 11999, po co odejmujesz 1 ?

    Kod poza tym sprawdza, czy 7 bit zmiennej cmd jest ustawiony. Jeśli tak tzn. że jest pełna ramka RC5 odpowiednio formatując zmienne RC5_Command i RC5_System. W przeciwnym razie zerowane są zmienne cmd i sys, a to oznacza, że mamy błąd ramki. Na końcu masz zerowanie flagi rejestru porównywującego MR0.
  • #12
    KamilCWK
    Level 11  
    Przecież timer liczy tak: niech MR0 = 4 to 0,1,2,3,4,0,1,2,4,0,...
    zatem trzeba odjąć 1.

    Spójrz w kod obsługi przerwania timera
    Code: c
    Log in, to see the code
  • #13
    BlueDraco
    MCUs specialist
    Kasuj znacznik przerwania na początku bloku if() dla danego źródła przerwania. Inaczej możesz mieć podwójne przerwanie.
  • #14
    KamilCWK
    Level 11  
    Wiem że należy kasować flagę przerwania na początku, ale w nocie aplikacyjnej w przykładzie kasują na końcu.
  • Helpful post
    #15
    Badmaneq
    Level 23  
    KamilCWK wrote:
    Przecież timer liczy tak: niech MR0 = 4 to 0,1,2,3,4,0,1,2,4,0,...
    zatem trzeba odjąć 1.


    W takim razie zrób test preskaler ustaw na wartość taktowania uC, żeby do timer był taktowany 1 s natomiast do rejestru MR0 załaduj 10 a później 9
    Code: c
    Log in, to see the code

    wykonaj testy dla delay_s(10) z tym, że w jednym z testów zmień LPC_TMR32B0->MR0 = s; na LPC_TMR32B0->MR0 = s - 1;

    Teraz dopiero zauważyłem, że AN jest jedno przerwanie od timera i jego wejścia CAP.
    Ale spokojnie możesz na 2 przerwania od timera i GPIO
    Code: c
    Log in, to see the code
  • #16
    KamilCWK
    Level 11  
    Działa i wyświetla komendy tylko jak zrobić aby wiedzieć, że przycisk pilota jest przytrzymany ?
    Mam w domu telewizor Philipsa, testowałem jego pilot lecz zero reakcji programu. Pewnie nadaje w innym standardzie. W jaki sposób programowo mogę dowiedzieć się co to za standard ?

    Badmaneq co do rejestru MR0 w twoim kodzie do odmierzania czasu to się zgadza. Ja miałem na myśli przypadek kiedy timer kręci się na okrągło.
  • Helpful post
    #17
    Badmaneq
    Level 23  
    Żeby wiedzieć czy przycisk jest przytrzymany musisz testować toggle bit
    Dlaczego wyświetlane są inne kody przycisków? LPC1114, obsługa pilota RC5.

    Ciężko Ci będzie napisać program do rozpoznawania standardów nadawania IR, jest ich naprawdę dużo. Lepszym pomysłem byłoby napisanie programu na uC który przekazywałby do komputera (np. przez UART) czasy trwania bitów przerw, itd. Na tej podstawie program na komputerze rozpoznawałby standard nadawania. Polecam stronę www.lirc.org znajdują się na niej informacje do wszystkich lub prawie wszystkich standardów IR.

    Wczoraj raczej miałem zaćmienie, oczywiście flagi przerwań powinny być kasowane wewnątrz bloków if sprawdzających źródło przerwań. Poprawnie to tak jest
    Code: c
    Log in, to see the code
  • #18
    Gumis-92
    Level 8  
    Cześć Wam !

    Od dłuższego czasu nie zaglądałem na elektrodę i nie programowałem :)
    Mam na mikrokontrolerze LPC1343 zbudowany sterownik załączający wentylator i pompę obiegową. Zakres temperatur ustawiam microswitchami i chcę dodać funkcję ustawiania temperatury pilotem na podczerwień. Większość programu opierałem na bibliotekach znalezionych w sieci nie zagłębiałem się w kod. Kiedy działało to zostawiałem jak nie szukałem dalej :)
    Czy kod z tego topiku będzie działał na lpc1343 ?
  • #19
    Badmaneq
    Level 23  
    Kod będzie działał na LPC1343 tylko należy zmienić plik nagłówkowy jak i na większości Cortex'ów od NXP.
    Jak już wcześniej wspomniałem najlepiej program przepisać by korzystał tylko z jednego przerwania timera CAP (przerwanie capture).
  • #20
    Gumis-92
    Level 8  
    Dziś znalazłem trochę czasu i jakoś sam nie potrafię poskładać w całość RC5 :)
    Proszę pokażcie działający kod.
  • #21
    Badmaneq
    Level 23  
    @Gumis-92: z czym dokładnie masz problem ? Bo widzę cze czekasz na gotowca.

    Musisz postąpić według tych punktów:
    1. Inicjalizacja pinu, który będzie reagował na zbocza (opadające i rosnące), włączenie przerwań od niego i ich odblokowanie w NVIC.
    2. Skonfigurować timer by odliczał 12 ms i generował przerwanie, tutaj także należy odblokować przerwania od timera.
    3. Napisać obsługę przerwań, które na podstawie stanu pinu ustawią kolejne bity ramki RC5. Kompletną obsługę przerwań znajdziesz wyżej w tym poście https://www.elektroda.pl/rtvforum/viewtopic.php?p=14988441#14988441
    4. W main będziesz testował flagę RC5_flag, jeżeli zostanie ustawiona znaczy że masz gotową ramkę RC5.
  • #22
    KamilCWK
    Level 11  
    Gumis-92: Proszę bardzo :)
    Code: c
    Log in, to see the code


    Te includy i UART_Init(115200); potrzebne są do przekierowania funkcji printf na UART
    Code: c
    Log in, to see the code
  • #23
    Badmaneq
    Level 23  
    @KamilCWK: nadal kasujesz flagi poza blokiem if {} sprawdzającym źródło przerwania, najlepiej kasuj flagę zaraz po if.
    Code: c
    Log in, to see the code