Kurs AVR-GCC - Dekoder RC5.pdf

(135 KB) Pobierz
XYZ Hobby Robot-Kurs AVR-GCC Dekoder RC5
1 Z 7
Artykuł pochodzi ze strony XYZ HOBBY ROBOT ( xyz.isgreat.org )
Kurs AVR-GCC Dekoder protokoþu RC5
3.06.11 ABXYZ
Artykuł jest dodatkiem poszerzającym tematykę publikowanego na
tej stronie kursu AVRGCC
Pilot na podczerwień to tani i prosty sposób na bezprzewodowe
sterowanie urządzeniami z bliskiej odległości. W tym artykule
opisałem jak wykonać odbiornik współpracujący ze standardowym
pilotem RC5. Funkcję dekodera protokołu RC5 będzie oczywiście
pełnił mikrokontroler napiszemy taki programik w języku C.
Odbiornik moŜna wykorzystać do budowy róŜnych urządzeń
sterowanych pilotem.
Scalony odbiornik podczerwieni SFH5110-36
Obok pilota RC5 i mikrokontrolera AVR ATMEGA będzie potrzebny
scalony odbiornik podczerwieni SFH511036, układ ten jest łatwo
dostępny i kosztuje ok 3zł.
Fot. 1. SFH511036 Scalony odbiornik/demodulator podczerwieni
Rys.1. Podłączenie układu SFH511036
Rysunek poniŜej wyjaśnia sposób działania układu SFH511036.
Odbiornik SFH511036 posiada trzy wyprowadzenia: 1wyjście
cyfrowe, 2masa, 3zasilanie(5V) . Normalnie na wyjściu odbiornika
SFH511036 jest wysoki stan napięcia, gdy odbiornik zostanie
oświetlony pilotem, na wyjściu pojawi się stan niski. Pilot świeci
diodami IR impulsowo, z częstotliwością ok 36kHz, gdyŜ odbiornik
SFH511036 reaguje tylko na oświetlenie impulsowe o
częstotliwości 36kHz, eliminuje to wpływ zakłóceń z innych źródeł
światła.
649527192.017.png 649527192.018.png 649527192.019.png
2 Z 7
Rys. 2. Zasada działania i sposób uŜycia odbiornika podczerwieni SFH511036.
Scalony odbiornik podczerwieni podobny do SFH511036 moŜna
wyciągnąć ze zuŜytego TV lub innego sprzętu. Przed wylutowaniem
trzeba tylko rozeznać do których wyprowadzeń przyłączone jest
zasilanie, a które jest wyjściem danych.
Pilot RC5
ChociaŜ w kaŜdym porządnym domu znajdzie się kilka pilotów na
podczerwień, to jest całkiem prawdopodobne, Ŝe Ŝaden nie działa
zgodnie z protokołem Philips RC5. Ale to Ŝaden problem.
Nowiutkiego pilota RC5 kupisz na allegro w cenie ok 5..7zł. Ja
posłuŜę tu się pilotem od starego telewizora, fotka poniŜej, pilot ten
ma w środku układ scalony SAA3010P.
Fot. 2. Klasyczny pilot, pozostał mi po wymianie starego TV, w środku ma układ scalony
SAA3010P
Protokþ zdalnego sterowania RC5
Wciśnięcie przycisku w pilocie RC5 skutkuje wysłaniem ramki
danych, która składa się z czternastu bitów danych. Najpierw idą
dwa bity startowe, oba zawsze mają wartości 1. Następny jest bit
kontrolny toggle, bit ten zmienia swoją wartość na przeciwną, za
kaŜdym razem, kiedy naciśnięty jest któryś przycisk w pilocie.
Kolejne pięć bitów sys5..sys0 to adres systemu (urządzenia), dla TV
adres ma wartość 0. Pozostałe sześć bitów cmd4..cmd0, zawierają
numer przycisku.
649527192.020.png 649527192.001.png 649527192.002.png
3 Z 7
Rys.3. Ramka danych protokołu sterowania RC5 składa się z 14 bitów.
W protokole RC5 wykorzystuje się kodowanie bitów Manchaster. Bit
o wartości 1 kodowany jest jako przejście poziomu sygnału z
niskiego na wysoki, a bit o wartości 0, jako przejście z poziomu
wysokiego na niski. W obu przypadkach zmiana poziomu sygnału
następuje w połowie czasu trwania bitu. Czas trwania kaŜdego bitu
wynosi ok 1.8 milisekundy.
Rys.4. Kodowanie bitów Manchester
Pilot RC5 przesyła kolejne ramki danych w odstępie czasu nie
mniejszym niŜ okres trwania 50 bitów.
Rys.5. Odstęp pomiędzy kolejnymi ramkami danych równa się czasowi trwania 50 bitów.
Przykþadowy program dekodera RC5
Program będzie dekodował komendy pilota RC5 i prezentował wynik
na siedmiu diodach LED. Sześć diod pokaŜe numer przycisku, a
siódma toggle bit. Toggle bit zmienia swój stan przy kaŜdym
wciśnięciu przycisku. Siedem diod LED przyłączyłem do portu D
AVRa, a odbiornik podczerwieni SFH511036 do PB0.
W programie wykorzystano przerwanie wywoływane przepełnieniem
timera0 "Timer0 Overflow". Timer0 skonfigurowany jest tak, Ŝe
przerwania występują co 32 mikrosekundy. Z kaŜdym wystąpieniem
przerwania inkrementowana jest globalna zmienna "timerL", a co
256 wystąpień przerwania, inkrementowana jest globalna zmienna
"timerH". Zmienne "timerL" i "timerH" tworzą zegary, które
uŜyjemy w programie do mierzenia czasu trwania impulsów i do
wymierzania odcinków czasu.
Wykrywaniem i dekodowaniem komend rc5 zajmuje się funkcja
"detect". Funkcja "detect" uruchamiana jest w głównej pętli
programu, zwraca 12bitowy kod komendy RC5, albo wartość 1,
jeśli w okresie 131ms nie wykryje komendy lub wystąpi błąd.
649527192.003.png 649527192.004.png 649527192.005.png 649527192.006.png
4 Z 7
Na początku funkcji "detect" program odczytuje w pętli stań wejścia
uC, do którego podłączono odbiornik podczerwieni SFH511036,
oczekując okresu ciszy trwającego co najmniej 3.5ms cisza to stan
wysoki napięcia na wyjściu SFH511036. Przypominam, Ŝe
normalnie na wyjściu odbiornika SFH511036 jest wysoki stan
napięcia, a gdy odbiornik oświetlany jest pilotem, to na wyjściu
pojawia się stan niski. Jeśli w ciągu 131ms nie wystąpił okres ciszy
trwający 3.5ms, to funkcja kończy działanie zwracając kod 1,
oznaczający brak komendy. Następnie program oczekuje
opadającego zbocza sygnału w połowie pierwszego bitu startowego
Po wykryciu bitu startowego mierzony jest czas trwania niskiego
poziomu sygnału. Jeśli nie wykryto pierwszego bitu startowego w
okresie 131ms, albo mierzony czas trwania poziomu niskie sygnału
w pierwszym bicie startowym okazał się dłuŜszy niŜ 1.1ms, to
funkcja kończy działanie zwracając kod oznaczający brak komendy.
Dalej program oczekuje opadającego zbocza w środku drugiego bitu
startowego. Funkcja wykorzystuje opadające lub rosnące zbocze
sygnału w połowie kaŜdego bitu do synchronizacji. Odczyt wartości
kolejnego bitu ramki dokonuje się po okresie 3/4 czasu trwania bitu
od momentu wykrycia zbocza w środku poprzedniego bitu.
Odczytana wartość bitu zachowywana jest w zmiennej. Dalej, jeśli
odczytano wartość bitu 1, to program oczekuje wystąpienia zbocza
opadającego w środku bitu, a jeśli odczytano wartość bitu 0, zbocza
narastającego. W momencie wykrycia krawędzi w środku bitu
następuje wyzerowanie timera i cała akcja jest powtarzana dla
kolejnego bitu. Jeśli program nie wykryje odpowiedniego zbocza w
okresie 5/4 czasu trwania bitu od momentu poprzedniej
synchronizacji, to funkcja kończy działanie z błędem.
Rys. 6. Próbkujemy po 3/4 czasu trwania bitu od momentu wykrycia zbocza sygnału w
połowie poprzedniego bitu.
A oto nasz programik, całość w jednym pliku.
//
// Plik "main.c"
//
// KURS AVRGCC (abxyz.bplaced.net)
//
// Dekoder RC5
//
// (schemat i opis działania w artykule)
// testowanie na atmega8 (8MHz)
//
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
649527192.007.png 649527192.008.png 649527192.009.png 649527192.010.png 649527192.011.png 649527192.012.png
5 Z 7
// Odbiornik podczerwieni SFH5110 przyłączona do portu PB0
#define RC5_IN (PINB & (1<<0))
//
typedef unsigned char u8;
typedef unsigned int uint;
// Zmienne globalne pełnią rolę programowych zegarów
// napędzanych przerwaniem TIMER0_OVF
volatile u8 timerL;
volatile u8 timerH;
//
// Funkcja konfiguruje i uruchamia Timer0
// oraz włącza przerwanie od przepełnienia timera,
// przerwanie powinno występować co 32us.
//
void init_rc5()
()
{
//atmega8
TCCR0 = ( 1 <<
<<CS00);
); // włącza Timer0
TIMSK = ( 1 <<
<<TOIE0);
); // włącza przerwanie "Timer0 Overflow"
/*
//atmega88
TCCR0B = (1<<CS00);
TIMSK0 = (1<<TOIE0);
*/
// Zezwala na przerwania
sei();
();
}
//
// Procedura obsługi przerwania Timer0 Overflow"
//
ISR(TIMER0_OVF_vect)
{
volatile static u8 inttemp;
// zmienna timerL zwiększa się co 32us
timerL++;
++;
// zmienna timerH zwiększa się co 8.192ms (32us*256)
inttemp++;
++;
if (!
(!inttemp ) timerH++;
++;
}
//
// Funkcja wykrywa i dekoduje komendę pilota RC5
//
uint detect()
()
{
u8 temp;
u8 ref1;
u8 ref2;
u8 bitcnt;
uint command;
timerH = 0 ;
timerL = 0 ;
// Czeka na okres ciszy na linii wejścia uC trwający 3.5ms
// Jeśli nie wykryje takiego okresu ciszy w ciągu 131ms,
// to kończy działanie funkcji z błędem
while ( timerL< 110 )
{
if (timerH>=
>= 16 ) return command = 1 ;
if (!
(!RC5_IN) timerL = 0 ;
}
// Czeka na pierwszy bit startowy.
// Jeśli nie wykryje bitu startowego w ciągu 131ms,
// to kończy działanie funkcji z błędem
while (RC5_IN)
if (timerH>=
>= 16 ) return command = 1 ;
// Pomiar czasu trwani niskiego poziom syganłu
// w pierwszym bicie startowym.
// Jeśli nie wykryje rosnącego zbocza sygnału w ciągu
<<
);
<<
);
(!
()
>=
(!
(!
>=
649527192.013.png 649527192.014.png 649527192.015.png 649527192.016.png
 
Zgłoś jeśli naruszono regulamin