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

[BASCOM] Jak poprawić kod obsługi pilota NEC w Bascomie?

onliner 28 Gru 2012 19:46 4893 1
REKLAMA
  • #1 11707811
    onliner
    Poziom 10  
    Witam!
    Udało mi się napisać obsługę pilotów NEC w Bascomie i postanowiłem się tym podzielić. Byłbym również bardzo wdzięczny za wszelkie uwagi, co do implementacji. Poniżej zamieszczam kod, jeśli ktoś ma jakies pytania - śmiało pisać.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Ciekawą sprawą jest też to, że mój odbiornik IR (TSOP4836) jest normalnie zwarty (w stanie logicznym 1), mimo to przerwanie w trybie Rising działa poprawnie. Po drugie, TSOP4836 operuje na częstotliwości 36kHz, a NEC ma nośną 38kHz . Wie ktoś, dlaczego to działa ?
  • REKLAMA
  • #2 11726315
    WOBI
    Poziom 19  
    Cytat:
    Ciekawą sprawą jest też to, że mój odbiornik IR (TSOP4836) jest normalnie zwarty (w stanie logicznym 1), mimo to przerwanie w trybie Rising działa poprawnie.


    Nie ma czegoś takiego jak "zwarty" :) tak poprostu działa prawie każdy odbiornik IR, w stanie spoczynku, jak nic nie jest nadawane, ma stan wysoki H czyli +5V, jeśli nadajnik (pilot) nadaje nośną to na wyjściu odbiornika jest stan niski L 0V.

    Cytat:
    Po drugie, TSOP4836 operuje na częstotliwości 36kHz, a NEC ma nośną 38kHz .


    Filtry wbudowane w odbiornik nie są aż tak bardzo selektywne, 36kHz to tylko 2kHz mniej, odbiornik reaguje, jedyna różnica to w zasięgu (jest mniejszy) niż jak by współpracował z nadajnikiem 36kHz.

    Cytat:
    Czy wie ktoś dlaczego to działa?


    Powiem tak, działa trochę to przypadkowo ;) a dlaczego to wyjaśnię na rysunkach bo zobaczyć to lepiej zrozumieć.

    Transmisja NEC z nadajnika wygląda tak i pamiętaj to jest to co nadaje nadajnik (pilot), a to nie to samo co odbiera odbiornik!
    [BASCOM] Jak poprawić kod obsługi pilota NEC w Bascomie?

    a tak wyglądają bity pojedyncze w tym standardzie
    [BASCOM] Jak poprawić kod obsługi pilota NEC w Bascomie?

    a teraz to co odbiera odbiornik zobacz jaka różnica z rysunkiem co nadaje nadajnik i czym się sugerowałeś przy pisaniu programu.
    [BASCOM] Jak poprawić kod obsługi pilota NEC w Bascomie?

    a teraz bity, na czerwono zaznaczyłem to co Twój program odbiera (mierzy czas impulsu) pamiętaj to jest to co jest na wyjściu odbiornika
    [BASCOM] Jak poprawić kod obsługi pilota NEC w Bascomie?

    Mierzysz timerem czas miedzy zboczami narastającymi i akurat w standardzie NEC odstęp czasowy miedzy zboczami narastającymi (po odbiorniku, to ten przypadek który trafił sie Tobie) odpowiada bitom 1 i 0, dlatego program działa

    zestawienie sygnałów tak byś widział różnicę miedzy tym do nadaje pilot i to najczęściej jest w opisie standardów IR, a tym co odbiera odbiornik IR (sygnał na wyjściu odbiornika)
    [BASCOM] Jak poprawić kod obsługi pilota NEC w Bascomie? [BASCOM] Jak poprawić kod obsługi pilota NEC w Bascomie?

    Bit startu mierzysz 4,5ms plus 0,56ms razem długość 5,06ms czyli 5060us i nie mierzysz napewno 9ms wg standardu. Ale program działa.
    Tylko nie stopujesz timera po odebraniu ramki IR, timer działa cały czas i się cyklicznie przepełnia, więc może być tak że pierwsze porównanie po odebraniu pierwszego bitu spełni warunek bitu 0 lub 1 i program źle odczyta całą transmisję z pilota. Timer działający cały czas coś nalicza, jeśli w tym momencie nastąpi przerwanie i akurat wartość timera będzie np. 2540 tak jak w Twoim programie co wtedy? Pomyśl.
    Program działa ale sam przyznasz że nie do końca jest dobry i przypadkowy. Twój program działa bo jest analizowany jeden warunek tzn. bada czy timer1 mieści się w przedziale 2540 do 5000 jednostek, co przekłada się na czas miedzy przerwaniami 1,270ms do 2,5ms co akurat mieści się w zakresie bitu 1 w NEC, krótsze wartości przyjmuje jako bit 0, dłuższe wartości jak bit startu kasując zmienne adres, command, licznik bitów i tylko dlatego odczyt bitów statuje w dobrym momencie.
    Tak naprawdę wystarczy by warunek był taki 2ms do 2,5ms
    Kod: text
    Zaloguj się, aby zobaczyć kod

    lepiej Timer1 ladować do zmiennej i porównywać później tą zmienną instrukcją Case bo wtedy masz możliwość porównania przedziału np. Case 4000 to 5000 . Muszisz Timer ladować do zmiennej bo timer cały czas liczy i między kolejnymi If porównaniami jego wartość się zmienia, wprawdzie niewiele ale to podstawowy błąd w programie.

    Lepiej użyć wejścia procesora ICP i użyć przechwytywania Capture, daje więcej możliwości. tu masz linki do strony o standardach strona o NEC i tu masz przykład jak dekodować NEC dekodowanie NEC
REKLAMA