Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2014:gen2-decoder

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
2014:gen2-decoder [2015/01/17 18:54]
Tomáš Janošík
2014:gen2-decoder [2015/01/18 20:26] (aktuální)
Tomáš Janošík
Řádek 1: Řádek 1:
 +=======Dekodér Gen2 příkazů RFID čtečky=======
 +
 =====Zadanie===== =====Zadanie=====
 Realizujte dekodér signálu PIE vysílaného z UHF RFID čtečky podle protokolu EPCglobal Class-1 Generation-2. Dekodér by měl přes virtuální sériový port vypsat např. hodnotu Tari, RTcal, TRcal, obsah příkazu Query. Realizujte dekodér signálu PIE vysílaného z UHF RFID čtečky podle protokolu EPCglobal Class-1 Generation-2. Dekodér by měl přes virtuální sériový port vypsat např. hodnotu Tari, RTcal, TRcal, obsah příkazu Query.
  
 =====Hardware===== =====Hardware=====
-Dekodér signálu PIE je realizovaný na vývojovom kite KL25Z. ​K splneniu účelu postačuje ​využiť jeden vstupný pin a USB rozhranie. ​Digitálny signál ​PIE generuje iný vývojový kit osadený mikrokontrolérom ATmega16. Po stalčení tlačítka mikrokontrolér vyšle data kódované podľa protokolu Gen2.+Dekodér signálu PIE je realizovaný na vývojovom kite KL25Z. ​Z tohto kitu je využitý jeden vstupný pin a USB rozhranie. ​Testovaciu sekvenciu signálu ​PIE generuje iný vývojový kitosadený mikrokontrolérom ATmega16. Po stlačení tlačítka mikrokontrolér vyšle data kódované podľa protokolu Gen2.\\ 
 +{{:​2014:​gen2-decoder:​evb4.3_2_1_.jpg?​direct&​300|}} {{:​2014:​gen2-decoder:​frdm-kl25z.jpg?​direct&​300|}}
  
 =====Protokol Gen2===== ​ =====Protokol Gen2===== ​
-Podľa protokolu zahajuje komunikáciu vždy čítačka a to odoslaním Preambuly ​a následne príkazu ​Query. Následne čítačka čaká na odpoveď tagu. Ďaľšie príkazy začína čítačka vždy sekvenciou Frame-Sync. Obsah príkazov tvoria datové 1 a datové 0, kódované podľa nasledujúceho obrázku.+Podľa protokolu zahajuje komunikáciu vždy čítačkaa to odoslaním Preambuly ​s príkazom ​Query. Následne čítačka čaká na odpoveď tagu. Ďaľšie príkazy začína čítačka ​odosielať ​vždy so sekvenciou Frame-Sync. ​{{ :​2014:​gen2-decoder:​snimka2.png?​direct&​500 |}} 
 + 
 +Obsah príkazov tvoria datové ​'1' ​a datové ​'0', kódované podľa nasledujúceho obrázku. 
 +{{ :​2014:​gen2-decoder:​snimka.png?​direct&​400 |}}
  
 =====Problém s meraním krátkych pulzov====== =====Problém s meraním krátkych pulzov======
-Maximálna bitová rýchlosť komunikácie v smere od čítačky k tagu je podľa protokolu 128 kbps. Spracovať tento signál procesorom Cortex M0 by na prvý pohľad nemal byť problém. Avšak po rozsiahlých ​pokusoch ​sa nepodarilo merať šírku impulzov, ktoré sú široké rádovo 10-ky us, s dostatočnou presnosťou. Program písaný v prostredí MBED vnášal do čítača chybu okolo 30us, čo znemožňuje merať presné hodnoty impulzov. To je spôsobené pravdepodobne vývojovým prostredím MBED na takúto aplikáciu nie je vhodné, alebo nevhodne napísaným kódom s nedostatočnou optimalizáciou. Riešením tohoto problému je zväčšenie ​šasových intervalov 1000 násobne. Tým vznikne datový signál s šírkou impulzov 10-ky ms, namisto ​us, ktoré sú v protokole. ​Princípy komunikácie sú však zachované+Maximálna bitová rýchlosť komunikácie v smere od čítačky k tagu je podľa protokolu 128 kbps. Spracovať tento signál procesorom ​ARM Cortex M0 by na prvý pohľad nemal byť problém. Avšak po rozsiahlych ​pokusoch sa nepodarilo merať ​s dostatočnou presnosťou ​šírku impulzov, ktoré sú široké rádovo 10-ky us.  Program písaný v prostredí MBED vnášal do čítača chybu okolo 30us, čo znemožňuje merať presné hodnoty impulzov. To je spôsobené pravdepodobne vývojovým prostredím MBED, ktoré ​na takúto aplikáciu nie je vhodné, alebo nevhodne napísaným kódom s nedostatočnou optimalizáciou. Riešením tohoto problému je zväčšenie ​časových intervalov 1000 násobne. Tým vznikne datový signál s šírkou impulzov 10-ky ms, namiesto ​us, ktoré sú v protokole. ​Síce to nevyrieši problém ako taký, ale umožní to otestovať dekodér signálu, ktorý dodržiava princípy komunikačného protokolu Gen2
  
 =====Software==== =====Software====
 ====Signál z čítačky==== ====Signál z čítačky====
 Mikroprocesor ATmega 16 osadený vo vývojovom kite bol naprogramovaný tak, aby po stlačení tlačítka odoslal sekvenciu Preambula + Query + 200ms pauza + Frame-Sync + ACK. Mikroprocesor ATmega 16 osadený vo vývojovom kite bol naprogramovaný tak, aby po stlačení tlačítka odoslal sekvenciu Preambula + Query + 200ms pauza + Frame-Sync + ACK.
 +Preambula obsahuje delimiter=12,​5ms,​ tari=6,​25ms,​ RTcal=18ms, TRcal=15ms. Obsah príkazov je v poli query[] a ack[]:
 +<code c>
 +//​...................delimiter, ​ tari , RTcal, TRcal,
 +//​----------------------______-----___-----__-----___
 +float preamble[DLZKA]= {12.5 , 3.25, 3, 15, 3, 12, 3};
 +float query[DLZKA_Q]={1,​0,​0,​0,​1,​0,​0,​1,​0,​0,​0,​1,​0,​1,​1,​1,​1,​0,​0,​0,​0,​1};​
 +float ack[DLZKA_D]={0,​1,​1,​0,​1,​0,​1,​1,​0,​0,​1,​1,​0,​0,​0,​0,​1,​1};​
 +</​code>​
 +
 +Sekvencia Preambuly a príkazu Query je vyslaná nasledovne:
 +<code c>
 +--------Preamble------------------------------------
 +            for(i=0; i<DLZKA; i++){
 +                PORTD ^= _BV(PD4);
 +                _delay_ms(preamble[i]);​
 +            }
 +//​--------Prikaz Query------------------------------------
 +            for(i=0; i<​DLZKA_Q;​ i++){
 +                if(query[i]){ ​              //​kodovanie bitovej 1 podla protokolu Gen2
 +                    PORTD ^= _BV(PD4);
 +                    _delay_ms(6.5);​
 +                    PORTD ^= _BV(PD4);
 +                    _delay_ms(3);​
 +                }
 +                else{                       //​kodovanie bitovej 0 podla protokolu Gen2
 +                    PORTD ^= _BV(PD4);
 +                    _delay_ms(3.25);​
 +                    PORTD ^= _BV(PD4);
 +                    _delay_ms(3);​
 +                }
 +            }
 +             PORTD |= _BV(PD4); ​            //cas na odpoved tagu
 +            _delay_ms(200);​
 +</​code>​
 +
  
 ====Dekodér==== ====Dekodér====
-  +Základom dekodéru je časovač v kombinácií s prerušeniami na nábežn[ a dobežnú hranu. Prerušenie na dobežnú hranu je aktívne, len ak dekodér očakáva delimiter(Preambula alebo Frame-Sync). Po prijatí delimiteru je aktívne iba prerušenie na nábežnú hranu a časovač meria intervaly medzi nábežnými hranami. ​  
-     +Obsluha prerušení pre nábežnú a dobežnú hranu: 
 +<code c> 
 +void Counter_rise(){ ​       //obsluha prerušenia nábežnou hranou 
 +    _time.stop();​ 
 +    count = _time.read_us(); ​   
 +    _time.reset();​ 
 +    _time.start();​ 
 +    i++;     
 +    } 
 +void Counter_fall(){ ​       //obsluha prerušenia dobežnou hranou(len pre detekciu delimiteru) 
 +    _time.reset();​ 
 +    _time.start();​ 
 +    interrupt.fall(NULL); ​  //​zakázanie prerušenia dobežnou hranou .. 
 +    } 
 +</​code>​  
 +Hlavný program: 
 +<code c> 
 +int main() 
 +{     
 +    pc.printf("​Ready to read!\n"​);​ 
 +    interrupt.rise(&​Counter_rise);​ 
 +    interrupt.fall(&​Counter_fall);​ 
 + 
 +    while (true) { 
 +        if (_time.read_us() > 300000){ ​     //ak 300 ms neprebieha komunikacia,​ tag sa nastaví na defaultné hodnoty 
 +            _time.stop();​ 
 +            _time.reset();​ 
 +            R2T_started = false; 
 +            FS_expected= false;  
 +            i=0; 
 +            interrupt.fall(&​Counter_fall); ​  
 +        } 
 +        if((_time.read_us() > (2*TRcal)) && (TRcal>​0) && R2T_started){ ​     //činnosť tagu medzi prikazmi z čítačky 
 +             
 +            if(FS_expected==0){ ​            //ak sa jedna o prvý príkaz resp. Query 
 +                pc.printf("​Preamble:​ delimiter:​%d,​ tari:%d, RTcal:%d, TRcal:%d \n", delimiter, tari, RTcal, TRcal); 
 +                pc.printf("​Query:​ "); 
 +                for(uint8_t j=0 ; j<​=(i-5);​ j++){ 
 +                    pc.printf("​%d ",​data[j]);​ 
 +                }     
 +            } 
 +            else{                           //​ostatne prikazy 
 +                pc.printf("​Frame sync: delimiter:​%d,​ tari:%d, RTcal:%d \n", delimiter, tari, RTcal); 
 +                pc.printf("​Command:​ "); 
 +                for(uint8_t j=0 ; j<​=(i-4);​ j++){ 
 +                    pc.printf("​%d ",​data[j]);​ 
 +                } 
 +            } 
 +            pc.printf("​\n ");  
 +            i=0; 
 +            interrupt.fall(&​Counter_fall);​ 
 +            FS_expected=true; ​ //po prvom prikaze s preambulou už bude tag očakavať na začiatku príkazov Frame-Sync 
 +            R2T_started = false; ​           //​ukončenie prikazu 
 +        } 
 +        if ((count>​12000) && (count<​13000)){ ​   //​testovanie delimiteru 
 +            R2T_started = true;                 //​začiatok prikazu(preambuly alebo FS) 
 +            delimiter = count; ​    ​ 
 +        } 
 +        if(R2T_started && (FS_expected==0)){ ​   //uloženie parametrov preambuly a nasledujúceho príkazu = Query 
 +            if(i==2) tari= count;ie 
 +            if(i==3) RTcal= count; 
 +            if(i==4) TRcal= count; 
 +            if(i>​4){ 
 +                if((count>​(tari-250)) && (count<​(tari+250))) 
 +                    data[i-5]=0;​ 
 +                if((count>​(1.5*tari)) && (count<​(2*tari))) ​     //​tolerancia z protokolu 
 +                    data[i-5]=1;​ 
 +            }          
 +        } 
 +        if(R2T_started && (FS_expected)){ ​      ////​uloženie parametrov Frame-Sync a nasledujúceho príkazu 
 +            if(i==2) tari= count; 
 +            if(i==3) RTcal= count; ​      
 +            if(i>​3){ 
 +                if((count>​(tari-250)) && (count<​(tari+250))) 
 +                    data[i-4]=0;​ 
 +                if((count>​(1.5*tari)) && (count<​(2*tari))) 
 +                    data[i-4]=1;​ 
 +            }          
 +        } 
 +    }       
 +
 +</​code>​ 
 + 
 +=====Výsledky===== 
 +Výstupom z dekodéru je odoslanie dekódovanej sekvencie príkazov cez virtuálny port a zobrazenie cez terminál. Zaznamenanie dekódovaného signálu PIE je nasledujúcom obrázku. Testovacia sekvencia bola odoslaná 3 krát. 
 +{{ :​2014:​gen2-decoder:​snimka3.png?​direct&​700 |}} 
 + 
 +=====Záver=====  
 +Podarilo sa naprogramovať dekodér základných príkazov vysielaných RFID čítačkou smerom k tagu. Dodržané boli princípy protokolu Gen2, avšak časové intervaly testovacej sekvencie museli byť zväčšené 1000x. Tam kde majú byť podľa protokolu mikrosekundy tak tento dekodér pracuje s milisekundami. To z dôvodu popísaného v kapitole Problém s meraním krátkych pulzov. Výsledkom je dekodér, ktorý síce dodržiava princípy komunikácie podľa protokolu Gen2, ale reálne je nepoužiteľný,​ keďže nedokáže merať impulzy so šírku rádovo desiatok mikrosekúnd. Z testovacej sekvencie dekodér dekóduje obsah preambuly- delimiter, tari, RTcal, TRcal a nasledujúci príkaz Query. Ďalej dekóduje Frame-Sync- delimiter, tari, RTcal a ľubovoľný nasledujúci príkaz. ​     ​
   ​   ​
2014/gen2-decoder.1421517283.txt.gz · Poslední úprava: 2015/01/17 18:54 autor: Tomáš Janošík