ATMega32 a bluetooth

rek bych ze tohle je prvni pokus :wink:

Sleduji tuhle diskuzi a nestačím se divit. Adame, snažíš se programovat nebo jenom lepit cizí kódy dohromay ? Měl bys začít programovat. Co se IR ovladačů týká, tak čtení kódu sice není úplně triviální jako například snímání rotačního kodéru, nicméně není to ani žádná divočina. Napsal jsem si ovladač, který využívá 16-ti bitový čítač (Timer/Counter 1) v režimu CTC a používá přerušení pro Input Capture (je na něj připojen TSOP přijímač a používá se jako externí přerušení), Timer Comapre B (timeout pro zápis kódu z DO) a Timer Compare A (timeout pro konec vysílání z DO). Celý kód má po překladu něco málo přes 600 bytů (psáno v asm) a jde z něj 8-bitový status (příznak požadavku zpracování kódu z DO a čítání počtu opakování vysílaného kódu z ovladače) a 48-bitová hodnota vyslaného kódu (s málokterým ovladačem vystačíš jenom s 16 bity). Pokud se chceš něco naučit, popíšu Ti tady, co které přerušení dělá, ostatní je na Tobě :

Input Capture provádí :
Načtení hodnoty ICR1. Pokud je nula, znamená to, že čítač stojí = 1. impulz z ovladače.
Pokud ICR1 není nula, zkontroluje se hodnota ICR1 na délku bitu. Pokud je menší, než 1,7 ms, zapíše se 0, pokud je menší, než 2,7 ms, zapíše se 1. Pokud je delší, než 2,7 ms, nezapisuje se nic = start pulz nebo repeat pulz.
Zápis probehně tak, že 46.-0. bit se odroluje doleva (tím se 46. bit posune na 47. a 0. bit se posune na 1.) a na 0. bit se uloží načtený bit.
Hodnota kódu se načítá na dočasnou pozici.
Vynuluje a spustí se časovač.

Compare Match A provádí :
Vynulování dočasné pozice a hodnoty načteného kódu DO, zastavení čítače, vynulování počtu opakování a nastavení bitu pro zpracování ve statusu. Čítač se v CTC módu sám vynuluje.

Compare Match B provádi :
Kontrolu dočasné pozice na 00 00 00 00 00 00.
Pokud je 00 00 00 00 00 00, přišel z DO jenom repeat pulz. Kód zůstane původní, zvětší se ve statusu počet opakování.
Pokud není 00 00 00 00 00 00, může jít buď o opakování nebo o nový kód. Zkontroluje se dočasný kód s minulým načteným. Pokud souhlasí, jenom se zvětší ve statusu počet opakování. Pokud kódy nesouhlasí, jedná se o nový kód - přepíše se minulý kód novým, ve statusu se nastaví počet opakování na 1.
Nastaví se příznak pro zpracování
Vynuluje se dočasný kód.

Inicalizace :
Nastavit Timer 1 na CTC režim a ICP na reakci na sestupnou hranu - čítač nespouštět
Nastavit OCR1A na 128 ms - nejdelší čas pro repeat kódu je NEC kód = 110 ms. Něco je ponecháno jako rezerva. Pokud čítač dočítá až sem, znamená to konec vysílání ovladače.
Nastavit OCR1B na 15 ms - Timeout pro uložení kódu. Pokud do 15 ms nepřijde další impulz z DO, bere se kód jako ukončený
Zapnout přerušeni pro ICIE1, OCIE1A a OCIE1B.

V programu pak s “ovladačem” pracuješ takto : Zkontroluješ status byte. Pokud je příznak zpracování nastaven, znamená to, že je načtený nový kód a ještě nebyl obsloužený. Vynuluješ příznak, uložíš status byte zpět a podle 48-bitového kódu provedeš, co potřebuješ.

Máš tady přesné instrukce, co a jak máš naprogramovat, abys dostal kód IR ovladače do kontroleru. Co s kódem DO uděláš (zobrazit na LCD, poslat přes UART do PC) je Tvoje věc. Pokud začínáš, tak to ber jako cvičení nebo domácí úkol.

A mimochodem, pokud nemáš v NB sériový port, co třeba tohle : aukro.cz/pl2303hx-usb-rs232-ttl- … 89061.html ? Používám ho u svého NB s Win7 64bit a šlape parádně.

Na kódu už pracuji, jsem jen začátečník a měl jsem jen spoustu otázek do začátku :slight_smile:, avšak zatím nemůžu psát přesné hodnoty, jelikož neznám kódy, k mému ovladači jsem našel jedině toto:

m.uloz.to/xg8NxC1/panasonic-rx-es23-5326-ir

Netuším co znamenají tyto údaje - shead=“1822” pone=“432” sone=“1281” pzero=“432” szero=“438” - číst umím takže mě asi dochází co to znamená, jen mi nejde do hlavy to p a s. . hledal jsem kódy i jinde ale v tabulce jsem je nenašel - mimochodem predata budu muset přijímat při každém stisku tlačítka?

Porozhlídnu se ještě po zbytku co máme doma, jestli bych nenašel nějaký jiný DO. Zatím mám jasno takže do té doby než to sesmolím a vyzkouším se na nic ptáti nebudu.

:arrow_right: administrator: příspěvek byl upraven
Odkaz byl vyjmut z code.

:arrow_right: administrator: přiloženy externí soubory
Panasonic_RX-ES23_5326.zip (527 Bytes)

Zrovna DO Panasonic mají délku kódu 48 bitů, takže Ti 16-bitová proměnná na kód nebude stačit …

Délky kódů ovladačů od některých zařízení :
VCR Daewoo - 8 bitů
DVD Hyundai - 32 bitů
Repro Genius - 32 bitů
DVD Technika - 24 bitů
VCR, TV, DVD, BD, Hifi věž Panasonic - 48 bitů
PVR Universe - 32 bitů

Jaki vidíš, tak u většiny ovladačů Ti 16 bitů opravdu nestačí. Výše popsaný SW přijímače DO je umí všechny. Kvůli dálkovému ovládání rolet a dalších věcí jsem si právě postavil zobrazovač kódů dálkových ovladačů, takže vím, co tento SW zvládne přijmout.

Také tuto diskuzi sleduji ze zvědavosti. Teď mě vrtá hlavou poslední příspěvek, koukal jsem na některé kódy z linků, které tu někdo poslal na první stránce, ale ty měly bitů jen 16, ne 48, jak to tedy je?

Kódy v tomto linku (remotecentral.com/cgi-bin/codes/philips/r24080_0/) jsou 32-bitové, lépe řečeno posílá se 8+8 bitů inv. adresa, 8+8 bitů inv. data = 16bitů, s inverzema 32bitů. Jednotlivá čísla znamenají rozestupy mezi jednotlivými změnami vstupu od přijímače. To není dekódovaný signál, ale v podstatě jenom časové značky jednotlivých změn na pinu. Bitové délky kódů, které jsem zde napsal jsou délky reálně načtených kódů ovladačů nasnímaných pomocí softwaru, který jsem popsal o něco výše.

Jo, a teď mi došlo, co Ti vrtá hlavou. Ovladače, které vysílají (např. NEC protokol) 8 bitů + 8 bitů invertovaných adresu a za tím 8 bitů + 8 bitů negovaných data sice posílají jenom 16 bitů, ale v rámci jednoduchosti a univerzálnosti je ovladač bere jako 32-bitový kód. Protože například zmíněný ovladač DVD Technika posílá 8 bitů adresy a 8+8(inv.) bitů data = 24 bitů. Panasonic třeba odešle řetězec adresa+data a pak teprve pošle inverzi tohoto řetězce. Tímto způsobem se jednak příjem zjednoduší a kódy ovladačů není nutné rozdělovat podle protokolu. Prostě tento SW zvládne přijmout data víceméně univerzálně i když na úkor toho, že počítá s délkou kódu 48 bitů. Rozlišení protokolu a detekci chyb (díky přijatému bytu a jeho negaci) lze udělat potom při zpracování kódu. Na druhé straně - přijmu-li data AAh 56h (s chybou) a v programu mám uloženo, že budu reagovat na AAh 55h (data, negace), tak přijatý AAh 56h neodpovídá uloženému kódu a nic se nestane.

Nebo neřešit přesné kódy, ale jen v módu učení zaznamenat do EEPROM sekvenci šířek pulzů pro jednotlivé povely (např. 1 puls = 1 bajt s rozlišením 20 us, nebo relativně k nejkratšímu impulsu) a pak je s určitou povolenou tolerancí vyhledávat.

To mi připadá celkem složitý a především náročný na paměť. Místo 6 bytů porovnávat minimálně 16 hodnot (pro 16-tibitový kód) a to ještě s tolerancí. Z Panasonic ovladačů mi leze 48 bitů kódu (celých 6 bytů) - to by bylo minimálně 48 hodnot + k tomu přidat nějaké hodnoty pro start pulz a repeat pulzy. Takhle z “driveru” vypadne 6 bytů včetně počtu opakování kódu a zbytek je na softwaru. Driver pokud nepřijímá žádný kód, tak je latentní a nezabírá kontroleru vůbec žádný strojový čas, protože se aktivuje prvním pulzem dálkáče a 128 ms po ukončení vysílání z dálkáče zastaví časovač a čeká na další impulz z dálkáče.

A v módu učení můžu načtených 6 bytů kódu uložit do EEPROM a pak načtený kód s uloženým(a) porovnávat.

Já to vidím tak že zadavatel by se měl nejdřív naučit trochu programovat MCU (asm,c)…

Tak on i ten univerzální driver by šel samozřejmě dost zoptimalizovat - adaptovat se na šířky pulzů a uchovávat jen bity 0/1, ale jasně že to už je hodně mimo rámec tazatele.

Pokud se ti místní serva zdají drahý, tak zkus sice ne extra kvalitní, nicméně funkční objednat na eBay za cca 50Kč/ks - poštovný zadarmo. Sám mám doma pár podobných a na silově nenáročný použití mě bohatě dostačují.