Pilot uniwersalny

background image

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

background image

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

background image

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

background image

Rysunek 2: Różnice w protokołach - Nokia, NEC, JVC

4

background image

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

background image

• 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

background image

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

background image

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

background image

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

background image

Rysunek 5: Wykres przebiegów otrzymanych z jednego z pilotów

10

background image

Rysunek 6: Sygnal z przycisku CD na pilocie do wierzy Philips

Rysunek 7: Sygnal z przycisku TAPE na pilocie do wierzy Philips

11

background image

Rysunek 8: Sygnal z przycisku VOL+ na pilocie do wierzy Philips

12

background image

Rysunek 9: Sygnal z przycisku VOL- na pilocie do wierzy Philips

13

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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


Wyszukiwarka

Podobne podstrony:
UNIWERSALNY - Zone R324, Komputer, Pilot uniwersalny - instrukcje obsługi i tabele kodów
Uniwersalny URC22B-7B Pl, Pilot uniwersalny URC22B-7B
Pilot uniwersalny Philips SBCRU240 00 DFU pol
PILOT UNIWERSALNY
Pilot uniwersalny URC22B-7B, Pilot uniwersalny URC22B-7B
Instrukcja URC22B pilot uniwersalny
Pilot uniwersalny Medion MD4688 instrukcja
PILOT UNIWERSALNY SilverCrest lista kodów PL
pilot uniwersalny MAXY 1708
pilot uniwersalny tcm 225926
Pilot uniwersalny URC22B
PILOT SAMOKOPIUJĄCY UNIWERSALNY BRAMA ALARM INNE
ASERTYWNOŚĆ Uniwersytet Śląski

więcej podobnych podstron