Pilot uniwersalny
Wizualizacja danych sensorycznych
Raport
Jakub Pawlikowski
14 czerwca 2008
Spis treści
1
Założenia projektowe
2
2
Wstęp teoretyczny
2
2.1
Podczerwień . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
2.2
Podczerwień w elektronice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
2.3
Protokoły . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
3
Część sprzętowa i schemat elektroniczny
3
3.1
Atmega . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
3.2
Czujnik podczerwieni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
3.3
Nadajnik
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
3.4
Klawiatura i diody sygnalizujące . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
3.5
Parametry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
4
Działanie
8
4.1
Ogólnie
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
4.2
Plan działania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
5
Komunikacja z komputeremi i wizualizacja danych pomiarowych
9
6
Wnioski końcowe
9
7
Plik programu
15
1
1
Założenia projektowe
Założeniem projektu było zbudowanie urządzenia, które mogło by posłużyć jako uniwersalny
pilot do obsługi telewizora, sprzętu Hi-fi, odtwarzacza DVD i innych podobnych urządzeń ste-
rowanych za pomocą podczerwieni.
Zasada działania urządzenia polega na kopiowaniu sygnału wysyłanego przez oryginalny
pilot, za pomocą którego sterujemy danym urządzeniem, a następnie zapamiętanie go w swojej
pamięci. Po zbudowaniu bazy najpotrzebniejszych sygnałów, urządzenie powinno być w stanie
odtworzyć skopiowane sygnały, aby sterować wybranymi urządzeniami.
2
Wstęp teoretyczny
2.1
Podczerwień
Podczerwień jest to promieniowanie elektromagnetyczne o długości fal pomiędzy światłem wi-
dzialnym a falami radiowymi. Oznacza to zakres od 780 nm do 1 mm.
Każde ciało o temperaturze większej od zera bezwzględnego emituje promieniowanie cieplne.
Już w temperaturze kilku kelwinów ciała emitują promieniowanie elektromagnetyczne w zakre-
sie dalekiej podczerwieni, ciała o temperaturze pokojowej emitują najwięcej promieniowania o
długości fali rzędu 10 µm. Przedmioty cieplejsze emitują więcej promieniowania i o mniejszej
długości, co pozwala na ich łatwe wykrycie.
Funkcjonuje kilka podziałów podczerwieni na pasma, używanym w Polsce jest:
• bliska podczerwień ( 0.7 - 5µm )
• średnia podczerwień ( 5 - 30 µm )
• daleka podczerwień ( 30 - 1000 µm )
Zastosowanie podczerwieni :
• Zdalne sterowanie urządzeniami
• Noktowizja
• Odczyt płyt CD/DVD
• Pomiar odległości
• Światłowody
2.2
Podczerwień w elektronice
Podczerwień jest interesującym rozwiązaniem, wykorzystywanym w elektronice ponieważ jest
łatwa do wygenerowania, jest odporna na nieporządane działania elektromagnetyczne jak rów-
nież jest stosunkowo tanim rozwiązaniem. Niestety nie jest to rozwiązanie idealne, ponieważ
niektóre źródła światła mogą emitować również światło podczerwone co może zakłócić komuni-
kacje. Przykładem takiego nieporządanego źródła światła jest słońce. Niestety nie tylko źródła
światła emitują podczerwień. Również elementy, które emitują ciepło będą źródłem zakłóceń.
2
Rysunek 1: Ogólna budowa protokołu
Aby pozbyć się potencjalnych zakłóceń z otoczenia transmisje za pomocą podczerwieni są
modulowane do odpowiedniej częstotliwości. Typowe częstotliwości mieszczą się w przedziale 30
- 60 kHz, a najczęściej używanym jest 36 oraz 38 kHz.
2.3
Protokoły
Ogólny schemat protokołu transmisji przedstawia rysunek 1 ( przedstawiony na przykładzie
protokołu RC-5 firmy Philips ). Jak widać składa się on zasadniczo z 4 części.
Pierwsza część ( AGC ) jest odpowiedzialna za pobudzenie odbiornika. Następnie następuje
tzw. check bit ( CHK ). Wartość jego zmienia się na przeciwny w momencie naciśnięcia przyci-
sku, a więc kiedy wciśniemy przycisk pierwszy raz CHK = 1, kiedy znów naciśniemy CHK = 0,
a następnie znów zmieni się na 1 po kolejnym wciśnięciu przycisku. Dzięki niemu w momencie
kiedy trzymamy jeden przycisk np. zmiany programu w TV i coś przetnie nam drogę na, której
odbywa się transmisja odbiornik nie odbierze tego jako ponowne wciśnięcie przycisku. Następnie
umiejscowione są adres urządzenia, do którego dany komunikat jest skierowany i numer komen-
dy.
Rysunek 2 przedstawia 3 różne rodzaje protokołów opracowane przez Nokia, NEC oraz JVC.
Jak widać zasada ich przesyłania jest bardzo podobna i można ją scharakteryzować następująco :
Na początku następuje pewien okres startowy ( jak w RC-5 AGC ). Następnie komenda jest
powtarzana co pewien okres. Część tego okresu zajmuje komenda, którą przesyłamy, a część
przerwa.
3
Część sprzętowa i schemat elektroniczny
W skład projektu wchodzą:
• ATMega16
• Czujnik podczerwieni SFH5110 firmy Osram
• Dioda IR sterowana PWM jako nadajnik
• Klawiatura 4x4
• Komunikacja z komputerem za pomocą RS232
Schemat elektroniczny przedstawia rysunek 1.
3
Rysunek 2: Różnice w protokołach - Nokia, NEC, JVC
4
Rysunek 3: Schemat elektroniczny projektu pilota
3.1
Atmega
Cechy i parametry mikrokontrolera ATMega16 użytego w projekcie:
• Wysokowydajna architektura AVR.
• RISC, 131 instrukcji (większość 1 cyklowe), nastawione na język C, mnożenie 3 cyklowe.
• 16kB pamięci flash programowanej w systemie (ISP) z funkcją Read-While-Write, trwałość
do 10k cykli kasuj/zapisz.
• 32 x8 rejestry robocze.
• 1kB pamięci SRAM.
• 512 pamięci EEPROM (100k cykli).
• Programowalne blokady bezpieczeństwa pamięci programu i eeprom.
• Do 32 konfigurowalnych linii I/O.
• Interfejs JTAG (IEEE 1149.1): testowanie, debugowanie w układzie, programowanie pa-
mięci w systemie.
• Trzy elastyczne timery/liczniki z trybami porównania (Input/Output Compare).
• Wewnętrzne i zewnętrzne programowalne przerwania.
• Szeregowy interfejs USART (praca synchroniczna i asynchroniczna).
5
• Interfejsy szeregowe TWI (kompatybilny z I2C) oraz SPI.
• 8kanałowy 10bitowy przetwornik ADC, z opcjonalnym trybem wejścia różnicowego wraz
z programowalnym wzmocnieniem (tylko w wersji TQFP).
• Analogowy komparator w układzie.
• Programowalny Watchdog z własnym oddzielnym oscylatorem.
• Układ Power-On Reset (zapewnienie prawidłowego resetu po włączeniu zasilania).
• Wewnętrzny programowany generator RC (1, 2, 4 lub 8MHz), który pozwala w wielu
przypadkach zrezygnować z podłączania zewnętrznego kwarcu.
• Programowalny próg spadku napięcia zasilania (Brown-out detection).
• 6 trybów oszczędzania energii.
• Zakresy napięć zasilania:
– 2,7 – 5,5 V dla ATMega16L,
– 4,5 – 5,5 V dla ATMega16.
• Dopuszczalna szybkość pracy:
– 0 – 8 MHz dla ATMega16L,
– 0 – 16 MHz dla ATMega16.
W projekcie został użyty procesor ATMega16 z zewnętrznym generatorem kwarcowym
16MHz.
3.2
Czujnik podczerwieni
Jako czujnik podczerwieni w projekcie został wybrany układ SFH5110 firmy OSRAM. W skład
układu wchodzą : fotodioda, przedwzmacniacz, automatyczny kontroler wzmocnienia, filtr czę-
stotliwości oraz domudolator. Nie potrzebuje on innych, zewnętrznych komponentów i można
go podłączyć bezpośrednio do mikroprocesora. Napięcie zasilania wynosi od 4,5 do 5,5 V, przy
typowym 5V, więc również nie potrzebuje innego zasilania niż mikroprocesor. Za stan aktywny
jest tutaj uznawany stan Niski.
Rysunek 4 przedstawia sposób podłączenia odbiornika do układu. Widać, że zastosowano
tu filtr dolnoprzepustowy, aby ograniczyć zakłócenia. Ten sam sposób podłączenia został użyty
w projekcie.
Odbiornik jest podłączony do pinu PD6, który jest użyty jako wejście dla trybu Input Capture.
3.3
Nadajnik
Za nadajnik posłużyła dioda emitująca światło podczerwone, która jest sterowana przez tran-
zystor NPN ( BD139 ). Dioda nie została podłączona bezpośrednio do procesora, aby zwiększyć
moc emitowanego światła.
Nadajnik jest podłączony do pinu PD7, który jest użyty jako wyjście timera2, który z kolei
pracuje jako PWM o częstotliwości ok. 36kHz.
6
Rysunek 4: Sposób podłączenia odbiornika
3.4
Klawiatura i diody sygnalizujące
Klawiatura układu została podłączona do pinów PC7 - PC0. Na chwilę obecną obsługiwane są
przyciski :
• 1 - miejsce zapamiętania sygnału
• 2 - j.w.
• 3 - j.w.
• 15 - klawisz odpowiedzialny za wywołanie funkcji wysyłania czasów trwania poszczegól-
nych części danego sygnału (1,2 lub 3) przez port szeregowy w celu jego wizualizacji na
komputerze PC
• 16 - klawisz funkcyjny, służy do wywołania funkcji zapamiętywania sygnału
Diody sygnalizujące są podłączone do pinów PD3 - PD5. Sygnalizują one stan w jakim
znajduje się program. Diody palą się w stanach :
• Dioda 0 - Stan oczekiwania
• Dioda 1 - Stan zapamiętywania sygnału
• Dioda 0 i 1 - Stan przypisania odpowiedniego klawisza do zapamiętanego sygnału
• Dioda 2 - Pilot przygotowany do wysyłanie sygnału przez nadajnik
• Dioda 0,1 i 2 - przygotowanie do wysłania sygnału przez port szeregowy
3.5
Parametry
Projekt pilota nie przewidywał zaimplementowania zewnętrznej pamięci, w której można by
składować większą ilość danych, dlatego na chwilę obecną projekt przewiduje zapamiętania 3
7
różnych sygnałów. Na chwilę obecną jest zaimplementowana klawiatura 16-sto przyciskowa. Ta-
ka liczba przycisków nie jest na tym etapie wymagana, lecz ze względu na ewentualny rozwój
projektu liczba ta nie pozostała zmniejszona.
Projekt na chwilę obecną jest zasilany ze stacjonarnego zasilacza. Oczywistością jest, że po-
sługiwanie się pilotem, podłączonym kablem do gniazdka jest mało wygodne i implementacja
zasilania akumulatorowego jest tutaj wręcz wymagane, natomiast na chwilę oddania projektu
nie jest przewidziana taka opcja, ze względu na brak dostatecznej ilości czasu jak również i
funduszy na tego typu próby ( akumulatorki plus ładowarka do nich to wydatek rzędu 50 (za
słabej jakości sprzęt) aż do 150 zł).
Odległość z jaką czujnik wyłapuje sygnały z pilota została zbadana i wynosi ona ok 4-5
metrów. Niestety ważniejszy parametr, czyli odległość na jaką sygnał będzie mógł być wysyła-
ny aby odbiornik w urządzeniu docelowym ( TV, Hi-Fi itp.) odebrało sygnał prawidłowo, nie
został jeszcze zbadany.
4
Działanie
4.1
Ogólnie
Pilot będzie działał na zasadzie wyślij–zapamiętaj–odtwórz. Po naciśnięciu odpowiedniego kla-
wisza urządzenie będzie czekało odpowiedni czas na nadejśie sygnału z pilota, którego sygnał
będzie kopiowany. Gdy nie nastąpi odebrania sygnału pilot wróci do czasu oczekiwania. Gdy
sygnał pojawi się pilot zapamięta sygnał, odpowiednio go przerobi i zapamięta pod jednym
z klawiszy wybranych przez użytkownika. Gdy następnie zostanie naciśnięty klawisz, któremu
został przypisany odpowiedni sygnał, odpowiednia transmisja zostanie wygenerowana, naśladu-
jąca skopiowany sygnał.
4.2
Plan działania
Po włączeniu urządzeniu inicjalizuje klawiaturę, komunikację przez port szeregowy, odblokowuje
przerwania oraz wstępnie inicjalizuje Timer1 jako Input Capture oraz Timer2 jako PWM, a
nastepnie oczekuje na naciśnięcie, któregoś z przycisków.
Gdy taka akcja nastąpi ( zapala się dioda 0 ) program przechodzi do stanu oczekiwania ( WAIT ).
Teraz jest możliwe wybranie opcji nadawania sygnału ( przyciski 1 - 3 ), wysłania zapamiętanego
sygnału przez port szeregowy ( przycisk 15 ), lub uruchomienie funkcji zapamiętania nowego
sygnału ( klawisz 16 ).
Po wciśnięciu klawisza numer 16 program przechodzi do stanu LOAD CODE, inicjuje Timer1
jako Input Capture i oczekuje na pojawienie się sygnału z czujnika. Sygnał aktywny czujnika to
stan Niski więc czekamy na stan niski na pinie ICP1. Po pojawieniu się go zapamiętujemy czas
z timera ( pierwszy czas nam nie jest potrzebny ale dla ciągłości programu zapamiętujemy go ),
zmieniamy reakcję na zbocze na przeciwne ( tryb Input Capture w Timer1 może reagować tylko
na zbocze opadające albo rosnące, nie ma tutaj trybu reakcji na dwa rodzaje zbocza na raz
dlatego jest wymagana zmiana reakcji na przeciwny przy każdym przerwaniu ) i wyzerowanie
licznika 1. Po zapamiętaniu określonej liczby zmian zbocza ( obecnie 60 ) i zapamiętaniu czasu
ich trwania program wyszukuje zakończenie się paczki jednej komendy i odrzuca pozostałą
część sygnału. Jest to realizowane przez sprawdzanie długości sąsiednich trwań sygnałów. Kiedy
przerwa pomiędzy zmianami jest zbyt długa to znaczy, że sygnał się skończył i można go tutaj
obciąć. Po tej operacji program przechodzi do stanu CONFIRM, w którym to oczekuje na
8
przypisaniu zapamiętanego sygnału, do któregoś z przycisków. Możemy wybrać klawisz 1-3 do
zapamiętania ( zostaje zapamiętany skrócony/obcięty sygnał ) lub klawisz 16 do skasowania
zapamiętanego sygnału. Kiedy Następnie program przechodzi do stanu oczekiwania ( WAIT ).
W stanie WAIT po wciśnięciu klawisza 15 następuje przesłanie zapamiętanego sygnału. Program
oczekuje wtedy na wciśnięcie odpowiedniego klawisza ( 1- 3 ). Kiedy wciśniemy inny klawisz
program poinformuje nas o złym wyborze i powróci do stanu WAIT. Po wciśnięciu 1, 2 lub
3 odpowiedni sygnał zostaje przekopiowany do tablicy głównej i program prześle zapamiętane
czasy przez port szeregowy, a następnie program powróci do stanu WAIT.
Kiedy w stanie WAIT zostanie wciśnięty klawisz 1,2 lub 3 program przejdzie w tryb wysyłania
sygnału. Do tablicy głównej sygnałów zostanie przekopiowany odpowiedni sygnał i wysłany za
pomocą nadajnika. W tym trybie zostaje użyty Timer2 pracujący w trybie Output Compare
ustawiony tak aby był pracował jako PWM o częstotliwości ok. 36 kHz. Timer1 jest ustawiony
na taką samą szybkość pracy jak w trybie LOAD COAD z tą różnicą, że pracuje w trybie
Output Compare i w czasie zrównania się licznika 1 z czasem zapamiętanym w tablicy 1 jest
generowane przerwanie. Pierwszy zapamiętany czas nie jest brany pod uwagę tak jak to było
wspomniane powyżej. Po wygenerowaniu przerwania praca sygnału PWM jest zmieniana na
przeciwny ( ON → OFF lub OFF → ON ), timer 1 jest zerowany i następuje oczekiwanie na
kolejne przerwanie. Wysyłanie obydwa się aż cały sygnał zostanie wysłany.
5
Komunikacja z komputeremi i wizualizacja danych pomiaro-
wych
Komunikacja z komputerem odbywa się poprzez port szeregowy. Nie jest ona jednak ciągła. Na
żądanie użytkownika może zostać wywołana funkcja, która wyśle poprzez port szeregowy cha-
rakterystykę zapamiętanego sygnału. Taki sygnał jest odbierany i zapisywany do pliku poprzez
Hyper Terminal, a następnie w Matlabie z zapamiętanej charakterystyki tworzony jest wykres
sygnału. Taką próbkę można zaobserwować na rysunku 5. Charakterystyka została wyrysowana
w sposób zbliżony do tych jakie przedstawiane były na rysunkach 1 oraz 2 czyli na zbiorze
”‘0”’ i ”‘1”’, które charakteryzują przybliżony czas trwania stanu niskiego i wysokiego w danym
sygnale. Oś czasu ( czyli oś OX ) nie jest wyskalowana w sposób prawidłowy i nie przedstawia
rzeczywistego czasu trwania danego stanu. Jest to spowodowane sposobem ustawienia timera
odpowiedzialnego za przechwytywanie sygnałów. Jest ona ustawiony aby generować przerwa-
nie co 4µ sekundy. Większa prędkość generowania przerwań nie była konieczna, a mogła by się
wiązać ze zbyt dużymi wartościami zapamiętanych czasów sygnałów. Aby otrzymać przybliżone
wartości sygnałów na przedstawionych wykresach należy przemnożyć wartości z osi OX przez
4.
Na wykresach 6, 7, 8, 9 zostały przedstawione odczytane przebiegi z pilota do wiezy Hi-fi fir-
my Philips, który posługuję się protokołem RC-5. Sygnały te są już przygotowane do wysłania
czyli została z nich ”‘wycięta”’ część informacyjna, a sygnał został ”‘przerwany”’ w miejscu, w
którym zaczynała się przerwa pomiędzy kolejnymi komendami.
6
Wnioski końcowe
Niestety po wnikliwej analizie nie udało się uzyskać zamierzonego efektu. Urządzenie kopiuje,
zapamiętuje i odtwarza sygnał do niego wysłany, ale niestety poprawne wysłanie go przez na-
dajnik nie udało się. Urządzenia, z których sygnały były kopiowane nie reagują na wywoływane
go przez urządzenie. Niestety rozwiązania takiego problemu nie udało się odnaleźć. Może on
być związany z wieloma aspektami takimi jak : niewłaściwa modulacja PWM, niedostateczna
9
Rysunek 5: Wykres przebiegów otrzymanych z jednego z pilotów
10
Rysunek 6: Sygnal z przycisku CD na pilocie do wierzy Philips
Rysunek 7: Sygnal z przycisku TAPE na pilocie do wierzy Philips
11
Rysunek 8: Sygnal z przycisku VOL+ na pilocie do wierzy Philips
12
Rysunek 9: Sygnal z przycisku VOL- na pilocie do wierzy Philips
13
moc nadajnika, niedokładne odwzorowanie sygnału podczas wysyłania, lub np. niedokładne
sczytywanie sygnału z czujnika ( co jest akurat najmniej prawdopodobne ponieważ ten aspekt
został wielokrotnie sprawdzany i powtarzalność zapamiętywanych tych samych sygnałów jest
dość duża). Do odnalezienia rozwiązania problemu potrzebny był by na pewno oscyloskop jak
również dużo więcej czasu niż ten przeznaczony na powyższy projekt. Kolejnym sposobem mo-
gło by być zbudowanie bliźniaczego pilota i wysyłanie zapamiętanych sygnałów pomiędzy tymi
urządzeniami, a następnie wizualizacja danych i ich porównywanie w celu odnalezienia błędu.
14
7
Plik programu
Listing 1: Plik proba.c
1
/∗
Program do o b s l u g i
p i l o t a z d a l n e g o s t e r o w a n i a
2
∗
Jakub P a w l i k o w s k i 0 6 . 2 0 0 8
3
∗
w y k o r z y s t a n o b i b l i o t e k e
r k l i b a v r do o b s l u g i k l a w i a t u r y
4
∗
o r a z r s 2 3 2 a u t o r s t w a P i o t r a Piwko do o b s l u g i Uarta
5
∗
6
∗
POLACZENIA
:
7
∗
k l a w i a t u r a
:
PC7 − PC0
8
∗
o d b i o r n i k
:
PD6
9
∗
n a d a j n i k
:
PD7
10
∗
d i o d y
:
PD5 − PD3 [
11
∗
12
∗/
13 #i n c l u d e <a v r / i o . h>
14 #i n c l u d e < s t r i n g . h>
15 #i n c l u d e <a v r / i n t e r r u p t . h>
16 #i n c l u d e <s t d i o . h>
17 #i n c l u d e < s t d l i b . h>
18 #i n c l u d e ” r s 2 3 2 . h”
19 #i n c l u d e ” g l o b a l . h”
20 #i n c l u d e ” kbd . h”
21
22
23
/∗ −−−−−−−−−−−−−−−−−−−−−−−−−−−−MAKRA−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ∗/
24
25 #d e f i n e UBBR 25
// d l a 16MHz i 38400 ; 51 d l a 16Mhz i 19200
26 #d e f i n e SIZE 60
// maksymalna d l u g o s c d l a wczytywanego s y g n a l u
27 #d e f i n e SHORT SIZE 30
// maksymalna d l u g o s c d l a z a p a m i e t a n e g o s y g n a l u
28
29 /∗−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ZMIENNE −−−−−−−−−−−−−−−−−−−−−−−−−−−−−∗/
30
31
/∗ −−−−−−−−−−−−−−−−−−S t a t u s programu −−−−−−−−−−−−−∗/
32
t y p e d e f enum {
33
IDLE = 0 ,
// d i o d y z g a s z o n e
34 WAIT,
// d i o d a 0
35 LOAD CODE,
// d i o d a 1
36 CONFIRM,
// d i o d a 0 d i o d a 1
37 TRANSMIT CODE,
// d i o d a 2
38 SENDING,
// d i o d y z g a s z o n e
39
RS SEND ,
// d i o d a 0 d i o d a 1 d i o d a 2
40
} s t a t e t ;
41
42 /∗−−−−−−−−−−−−−−−−− Zmienne g l o b a l n e −−−−−−−−−−−−−− ∗/
43
v o l a t i l e
s t a t e t
s t a t e = IDLE ;
// S t a t u s programu − S t a t e Machine
44
c h a r b u f [ 1 0 ] ;
// Wyswietlany c i a g znakow
45
v o l a t i l e u08 k l a w i s z =0;
// numer w c i s n i e t e g o k l a w i s z a
46
v o l a t i l e u08 e n d w a i t =0;
// f l a g a zmiany s a t u s u
15
47
v o l a t i l e u16 l i c z n i k ;
// l i c z n i k
d l a t i m e r 2
48
v o l a t i l e
u n s i g n e d i n t
t a b l i c a [ SIZE ] ;
// tu przechowujemy c z a s y
49
v o l a t i l e
u n s i g n e d i n t t a b 1 [ SHORT SIZE ] ; // przechowujemy s y g n a l d l a 1 k l
50
v o l a t i l e
u n s i g n e d i n t t a b 2 [ SHORT SIZE ] ; // przechowujemy s y g n a l d l a 2 k l
51
v o l a t i l e
u n s i g n e d i n t t a b 3 [ SHORT SIZE ] ; // przechowujemy s y g n a l d l a 3 k l
52
v o l a t i l e u08 l i c z =0;
// i l e
b y l o prze rwa n
53
v o l a t i l e u08 z b o c z e =0;
// f l a g a z b o c z a na r a z i e o p a d a j a c e
54
v o l a t i l e u08 g d z i e j e s t e m =0;
// g d z i e zna jd uje my s i e w t a b e l i czasow
55
v o l a t i l e u08 k o n i e c w y s y l a n i a =0;// f l a g a z a k o n c z e n i a w y s y l a n i a s y g n a l u
56
v o l a t i l e u08 kod =0;
// w a r t o s c tmp w c i s n i e t e g o k l a w i s z a
57
v o l a t i l e u08 kod1 =0;
// zapamietamy k l a w i s z d l a kodu1
58
v o l a t i l e u08 kod2 =0;
// zapamietamy k l a w i s z d l a kodu2
59
v o l a t i l e u08 kod3 =0;
// zapamietamy k l a w i s z d l a kodu3
60
v o l a t i l e u08 d i o d a =0;
// k t o r a d i o d e z a p a l i c
61
v o l a t i l e
u n s i g n e d i n t k o n i e c s y g n a l u =0;
// m i e j s c e o b c i e c i a s y g n a l u
62
v o l a t i l e
u n s i g n e d i n t k o n i e c s y g n a l u 1 =0;
// m i e j s c e o b c i e c i a s y g n a l u 1
63
v o l a t i l e
u n s i g n e d i n t k o n i e c s y g n a l u 2 =0;
// m i e j s c e o b c i e c i a s y g n a l u 2
64
v o l a t i l e
u n s i g n e d i n t k o n i e c s y g n a l u 3 =0;
// m i e j s c e o b c i e c i a s y g n a l u 3
65
66
67
68
/∗ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−FUNKCJE −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−∗/
69
70
/∗ I n i c j a l i z a c j a Timer1 − I n p u t Capture d l a p o b i e r a n i a s y g n a l u ∗/
71
v o i d T i m e r 1 I n i t ( ) {
72
// r e a k c j a na z b o c z e o p a d a j a c e
73
// na p o c z a t e k bo c z u j n i k ma t r y b
74
// Output : A c t i v e Low
75
76
77 TCCR1B = (1<<ICNC1)|(1 < <CS11)|(1 < <CS10 ) ;
78
// p r e s k a l e r 64 = 4 us
79 TIMSK = (1<<TICIE1 ) ;
// o d b l o k o w a n i e p r z e r w a n i a i
80
// r e d u k c j a z a k l o c e n
81
// I n p u t Capture
82
83
}
84
/∗ I n i c j a l i z a c j a Timer1 do w y s y l a n i e s y g n a l u ∗/
85
v o i d Timer1 CTCInit ( ) {
86
s b i (TCCR1B,WGM12) ;
//CTC mode
87
s b i (TCCR1B, CS11 ) ;
// p r e s k a l e r 64 = 4 us ( t a k j a k w o d b i e r a n i u )
88
s b i (TCCR1B, CS10 ) ;
89
s b i (TIMSK, OCIE1A ) ;
// o d b l o k o w a n i e p r z e r w a n i a
90 OCR1A=t a b l i c a [ 1 ] ;
// p i e r w s z y c z a s
91
k o n i e c w y s y l a n i a =0;
// f l a g a z a k o n c z e n i a p o b i e r a n i a z g a s
92
}
93
94
/∗ Z a t r z y m a n i e Timer1 ∗/
95
v o i d T i m e r 1 S t o p ( ) {
16
96 TCCR1B &= (0<<CS10)&(0<<CS11)&(0<<CS12 ) ;
// z e r o j
p r e s k a l e r
97 TIMSK &= (0<<TICIE1 ) ;
// z a b l o k o j p r z e r w a n i a
98
}
99
100
/∗ Wyzerowanie Timer1 ∗/
101
v o i d T i m e r 1 Z e r o ( ) {
102 TCNT1=0x0000 ;
103
}
104
105
/∗ C z y t a j z Timer1 I n p u t Capture ∗/
106
u16 Timer1 Read ( ) {
107
108
r e t u r n ICR1 ;
// t u t a j
j e s t składowany
109
// c z a s po p r z e r w a n i u
110
111
}
112
113
/∗ Timer1 zmiana r e a g u j a c e g o z b o c z a ∗/
114
v o i d Timer1 ZboczeZmien ( ) {
115
// i f ( z b o c z e ==1){
// na p o c z a t k u z b o c z e=0 w i e c p i e r w s z a
116
// zmiana na w z r a s t a j a c e z b o c z e
117 TCCR1Bˆ=0x40 ;
// zmien 6 b i t
118
TIFR |=(1<<ICF1 ) ;
// r e s e t
f l a g i
p r z e r w a n i a
119
}
120
121
122
/∗ I n i c j a l i z a c j a PWM do w y s y l a n i a s y g n a l u ∗/
123
v o i d PWM Init ( ) {
124
// Timer2 t r y b CTC ma byc 36kHz
125
// p r e s k a l e r =1 u z y t y wzor z e s t r o n y 121 d o k u m e n t a c j i
126
//OC2 j a k o t o g g l e
b i t
i OCR2 = 2 2 1 , ( 2 )
127
s b i (TCCR2,WGM21) ;
//CTC mode on
128
s b i (TCCR2, COM20 ) ;
// T o g g l e OC2 on
129
s b i (TCCR2, CS20 ) ;
// no p r e s c a l e r
130 OCR2=221;
// l i c z y m y do 221 bo t o da nam ok 36kHz
131
}
132
133
/∗ uruchom PWM ∗/
134
v o i d PWM Run( ) {
135
s b i (TCCR2, CS20 ) ;
// ustaw p r e s k a l e r = 1
136
}
137
138
/∗ z a t r z y m a j PWM∗/
139
v o i d PWM Stop ( ) {
140
c b i (TCCR2, CS20 ) ;
// w y l a c z p r e s k a l e r
141 TCNT2=0;
//0 do r e j e s t r u
l i c z n i k a
142
}
143
144
/∗ Zmien w a r t o s c PWM : 0 a l b o 1 w l a c z / w y l a c z ∗/
17
145
v o i d PWM Toggle ( ) {
146 TCCR2ˆ=1;
// zmien b i t 0 na p r z e c i w n y
147 TCNT2=0;
// z e r o j w a r t o s c PWM
148
}
149
150
/∗ Obsluga p r z e r w a n i e Timer1 IC ∗/
151 SIGNAL(SIG INPUT CAPTURE1) {
152
153
T i m e r 1 Z e r o ( ) ;
// w y z e r o j t i m e r
154
t a b l i c a [ l i c z ++]=Timer1 Read ( ) ;
// z a p a m i e t a j g d z i e s k o n c z y l
155
Timer1 ZboczeZmien ( ) ;
// r e a g u j e m y na p r z e c i w n e z b o c z e
156
157
}
158
159
/∗ Obsluga p r z e r w a n i a Timer1 OC∗/
160 SIGNAL(SIG OUTPUT COMPARE1A) {
161
PWM Toggle ( ) ;
// zmiane t r y b u PWM ON/OFF
162
OCR1A=t a b l i c a [ g d z i e j e s t e m ++];
// k o l e j n y f r a g m e n t kodu
163
TCNT1=0;
// z e r o j t i m e r 1
164
i f ( t a b l i c a [ g d z i e j e s t e m ]==0)
// s y g n a l
s i e
s k o n c z y l
165
{
166
k o n i e c w y s y l a n i a =1;
// ustaw f l a g e
167
PWM Stop ( ) ;
// z a t r z y m a j t i m e r y
168
T i m e r 1 S t o p ( ) ;
// z a t r z y m a j Timer1
169
g d z i e j e s t e m =0;
// p r z y g o t u j w s k a z n i k na p o z n i e j
170
}
171
}
172
173
// Ga s i d i o d y i n f o r m u j a c e o s t a n i e w p r o g r a m i e
174
v o i d z g a s ( )
175
{
176
s b i (PORTD, PD5 ) ;
177
s b i (PORTD, PD4 ) ;
178
s b i (PORTD, PD3 ) ;
179
}
180
181
// z a p a l a o d p o w i e n i o d i o d e
182
// mozliwe w a r t o s c : 0 , 1 2
183
v o i d z a p a l ( v o l a t i l e u08 d i o d a )
184
{
185
s w i t c h ( d i o d a )
186
{
187
c a s e 0 : c b i (PORTD, PD5 ) ; b r e a k ;
188
c a s e 1 : c b i (PORTD, PD4 ) ; b r e a k ;
189
c a s e 2 : c b i (PORTD, PD3 ) ; b r e a k ;
190
}
191
}
192
193
// f u n k c j a sprawdza c z y w s z y s t k o j e s t w porzadku
18
194
// z w a r t o s c i a m i w z a p a m i e t a n e j t a b l i c y s y n a l u
195
v o i d sprawdz ( )
196
{
197
i n t
i ;
198
f o r ( i =0; i <SIZE ; i ++)
199
{
200
i f ( t a b l i c a [ i ] <0)
201
t a b l i c a [ i ] = 0 ;
202
}
203
}
204
205
// Funkcja w y s z u k u j a c a p e l n e j s e k w e n c j i komendy w s y g n a l e
206
// P o z o s t a l a c z e s c n i e
j e s t brana pod uwage
207
// zwraca m i e j s c e w t a b l i c y
g d z i e o b c i e l i s m y s y g n a l
208
i n t
o b e t n i j ( )
209
{
210
i n t
i ;
211
i n t tmp ;
212
tmp=1;
213
f o r ( i =1; i <SIZE ; i ++)
214
{
215
// zakladamy z e d l a t a k i e g o r ow n an ia
216
// s y g n a l
s i e s k o n c z y w dobrym m n i e j s c u :
217
tmp=t a b l i c a [ i ]+ t a b l i c a [ i +1]+ t a b l i c a [ i + 2 ] ;
218
i f ( t a b l i c a [ i +3]>tmp )
219
{
220
t a b l i c a [ i +3]=0;
221
k o n i e c s y g n a l u=i +3;
222
i=SIZE +1;
223
}
224
i f ( i >(SIZE −3))
225
{
226
i=SIZE +1;
227
}
228
}
229
230
231
r e t u r n k o n i e c s y g n a l u ;
232
}
233
234
235
// f u n k c j a k o p i u j e nowo z a p a m i e t a n y s y g n a l do t a b l i c y
236
// z a l e z n e j od w c i s n i e t e g o w c z e s n i e j p r z y c i s k u
237
// o b s l u g i w a n e p r z y c i s k i
: 1 , 2 , 3
238
// kod = w a r t o s c w c i s n i e t e g o p r z y c i s k u
239
// t a b l i c a = t a b l i c a
g d z i e
j e s t z a p a m i e t a n y s y g n a l
240
// tab1 , tab2 , t a b 3 − t u t a j zapamietujemu
241
v o i d p r z e k o p i u j d o z a p a m i e t a n i a ( v o l a t i l e u08 kod )
242
{
19
243
i n t
i =0;
244
i f ( kod==1)
245
{
246
f o r ( i =0; i <SHORT SIZE ; i ++)
247
{
248
t a b 1 [ i ]= t a b l i c a [ i ] ;
249
}
250
}
251
i f ( kod==2)
252
{
253
f o r ( i =0; i <SHORT SIZE ; i ++)
254
{
255
t a b 2 [ i ]= t a b l i c a [ i ] ;
256
}
257
}
258
i f ( kod==3)
259
{
260
f o r ( i =0; i <SHORT SIZE ; i ++)
261
{
262
t a b 3 [ i ]= t a b l i c a [ i ] ;
263
}
264
}
265
266
}
267
268
// f u n k c j a odwrotna do p o p r z e d n i e j
269
// k o p i u j e z o d p o w i e d n i e j t a b l i c y
z a l e z n i e od
270
// wybranego p r z y c i s k u ( tab1 , tab2 , t a b 3 )
271
// do t a l i c y g l o w n e j = t a b l i c a w c e l u w y s l a n i a kodu
272
// p r z e z RS ‘ a badz p r z e z p o d c z e r w i e n
273
v o i d p r z e k o p i u j d o w y s l a n i a ( v o l a t i l e u08 kod )
274
{
275
i n t
i =0;
276
i f ( kod==1)
277
{
278
f o r ( i =0; i <SHORT SIZE ; i ++)
279
{
280
t a b l i c a [ i ]= t a b 1 [ i ] ;
281
}
282
}
283
i f ( kod==2)
284
{
285
f o r ( i =0; i <SHORT SIZE ; i ++)
286
{
287
t a b l i c a [ i ]= t a b 2 [ i ] ;
288
}
289
}
290
i f ( kod==3)
291
{
20
292
f o r ( i =0; i <SHORT SIZE ; i ++)
293
{
294
t a b l i c a [ i ]= t a b 3 [ i ] ;
295
}
296
}
297
298
299
}
300
301
302
/∗ −−−−−−−−−−−−−−−−−−−−− PETLA GLOWNA−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ∗/
303
304
i n t main ( v o i d ) {
305
s b i (PORTD, PD6 ) ;
// zeby d z i a l a l
o d b i o r n i k
306
s b i (DDRD,DDD7 ) ;
// zeby d z i a l a l PWM
307
s b i (PORTD, PD5 ) ;
// d i o d y s y g n a l i z a c j i s t a n u
308
s b i (PORTD, PD4 ) ;
// d i o d y podlaczamy do
309
s b i (PORTD, PD3 ) ;
//PD5 , PD4 i PD 3
310
s b i (DDRD,DDD5 ) ;
311
s b i (DDRD,DDD4 ) ;
312
s b i (DDRD,DDD3 ) ;
313
314
315
r s 2 3 2 i n i t (UBBR) ;
// i n i c j a l i z a c j a UARTA
316
s e i ( ) ;
// g l o b a l n e o d b l o k o w a n i e prze rwa n
317
KBD init ( ) ;
// i n i c j a l i z a c j a
k l a w i a t u r y
318
T i m e r 1 I n i t ( ) ;
// wlaczamy TIMER1 do o d b i o r u
319
e n d w a i t =0;
// z e r o w a n i e na w s z e l k i wypadek
320
PWM Init ( ) ;
// i n i c j u j e m y PWM
321
322
i n t
i =0;
323
f o r ( i =0; i <SIZE ; i ++)
// na w s z e l k i e wypadek
324
t a b l i c a [ i ] = 0 ;
325
326
327
w h i l e ( 1 )
328
{
329
330
// P i e r w s z e stadium − z a r a z po w l a c z e n i u
331
// zmiana s t a n u p r z y j d z i e po w c i s n i e c i u dowolnego k l a w i s z a
332
i f ( ( s t a t e == IDLE ) && ( k l a w i s z=KBD klawisz ()) >0 )
333
{
334
i t o a ( k l a w i s z , buf , 1 0 ) ;
// w y s w i e l t k t o r y k l a w i s z w c i s n i e t y
335
r s 2 3 2 p r i n t ( b u f ) ;
336
r s 2 3 2 p r i n t ( ”WAIT MODE ON \ r \n ” ) ;
337
s t a t e=WAIT;
// zmien s t a n
338
z g a s ( ) ;
// z a s y g n a l i z u j zmiane
339
z a p a l ( 0 ) ;
// i z a p a l d i o d e 0
340
21
341
}
342
// czekamy co z r o b i c
:
z a p i s a c kod (LOAD COAD) c z y w y s l a c (TRANSMIT CODE)
343
i f ( ( s t a t e == WAIT) && ( k l a w i s z=KBD klawisz ())==16)
344
{
345
i t o a ( k l a w i s z , buf , 1 0 ) ;
346
r s 2 3 2 p r i n t ( b u f ) ;
347
r s 2 3 2 p r i n t ( ”LOAD CODE \ r \n ” ) ;
348
s t a t e=LOAD CODE;
349
z g a s ( ) ;
350
z a p a l ( 1 ) ;
351
}
352
353
// wybrano p o b i e r a n i e kodu
354
// wlaczamy Timer1 i czekamy az c o s
s i e p o j a w i na w e j s c i u c z u j n i k a
355
i f ( s t a t e == LOAD CODE)
356
{
357
r s 2 3 2 p r i n t ( ” Czekamy na t r a n s m i s j e \n\ r ” ) ;
358
T i m e r 1 I n i t ( ) ;
// t i m e r 1 do wczytywania s t a r t
359
l i c z =0;
// z e r u j e m y f l a g e
i l e
j u z
360
// b y l o prze rwa n
361
w h i l e ( l i c z <(SIZE − 1 ) ) { ; }
// c z e k a j na c a l y kod
362
T i m e r 1 S t o p ( ) ;
// kod z a p a m i e t a n y s t o p
363
l i c z =0;
// z e r o j
l i c z n i k pr zer wan
364
r s 2 3 2 p r i n t ( ” Zapamietane \ r \n ” ) ;
365
sprawdz ( ) ;
// p o b i e z n e s p r a w d z a n i e kodu
366
//w d a l s z e j
c z e s c i
p r o j e k t u
367
// warto t u t a j
368
// wprowadzic s y g n a l i s p r
369
// c z y c a l y kod j e s t d o b r z e
370
// z a p a m i e t a n y
371
z g a s ( ) ;
372
z a p a l ( 0 ) ;
// z a s y g n a l i z u j zmiane s t a n u
373
z a p a l ( 1 ) ;
374
t a b l i c a [ 0 ] = 0 ;
// e l e m e n t 0 w t a b j e s t o d r z u c a n y
375
// bo n a s n i e
i n t e r e s u j e
376
k o n i e c s y g n a l u=o b e t n i j ( ) ;
// pokaz g d z i e s k o n c z y l i s m y
377
// o b c i n a n i e
378
s t a t e=CONFIRM;
379
r s 2 3 2 p r i n t ( ” K l a w i s z w c i s n i j \ r \n ” ) ;
380
}
381
// p r z y p i s z kod do k l a w i s z a a l b o o d r z u c go
382
i f ( s t a t e == CONFIRM)
383
{
384
w h i l e ( ( k l a w i s z=KBD klawisz ( ) ) = = 0 ) { ;
// czekamy na k l a w i s z
385
i f ( k l a w i s z ==16)
// o d r z u c kod j a k
386
{
// w c i s n i e m y p r z y c i s k 16
387
f o r ( i =0; i <SIZE ; i ++)
388
{
389
t a b l i c a [ i ] = 0 ;
22
390
k o n i e c s y g n a l u =0;
391
}
392
r s 2 3 2 p r i n t ( ” Dane w y c z y s z c z o n e \ r \n ” ) ;
393
s t a t e=WAIT;
394
z g a s ( ) ;
395
z a p a l ( 0 ) ;
396
r s 2 3 2 p r i n t ( ”WAIT\ r \n ” ) ;
397
}
398
e l s e
// j a k w c i s n i e m y c o s i n n e g o
399
{
// t o p r z y p i s z o d p o w i e d n i e j
400
// t a b s y g n a l z a p a m i e t a n y
401
kod=k l a w i s z ;
402
p r z e k o p i u j d o z a p a m i e t a n i a ( kod ) ;
403
i f ( kod==1)
404
{
405
406
k o n i e c s y g n a l u 1=k o n i e c s y g n a l u ;
407
}
408
i f ( kod==2)
409
{
410
k o n i e c s y g n a l u 2=k o n i e c s y g n a l u ;
411
}
412
i f ( kod==3)
413
{
414
k o n i e c s y g n a l u 3=k o n i e c s y g n a l u ;
415
}
416
i t o a ( kod , buf , 1 0 ) ;
417
r s 2 3 2 p r i n t ( ” Zapamietany k l a w i s z :
” ) ;
418
r s 2 3 2 p r i n t ( b u f ) ;
419
r s 2 3 2 p r i n t ( ” \ r \n ” ) ;
420
s t a t e=WAIT;
// s y g n a l z a p a m i e t a n y wracamy
421
z g a s ( ) ;
// do s t a n u o c z e k i w a n i a
422
z a p a l ( 0 ) ;
// z a s y g n a l i z u j powrot do s t a n u
423
r s 2 3 2 p r i n t ( ”WAIT\ r \n ” ) ;
424
}
425
426
427
}
428
429
//w tym s t a n i e mozemy w y s l a c z a p a m i e t a n e s y g n a l y p r z e z RS
430
i f ( ( s t a t e == WAIT) && ( ( k l a w i s z=KBD klawisz ())==15) )
431
{
432
i t o a ( k l a w i s z , buf , 1 0 ) ;
433
r s 2 3 2 p r i n t ( b u f ) ;
434
r s 2 3 2 p r i n t ( ”RS SEND \ r \n ” ) ;
435
s t a t e=RS SEND ;
436
z g a s ( ) ;
437
z a p a l ( 0 ) ;
// s y g n a l i z u j p r z y g o t o w a n i e do w y s y l a n i a
438
z a p a l ( 1 ) ;
23
439
z a p a l ( 2 ) ;
440
r s 2 3 2 p r i n t ( ” w c i s n i j
k l a w i s z s y g n a l u aby r o z p o c z a c w y s y l a n i e \ r \n ” ) ;
441
}
442
// t u t a j wybieramy k t o r y s y g n a l ma z o s t a c p r z e s l a n y
443
// wybieramy p o p r z e z n a c i s n i e c i e o d p o w i e d n i e g o k l a w i s z a
444
//1 = s y g n a l 1 , 2 = s y g 2 i t d
445
i f ( s t a t e == RS SEND)
446
{
447
w h i l e ( ( k l a w i s z=KBD klawisz ( ) ) = = 0 ) { ; }
// czekamy na k l a w i s z
448
p r z e k o p i u j d o w y s l a n i a ( k l a w i s z ) ;
// k l a w i s z w c i s n i e t y
449
// k o p i o w a n i e do
450
// t a b l i c y g l o w n e j z
451
// t a b l i c y
z a l e z n e j
452
// od w c i s n i e t e g o
453
// p r z y c i s k u
454
i f ( k l a w i s z ==1)
// d a l e j kopiujemy
455
// m i e j s c a w ktorym
456
{
// s k o n c z y l
s i e
s y g n a l
457
k o n i e c s y g n a l u=k o n i e c s y g n a l u 1 ;
458
r s 2 3 2 p r i n t ( ” wysylamy kod \ r \n ” ) ;
459
s t a t e=SENDING ;
460
}
461
i f ( k l a w i s z ==2)
462
{
463
k o n i e c s y g n a l u=k o n i e c s y g n a l u 2 ;
464
r s 2 3 2 p r i n t ( ” wysylamy kod \ r \n ” ) ;
465
s t a t e=SENDING ;
466
}
467
i f ( k l a w i s z ==3)
468
{
469
k o n i e c s y g n a l u=k o n i e c s y g n a l u 3 ;
470
r s 2 3 2 p r i n t ( ” wysylamy kod \ r \n ” ) ;
471
s t a t e=SENDING ;
472
}
473
i f ( k o n i e c s y g n a l u ==0)
// z a b e z p i e c z e n i e j a k b y s y g n a l z o s t a l
474
{
// z l e
o b c i e t y
475
k o n i e c s y g n a l u=SIZE ;
476
}
477
f o r ( i =1; i <k o n i e c s y g n a l u ; i ++)
// w y s y l a n i e kodu na t e r m i n a l
478
{
// n i e wysylam p i e r w s z e g o
479
// bo n i e
j e s t p o t r z e b n y
480
i t o a ( t a b l i c a [ i ] , buf , 1 0 ) ;
481
r s 2 3 2 p r i n t ( b u f ) ;
482
r s 2 3 2 p r i n t ( ” \ r \n ” ) ;
483
}
484
s t a t e=WAIT;
// kod wyslany zmien s t a n na
485
z g a s ( ) ;
// p o c z a t k o w y i z a s y g n a l i z u j t o
486
z a p a l ( 0 ) ;
487
r s 2 3 2 p r i n t ( ”WAIT \ r \n ” ) ;
24
488
}
489
// j a k k l a w i s z w c i s n i e t y
i
n i e chcemy a n i zapamietywac
490
// a n i w y s y l a c p r z e z RS t o z n a c z y z e chcemy w y s l a c p o d c z e r w i e n i a
491
i f ( ( s t a t e == WAIT)&&(( k l a w i s z=KBD klawisz ( ) ) ! = 1 6 )
492
&&( k l a w i s z !=0)&&( k l a w i s z ! = 1 5 ) )
493
{
494
r s 2 3 2 p r i n t ( ”TRANSMIT CODE \ r \n ” ) ;
495
s t a t e=TRANSMIT CODE;
496
z g a s ( ) ;
// z a s y g n a l i z u j z e bedziemy
497
z a p a l ( 2 ) ;
// w y s y l a c p o d c z e r i e n i a
498
r s 2 3 2 p r i n t ( ” K l a w i s z w c i s n i j \ r \n ” ) ;
499
}
500
// s t a n p r z y g o t o w a n i a do w y s y l a n i a
501
// czekamy na w c i s n i e c i e o d p o w i e d n i e g o k l a w i s z a
502
// j a k w c i s n i e t y k l a w i s z ma p r z y p i s a n y s y g n a l t o go wysylamy
503
// j a k n i e ma t o wracamy do s t a n u p o c z a t k o w e g o
504
i f ( s t a t e == TRANSMIT CODE)
505
{
506
w h i l e ( ( k l a w i s z=KBD klawisz ( ) ) = = 0 ) { ; }
507
i f ( k l a w i s z ==1)
508
{
509
p r z e k o p i u j d o w y s l a n i a ( k l a w i s z ) ;
510
k o n i e c s y g n a l u=k o n i e c s y g n a l u 1 ;
511
r s 2 3 2 p r i n t ( ” wysylamy kod \ r \n ” ) ;
512
s t a t e=SENDING ;
513
}
514
i f ( k l a w i s z ==2)
515
{
516
p r z e k o p i u j d o w y s l a n i a ( 2 ) ;
517
k o n i e c s y g n a l u=k o n i e c s y g n a l u 2 ;
518
r s 2 3 2 p r i n t ( ” wysylamy kod \ r \n ” ) ;
519
s t a t e=SENDING ;
520
}
521
i f ( k l a w i s z ==3)
522
{
523
p r z e k o p i u j d o w y s l a n i a ( 3 ) ;
524
k o n i e c s y g n a l u=k o n i e c s y g n a l u 3 ;
525
r s 2 3 2 p r i n t ( ” wysylamy kod \ r \n ” ) ;
526
s t a t e=SENDING ;
527
}
528
e l s e
529
{
530
r s 2 3 2 p r i n t ( ” z l y k l a w i s z \ r \n ” ) ;
531
s t a t e=WAIT;
532
z g a s ( ) ;
533
z a p a l ( 0 ) ;
534
r s 2 3 2 p r i n t ( ”WAIT \ r \n ” ) ;
535
}
536
}
25
537
// t u t a j wysylamy kod
538
i f ( s t a t e == SENDING)
539
{
540
r s 2 3 2 p r i n t ( ” wysylamy kod \ r \n ” ) ;
541
//WYSYLANIE KODU
542
g d z i e j e s t e m =2;
// p i e r w s z y j u z zapamietamy
543
// w i e c pamietamy 2
544
PWM Init ( ) ;
// s t a r t PWM
545
Timer1 CTCInit ( ) ;
// s t a r t Timer1 do w y s y l a n i a CTC
546
t a b l i c a [ SIZE ] = 0 ;
// p i e r w s z y nas n i e
i n t e r e s u j e
547
w h i l e ( ! k o n i e c w y s y l a n i a ) { ; }
// czekamy na k o n i e c w y s y l a n i a
548
r s 2 3 2 p r i n t ( ”WYSLANO” ) ;
549
//KONIEC WYSYLANIA
550
s t a t e=WAIT;
551
z g a s ( ) ;
552
z a p a l ( 0 ) ;
553
r s 2 3 2 p r i n t ( ”WAIT \ r \n ” ) ;
554
}
555
556
} // end { w h i l e ( ) }
557
r e t u r n 0 ;
558
} // end { main ( ) }
26