Implementácia dekodéra RC5-BIN v mikroprocesore Cypress

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání

Implementácia dekodéra RC5-BIN v mikroprocesore Cypress

V tejto kapitole bude opísaný príjem dát, ich dekódovanie, posielanie výstupov po dekódovaní signálu cez RS 232, príjem povelov do procesora z nadradeného zariadenia (v našom prípade z PC) cez RS 232 a na základe prijatých povelov vykonávanie akcií a odosielanie kódovaných povelov v protokole RC-5. Všetky vysvetľované časti sú sprevádzané príslušnými fragmentmi kódu Vývojové prostredie PSoC Designer umožňuje naprogramovať procesor aj v jazyku C, my sme si na implementáciu protokolu RC-5 na platforme procesora Cypress použili programovací jazyk assembler. K implementácií sme použili procesor Cypress s označením CY8C27443-24PXI.

Algoritmus dekódovania kódu RC-5

Ako už bolo spomenuté v predošlej kapitole 2, bolo potrebné vytvoriť algoritmus, ktorý bude schopný dekódovať prijatý povel aj pri miernej zmene nosného signálu. Preto bolo potrebné odmerať dĺžku prvej periódy a podľa nej ďalej riadiť dekódovanie. Dekódovanie sme vykonávali tak, že sme si bit rozdelili na dva polbity. Ako je možné vidieť z priebehu jedného bitu v kapitole 2, jeden z polbitov má vždy hodnotu logickej jednotky a ďalší hodnotu logickej nuly. Ak je hodnota prvého polbitu logická jedna a druhá logická nula, bit je predstavu hodnotu jedna. V opačnom prípade, ak prvý polbit má hodnotu logickej jednotky a druhý logickej nuly, bit predstavuje hodnotu logickej jednotky. Aby sme zistil akú hodnotu predstavuje daný bit, stačilo nám určiť hodnotu prvého alebo len druhého polbitu. Avšak aby sme sa predišli možným chybám, rozhodli sme sa merať hodnotu každého polbitu a následne korektne určiť hodnotu celého bitu. Pre lepšiu predstavu je uvedený bežný povel v príkaze RC -5 na Obr.3.1. Na ňom je možné vysvetliť ako funkciu má plniť dekódovací algoritmus. Meranie periódy prvého bitu je znázornené zelenou farbou. Meranie periódy skončí na konci prvého štart bitu. Avšak aby sme mohli vykonávať meranie v strede každého polbitu, musíme vzorkovanie posunúť o jednu štvrtinu periódy ako je znázornené na obrázku fialovou farbou. Teraz už môže algoritmus začať vzorkovať signál každú polperiódu. Vzorkovanie je znázornené červenými šípkami a časové body, kde dochádza k meraniu sú označené modrými čiarkami.

Graficky znázornený povel RC-5 s naznačením vzorkovania

Ako je možné si všimnúť z Obr.3.1 prvá polovica prvého štart bitu začína nulovým polbitom. To by znamenalo že meranie periódy je možné začať až od nábežnej hrany druhého polbitu. Pri práci sme ale použili prijímač TSOP 1738, ktorý prijímaný signál invertuje. Preto budeme ďalej v práci uvažovať s invertovaným signálom. Dekódovací algoritmus bude podobný ako v kapitole 2, avšak s uvážením invertovaného signálu, posunu o štvrtinu periódy a väčšieho počtu vzorkovaní. Na Obr.3.2 je uvedený príklad pôvodného signálu spolu s jeho invertovanou podobou.

Originálny a invertovaný signál

Dekódovací algoritmus zobrazený na Obr.3.3 bude mať nasledovný priebeh. Pri prijímaní signálu čakáme na vzostupnú hranu signálu, teda na logickú nulu. V tomto okamihu sa spustí meranie periódy prvého štart bitu Tb. Na ďalší krok prejde ak sa zistí nábežná hrana signálu teda logická jednotka. Meranie periódy Tb pokračuje, až kým nie je zaznamenaná vzostupná hrana signálu teda logická jednotka. V tomto okamihu sa zastaví meranie periódy Tb. Nastane posun o štvrtinu nameranej periódy do stredu prvého polbitu druhého štart bitu. V tejto chvíli sa spustí vzorkovanie signálu. Algoritmus zistí či sa na danom mieste nachádza logická nula alebo jednotka, zistený stav zaznamená a ďalšie meranie nasleduje až o pol periódy Tb, kde sa zopakuje meranie stavu na polbite. Toto sa zopakuje 26 krát. Týmto spôsobom zaznamenáme stav na každom polbite, čím môžeme korektne určiť či sa jedná bit v logickom stave jedna alebo nula.

Pri návrhu algoritmu sme samozrejme chceli poznať reálny priebeh signálu. Preto sme si zaobstarali univerzálny diaľkový ovládač značky Thomson s označením ROC 2306 a preprogramovali ho na vysielanie povelov v protokole RC-5. IR prijímač TSOP 1738 sme napojili na napájacie napätie a výstup pripojili na svorku digitálneho osciloskopu značky Rigol s označením 1102E. Údaje, ktoré sme zachytili sú graficky znázornené na Obr.3.4. Po zachytení signálu sme odmerali periódy jednotlivých bitov a výsledky sa aj po viacerých meraniach zhodovali s udávanými hodnotami v protokole RC-5. Z Obr.3.4 je taktiež možné pozorovať prvé dva štart bity s hodnotou jedna, za ktorými nasleduje tzv. Toggle bit v stave nula, adresné a príkazové bity.

Dekódovací algoritmus

Priebeh zachytený osciloskopom

Program pre dekodér RC5-BIN

Zdrojový kód písaný v programovom jazyku assembler vykonáva dekódovanie takmer rovnakým postupom, aký bol opísaný v predchádzajúcej kapitole. Postupne opíšeme fragmenty kódu a ich funkciu v programe.

mov X, 0xFF ; zápis hodnoty 256 do registra X mov A, 0xFF ; zápis hodnoty 256 do registra A call Counter16_WritePeriod ; zapíše nastavenú periódu z registrov X a A do čítača

mov X, 0x00 ; zapíše hodnotu 0 do registra X mov A, 0x00 ; zapíše hodnotu 0 do registra A call Counter16_WriteCompareValue ; zapíše konečnú hodnotu periódy

Aby sme mohli merať periódu bolo treba v prvom rade nastaviť čítač a hodnotu jeho periódy. V prvých troch riadkoch uvedeného fragmentu kódu sme do registrov X a A nastavili maximálnu možnú hodnotu. Tým sme nastavili periódu na 65536 cyklov (256 * 256 = 65536). Taktiež treba nastaviť hodnotu, po ktorú bude čítač znižovať nastavenú hodnotu periódy. V našom prípade sme nastavili koniec na nulovú hodnotu. Pri vstupnom hodinovom signále podľa vzťahu 3.1 nastavíme periódu na hodnotu 65536 čo v reálnej časovej oblasti udáva dobu 2,73 ms, čo v našom prípade postačuje na periódu, ktorej predpokladaná hodnota by sa mala pohybovať okolo hodnoty 1,78 ms.

[math]t_i=T_t*T_č=\frac{1}{f_p}*T_č=\frac{1}{24.10^6 Hz}*65536\dot=2,78ms[/math]

kde, Tt je trvanie taktu čo je v podstate obrátená hodnota frekvencie hodinového signálu fp a Tč predstavuje nastavenú periódu čítača, ti - je reálna doba akú bude čítač odpočitavať.

mov A, reg[PRT0DR] ; presunie sa hodnota z registra nula do akumulátora and A, 0b00000001 ; otestuje či sa na pine vyskytuje log.1, ak ano

                               ;->skočí, a spustí čítač

jz _prvy ; ak sa splní podmienka skočí na ďalšiu ;časť programu ;„_prvy“

   jmp _spusti		        ; program čaká na výskyt logickej nuly

Uvedený fragment kódu testuje prítomnosť vzostupnej hrany signálu na pine P[0]0. Testovanie sa prevádza až do doby, kedy sa vyskytne zostupná hrana signálu. V tom momente skočí na ďalšiu časť nazvanú „_prvy“.

_prvy:

   call Counter16_Start		; spustí odpočítavanie čítača
   mov A, reg[PRT0DR]	                ; presunie sa hodnota z registra nula do akumulátora

and A, 0b00000001 ; testuje sa hodnota z registra, či je prítomná log.1

   jnz _druhy
   jmp _prvy 

Akonáhle program skočí na uvedenú funkciu „_prvy“ znamená, že úspešne zaznamenal zostupnú hranu signálu a je potrebné spustiť čítač. Uvedená funkcia sa vykonáva do doby, pokiaľ je na pine zaznamenávaná logická jednotka.

mov A, reg[PRT0DR] ; presunie sa hodnota z registra nula do akumulátora and A, 0b0000000 ;otestuje či je na pine log.0, ak hej->skoči na „_treti“, a zastaví sa counter

   jz _treti
   jmp _druhy

Ak je zaznamenaná logická jednotka, znamená to koniec prvého štart bitu. V tomto okamihu treba zastaviť čítač.

_treti:

   call Counter16_Stop			; zastaví sa čítač
   call Counter16_wReadCounter	        ; načíta sa hodnota, po ktorú čítač odpočítaval
  mov   [timerValue], A		; táto hodnota sa zapíše 
  mov   [timerValue+1], X    		; táto hodnota sa zapíše

Funkciou čítača je znižovať hodnotu periódy, ktorú mu užívateľ nastavil s každým taktom procesora o jednu. V našom prípade sme nastavili hodnotu na maximálnu hodnotu. Predpokladáme však, že čítač nedopočítal do nuly. A hodnota, ktorá nás zaujíma je podľa vzťahu 3.2 výslednou dobou periódy prvého štart bitu.