Mikrokontrollerek Alkalmazástechnikája Házi Feladat Szikra István részére
Neptun kód: URLJRN
Feladat címe: Infra Távirányító vevő, dekódoló Feladat konzulense: dr. Benesóczky Zoltán Feladat leírása: A feladat célja egy olyan mikrokontrolleres rendszer megtervezése és megvalósítása, amely képes SPACE ENCODING kódolással küldött infra jel demodulálására, kódminták felismerésre, az N bites kód visszafejtésére és átküldésére számítógépre. A számítógéppel a kommunikáció RS232 porton soros kommunikációval valósul meg. A dekódoláshoz szükséges paraméterek (bitszám, fejléc, kifutórész, ismétlés, ‘1’, ‘0’ kódmintái) a mikrokontroller EEPROM-jában tárolódnak, és számítógépről átkonfigurálhatók. A számítógépről egyéb műveletek is végezhetők (diagnosztika).
Specifikáció: Az egység 36kHz-el modulált SPACE ENC kódolású infra jel vételére alkalmas. A kódolás default beállításait egy AIWA RC-AVR15 típusú távirányítóra határoztam meg (winlirc program analizátor funkciója, és hangkártyával történő digitalizálás alapján). Ezek a következők: - bits 32 bitszám - header 8981 4446 fejléc - one 623 514 egyes - zero 623 1626 nulla - ptrail 623 kifutó rész - repeat 8980 2199 ismétlés Az időzítési értékek µs-ban értendőek, és átlag értékek. A belső számláló 128µs-onként lép egyet (1024/8MHz). A paraméterekben tartományokat kell megadni (a jel időzítési- és a “mintavételből” adódó pontatlanság miatt) amik a számláló értékére vonatkoznak. Pl. ebben az esetben 8981µs/128µs-ra 70.1 adódik, ezért a paramétert [70-72]-re választottam, 4446µs/128µs-ra 34,73 -> [34-36]… 514µs/128µs -> 4.01 -> [3-6]… Ezzel a beállítással többféle távirányító is működik, de új konfiguráció is beállítható az alábbi módon: Soros porton (38400 kbps-mal, paritás nélkül, 8 adatbittel) kiküldjük a konfigurációs mód kiválasztását :‘C’ (byte); majd a bitszámot 1..64 (1 byte); fejlécet (alacsony min, alacsony max, magas min, magas max) (egyenként 1..255) (4 byte); ismétlést (4 byte); ‘egyes’-t (4 byte); ’nullá’-t (4 byte) és végül a kifutó rész időzítéseit (min, max) (2 byte). Ezután az EEPROM-ba való mentéshez ki kell küldeni egy ‘S’-et (byte). Az EEPROM-ból a paraméterek betöltését ‘L’-lel végezhetjük. Amennyiben az EEPROM tartalmaz elmentett konfigurációt, az reset után automatikusan betöltődik, ellenkező esetben a default beállítások lesznek érvényben. Az EEPROM tartalmának olvasását ‘E’, a RAM tartalmának olvasását ‘R’ küldésével kezdeményezhetjuk, és ezután a mikrokontroller a soros porton továbbítja a kért adatokat. Így lehetőség van a kódolási parameterek meghatarozasara a memoria dump-ból is. SPACE ENCODING kódolás (az alábbi jeleket hangkártyával digitalizáltam 48kHz-el): Kód: 16 bites távirányító kód (0x8976), 16 bites gomb kód (0x3EC1)
Header
0
1 0
1 0
1 11 0
1 1 0
Ismétlés:
Repeat
ptrail
0
0
1 0
1 1 1 1 0
0
1 1 0
1 0
0
1 11 0
0
0
1 1 0
0
1 0
1 1 11 0
0
1 ptrail
11 0
Blokkvázlat :
Kijelzés
Infra jel vevő
jelkondicionáló
Jel illesztő
demodulátor
SFH5110-36
Jel impulzushosszainak mérése, bufferbe tarolasa Atmel AVR 8535
Jel dekódolása
LEDek
Kódolási paraméterek konfigurálása, tárolása
EEPROM
Dekódolt jel, belső állapot információ továbbítása
Interface illesztő
Parancs értelmezés és végrehajtás
Interface illesztő MAX232
A jelkondicionáló felerősíti az infra vevő által vett jelet, és a demoduláló kiválasztja a 36kHz-es vivőfrekvenciájú komponenst, ezután az illesztő TTL jelszinté alakítja. A következő blokk feladata a jelben megtalálható impulzusok hosszának a megmérése, az adatok tárolása. Ha impulzus érkezik, azt a kijelző felé is továbbítja, az időzítési adatokhoz pedig hozzáférést biztosít a dekódoló, és a kommunikációs egység számára. A dekódoló előállítja a kódot az időzítési adatokból a kódolási paraméterek alapján, és a dekódolás folyamatát kijelzi. Ezután a kimeneti kommunikációs egység továbbítja a számítógép felé az illesztőn keresztül. A bemeneti interfészillesztőn keresztül
az adat a parancsértelmezőbe kerül, ami az adat alapján elvégzi a szükséges művelet. Ez lehet: - az időzítési adatok kiolvasása, amikor a kommunikációs egység továbbítja a buffer tartalmát a PC felé - a kódolási paraméterek változtatása, amikor a PC-ről érkező adatokat betölti a paramétertárolóba - paraméterek mentése, amikor a paramétertároló a paramétereket az EEPROM-ba írja - paraméterek töltése, amikor a paramétertároló beolvassa a paramétereket az EEPROM-ból - EEPROM olvasás, amikor a komunikációs egység továbbítja az EEPROM tartalmát a PC felé A hardware elemek minimalizálása érdekében egy integrált infra érzékelőt, néhány LEDet, és egy RS232-es illesztőt választottam a mikrokontroller mellé. Ezeket a szaggatott vonallal rajzolt dobozok jelölik. Hardware blokkvázlat: Soros port
RS232 illesztő
Tápegység
Infra vevő
Programozó interface
Atmel AVR 8535
LED kijelző
Órajel
A soros port D-SUB 9-es csatlakozót jelöl, az RS232 illesztő, pedig jelszint illesztő (MAX232, és kondenzátorok, ahogy az a kapcsolási rajzon látszik). A tápegység +5V-ot szolgáltat. A LED kijelző zöld, sárga, piros LEDekből és ellenállásokból áll. Az órajelet 8MHz-es kvarc állítja elő. Az infra vevő SFH5110-36-os IC, ami a mikrokontroller interrupt lábara van kötve. Részletesebb információk a mellékelt kapcsolási rajzon.
Szoftver: A program egy főprogramból, hozzá tartozó eljárásokból és megszakításokból épül fel. Ezek globális adatstruktúrákon keresztül kommunikálnak egymással, így nincsenek paramétereik. (Az eljárás által módosított adatstruktúrákat zárójelben jelzem) Megszakítások: o UART_REC: (bemeneti FIFO) Soros portról érkező adat bemeneti FIFO-ba mentése. o UART_TRANS: (kimeneti buffer) Kimeneti bufferből adat küldése soros portra. o OWEFLOW0 : (Infra kód, LED, Timeout) Timer interrupt. Működést jelző ledet villogtatja. Egy bizonyos idő eltelt után (timeout=timeout+1, ha timeout>X) törli az infra kódot, hogy ha úgy érkezik ismétlés, hogy előtte nem érkezett érvényes kód, akkor ne küldje ki az előző érvényes kódot. o INTERRUPT0: (Infra idő buffer, LED, Timeout) Külső megszakítás (felfutó és lefutó élre működik). Törli a Timeoutot. Az impulzus szélességét belerakja az Infra idő buffer-be. LEDet villogtat. Eljárások: o uart_send(buffer): (kimeneti buffer) (Egyedül ennek az eljárásnak van paramétere.) Megvárja, amíg a kimeneti buffer kiürül. Ezután a kimeneti bufferbe tölti a paraméterben megadott buffer-t, és elindítja az adatátvitelt. o uartEventHandler: (bemeneti FIFO, kódolási paraméterek) Ha a bemeneti FIFO nem üres, akkor kivesz belőle egy byte-ot, és az értékének megfelelő műveletet hajtja végre: ‘L’ : kódolási paraméterek betöltése EEPROMból ‘S’ : kódolási paraméterek elmentése EEPROMba ‘C’ : 19 byte-ot kiolvas a bemeneti FIFO-ból (addig vár, amíg megjön az összes adat), és beítja a kódolási paraméterekbe ‘R’ : A RAM tartalmát kiküldi soros porton (uart_send eljárással) ‘E’ : Az EEPROM tartalmát kiküldi soros porton o Infra_SpaceDec: (Infra kód, Infra idő buffer) Ha van elegendő adat az Infra idő buffer-ben, megvizsgálja, hogy az ismétlés időzítésein belül van-e. Ha igen, akkor kiveszi a bufferből, és soros porton kiküldi az Infra kódot, és egy LED-et is kigyújt. Ha nem, akkor megvizsgálja, hogy az a fejléc időzítésein belül van-e. Ha igen, és megvan az összes adat a teljes kód dekódolásához, akkor kiveszi a fejlécet az Infra idő buffer-ből. Ezután egy Infra bitszám lépésű ciklust indít: megvizsgálja, hogy egyesnek vagy nullásnak megfelelő adat van-e a bufferben. Ennek megfelelően beállítja, vagy törli a megfelelő bitet, LED-et, és kiveszi az adatokat a bufferből. Ha egyikkel sem egyezik, akkor hibajelzéssel kilép a ciklusból. A ciklus lejárta után, ha nem volt hiba, elküldi a kódot az uart_send-del. Ha se fejléc, se ismétlés nem ismerhető fel, akkor kivesz egy adatot a bufferből, ezzel lehetővé téve, hogy a hibásan vett adatoktól megszabaduljon.
Főprogram: Beállítja a portok irányát. Kezdőértéket ad a változóknak (pl. stack pointer). Ha van EEPROMba mentett beállítás, akkor azt betölti. Inicializálja a megszakításokat, majd engedélyezi azokat. Egy végtelen ciklusban meghívja a decode, és az uart_handler rutinokat. A FIFO, buffer mint adatstruktúrák magukba foglalják a tároláshoz használt memóriateröletet, a címzéshez használt poinrtreket/indexeket, és esetenként flageket (pl buffer üres). (A buffer- ill. FIFO - ba/ból való írás/olvasás természetesen a buffer pointereinek, FIFO indexeinek változtatását (növelését) is magába foglalják.) A program részletesebb leírása megtalálható a mellékelt forráskódban.
Felhasználói leírás: - Üzembe helyezés: A készüléket a COM1 portra kell csatlakoztatni. Az 5V-os tápot be kell kapcsolni. - Konfigurálás: A mellékelt programban ki kell választani a távirányító típusát (szükség esetén egyedi beállítások definiálására is van lehetőség). - Installáció: Ezután telepíteni kell a kódokat fogadó szoftvert, amellyel irányítani kívánjuk a számítógépet. A soros port sebességét 38 400 kbps-re kell állítani, majd az egyes kódokhoz funkciókat kell rendelni (ezek a szoftver használati útmutatójában (user manual) leírt módon végezhetők el). Több ilyen szoftver is létezik, az egyik az ingyenes IRAssistant, melyhez külön kell telepíteni a general COM drivert. Ezek letölthetők az alábbi címről: http://www.irassistant.com/dotcom/v_current/index.php?url=download.inc - Használat: Az infra távitányító gombjainak nyomogatásával távirányíthatjuk a PC-t. Kiegészítő funkció: a készülék PCs billentyűzet csatlakoztatására is fel van készítve, így ezzel is vezérelhetjük a PC-t. Természetesen nem csak PC-hez, hanem bármilyen soros porttal rendelkező egységhez csatlakoztatható a készülék.
5
4
3
2
1
JR? Vcc JS?
Vcc KBD Clock
F1 C1 100u
+
1 2 3 4
C16 10u
+
PCTap+5V
5
2
4
Vcc
100mA
KBD Data0
0
3
0
1
D
CIRDIN_5-R Vcc
0
6 5 4 3 2 1 44 43 42 41 40
D
1 2 3 4
Vcc
C15
C2 22p
Vcc Vcc
3
GND
2
OUT
1
2
RESET U4
MOSI MISO SCK
R1 10k
D?
C
2.2n
1N4148
C3 4.7n
SW1
0
Y1
C4
0 1
0
0
0
0
8MHz
22p
SFH5110
0 7 8 9 10 11 12 13 14 15 16 17
PB5(MOSI) PB6[MISO) PB7[SCK) RESET Vcc GND XTAL2 XTAL1 PD0(RxD) PD1(TxD) PD2(INT0)
PD3(INT1) PD4(OC1B) PD5(OC1A) PD6(ICP) PD7(OC2) Vcc GND PC0 PC1 PC2 PC3
Vcc
C17 1n
18 19 20 21 22 23 24 25 26 27 28
0
D?
330
D? LEDP
330
D? LEDZ
R?
PB4(SS) PB3(AIN1) PB2(AIN0) PB1(T1) PB0(T0) GND Vcc PA0(ADC0) PA1(ADC1) PA2(ADC2) PA3(ADC3)
U2
R?
R? R?
39 38 37 36 35 34 33 32 31 30 29
330
D? LEDZ
330 Vcc
LEDS
0
AT90S8535PLCC
Vcc
Receive Data
JDR1
U1
1 6
6
Data Set Ready
7
7
Request To Send
8 Data Terminal 4 Ready 4 9 5 5
8
Clear To Send
Receive Data 2 Transmit Data 3
2 3
0 SerialP
C9 1u C10 9
Ring Indicator
Vcc
1u C12 1u
R1IN R2IN T1IN T2IN
1 3 4 5 2 6
C+ C1C2+ C2V+ V-
C13 1u
R1OUT R2OUT T1OUT T2OUT
12 9 14 7 Vcc
JS2
0
0 Vcc
C5 100n
C7 100n
0
0
LCDvez C11 1u
Szikra Istvan
0
A
Title
MAX232
Infra Vevo
0
Size A
SerP[1..9]
Date: 5
C8 100n
Vcc
1 2 3 4 5 6 7 8 9 10 11 12 13 14
Carrier Detect 1
13 8 11 10
1 2 3 4 5 6 7 8 9 10 11 12 13 14
Transmit Data
B
Vcc C6 100n
LCDC_Reset LCDC_nRD LCDC_nWR LCDC_nCS LCDC_A0
RS232 illeszto
C
R?
B
A
D? LEDS
330 PA4(ADC4) PA5(ADC5) PA6(ADC6) PA7(ADC7) ARef AGnd AVcc PC7 PC6 PC5 PC4
4
3
Document Number
Sunday, May 04, 2003 2
Rev 1.2 Sheet
1
of 1
2
Mennyiség 1 1 1 5 4 1 1 1 2 5 1 2 2 1 1 1 1 1 1 1 1 1
Érték Leírás 100mA biztosíték 100u elektrolit kondenzátor 10u elektrolit kondenzátor 1u kerámia kondenzátor 100n SMD kondenzátor 4.7n SMD kondenzátor 2.2n SMD kondenzátor 1n SMD kondenzátor 22p SMD kondenzátor 330 ellenállás 10k ellenállás LEDZ zöld LED LEDS sárga LED LEDP piros LED 1N4148 dióda 8MHz Kvarc AT90S8535-PLCC mikrokontroller MAX232-DIP RS232 illesztő SFH5110-36 Infra vevő DSUB-9 soros port csatlakozó (anya) kisfloppy táp csatlakozó nyomógomb