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 ?
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!
a tak wyglądają bity pojedyncze w tym standardzie
a teraz to co odbiera odbiornik zobacz jaka różnica z rysunkiem co nadaje nadajnik i czym się sugerowałeś przy pisaniu programu.
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
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)
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