Operácie

RFID čítačka: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Bez shrnutí editace
StudentDVPS (diskusia | príspevky)
 
(105 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 22: Riadok 22:
'''Literatúra:'''  
'''Literatúra:'''  
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
*http://www.fi.muni.cz/usr/jkucera/pv109/2005/xkukucka.htm
*http://www.instructables.com/id/Arduino-and-RFID-from-seeedstudio/
*Prednášky
*http://www.instructables.com/id/Magic-Music-Table-RFID-iP


__TOC__
__TOC__


== Analýza ==
== Analýza ==
Našou úlohou, ako bolo spomenuté je navrhnúť pomocou RFID čítačky elektronický zámok na kód. Čo v princípe znamená, že ak priložíme k čítačke kartu (klúčenku), alebo hocičo čo v sebe obsahuje kód, tak ten sa vyhodnotí ako správny len ten ktorý sme v kóde zadefinovali my. Adresy a dáta sú prenášané sériovo pomocou zbernice I2C. Komunikácia bola vykonaná cez univerzálne sériové rozhranie UART. Ako mikroprocesor sme použili ATmegu 328P,ktorý je dosadený na vývojovej doske Acrob, s ktorou sme pracovali aj na cvičení.


V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje,
[[Súbor:AcrobBoard.png]]
ktoré sú potrebné na úspešné vyriešenie projektu. Napríklad:


* popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
* obrázok zapojenia vývodov použitej súčiastky
* odkaz na katalógový list
* priebehy dôležitých signálov


'''Čo je to RFID'''
RFID (Radio Frequency Identification) - rádiofrekvenčný systém identifikácie je moderná technológia na identifikáciu objektov pomocou rádiofrekvenčných vĺn. Informácie sú v elektronickej podobe ukladané do malých čipov-tagov, z ktorých je možné následne načítať a opakovane prepisovať pomocou rádiových vĺn, toto spracovanie sa však nedeje po jednotlivých čítaniach ako u v súčasnosti používaných čiarových kódov, ale hromadne. Súčasné čítacie zariadenia dokážu naraz načítať až niekoľko sto tagov za minutu. Podobne ako u čiarových kódov sa informácie zaznamenávajú na nosič dát - tzv. RFID tag, ktorý je pripevnený na sledované objekty, tag obsahuje malý čip s anténou a pamäťou. RFID tagy sú základom systému pre ukladanie a prenos informácií pomocou elektromagnetických vĺn. Môže ich hromadne prečítať a zaznamenať príslušné čítacie zariadenie, ktoré môže byť pevné alebo mobilné. Pomocou vĺn vyžiarených z čítacieho zariadenia dôjde k nabitiu chipu a následne sa informácie uložené v chipe bezdrôtovo prenesú späť do čítacieho zariadenia (každý tag obsahuje tzv. EPC kód - electronic product code, jedná sa o jednoznačné sériové číslo tagu).
Každá implementácia RFID technológie obsahuje tagy pre označenie objektov, čítacie zariadenia a tzv. Middleware (riadiaci systém, ktorý zaisťuje hromadné spracovanie všetkých načítaných tagov v dosahu čítacích zariadení a prenesení spracovaných dát do náväzného informačného alebo riadiaceho systému).
Pridelené frekvenčné pásma pre UHF tagy:
*Región 1 865 - 869 MHz Európa a Afrika
*Region 2 902 - 928 MHz USA, Kanada a Mexiko
*Región 3 950 - 956 MHz Japonsko a Ázie
'''Vlastnosti RFID reader-u (čítačky)'''
*firma Parallax
*dve LED diódy na signalizovanie stavu
*komunikačná rýchlosť 2400 baud
*čitanie tagov s frekvenciou 125kHz
*napájacie napätie 4,5 - 5,5 V
*rozmery: 62.2 x 82.5 x 5.57 mm
*rozsah pracovnej teploty: -40 to +85 °C
*4 piny: VCC, /ENABLE, SOUT, GND
''Zapojenie pinov RFID čítačky''
[[Súbor:p.png]]
'''Komunikácia pomocou I2C'''
*sériová synchrónna zbernica vyvinutá firmou Philips nazývaná aj InterIntegrated Circuit
*počet obvodov pripojených na zbernicu je obmedzený počtom adries a celkovou kapacitou zbernice <400 pF (jednotkou dĺžky je pF)
*Na prenos informácie sú použité dve nesymetrické vedenia:
SCL(hodiny)
SDA(data)
Tieto vodiče sú obojsmerné a pomocou PULL UP rezistorov ťahané hore. Všetky zariadenia pripojené na zbernicu musia mať "otvorený kolektor". Budiče zbernice majú implementované "drôtové AND".
*obvody, ktoré používajú I2C protokol zahŕňajú pamäte EEPROM a RAM, senzory teploty, expandéry portov, hodiny reálneho času, atď.
''Módy prenosu (prenosová rýchlosť):''
*Standard mode: <100kb/s
*Fast mode: <400kb/s
*Fast mode plus: <1000kb/s
*High-speed mode: <3400kb/s (10bit adresa, až 1024 zariadení )
''I2C prenos dát''
Dáta sú po SDA prenášané bytovo. Niekoľko bytov oraničených Start a stoP podmienkami. Prenos bitu je podmienený jedným impulzom na SCL. Signál na SDA vodiči musí byť stabilný ak je CLK signál v úrovni Log. 1.
*Ak je zbernica voľná, môže sa uskutočniť prenos. T.j. oba vodiče sú v logickej jednotke.
*MASTER inicializuje a ukončuje prenos.
*Prenos sa začne, ak MASTER odvysiela Start podmienku
*Prenos sa ukončí, ak MASTER odvysiela stoP podmienku
*Zbernica je medzi Start a stoP podmienkou v stave „busy“
*Ak sa medzi Start a stoP podmienkou objaví opakovaný Start, tento stav sa označuje ako REPEATED Start podmienka (Sr, S)
*Start a stoP podmienka sa realizujú ako zmena na SDA počas vysokej úrovne na SCL vodiči
''I2C Protokol''
[[Súbor:pro.jpg]]
'''UART'''
Najskôr len veľmi stručne o tom, čo je to UART a na čo môže byť dobrý. Skratka UART by sa dala preložiť ako univerzálny asynchrónny prijímač / vysielač. Je to kúsok hardvéru, ktorý pomocou dvoch pinov (väčšinou označovaných ako RX a TX) odosiela a prijíma dáta. Keďže sa jedná o asynchrónne spôsob komunikácie, obsahuje prijímač aj vysielač vlastný generátor hodinového signálu, ktorým sa UART riadi. A keďže je UART univerzálny, je tiež možné rýchlosť týchto hodín riadiť (nie je stanovená), rovnako ako veľkosť jedného bajtu, počet stôp bitov, paritný bit, atď. Často môžeme tiež počuť skratku USART. Jedná sa v podstate o to isté, len s tým rozdielom, že je USART obsahuje aj synchrónny režim.


== Popis riešenia ==
== Popis riešenia ==


Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru
Pin VCC  sme zapojili na +5V a pin GND na zem. Pin ENABLE je invertovaný, co znamená nízka (low) úroveň ho aktivuje. Alternatívne sa dá tiež pripojiť na Gnd. My sme ho zapojili na PIN D3. Pin OUT je pin kde sú posielané dáta po prečítaní tagu. My sme ho pripojili na PIN D2. Vizuálna indikácia stavu RFID čítačky je pomocou LED diód daných na čítačku. Keď je modul úspešne napájaný a číta niečo tak svieti zelená LED. Ked je modul aktívny a hľadá komunikáciu so správnym tagom svieti červená LED.
(nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.  
 
RFID čítačka je aktivovaná cez pin /ENABLE. Keď je napájaná a /ENABLE je na log.0 modul sa spustí do aktívnej úrovne. Keď /ENABLE je na log.1 alebo nezapojený modul posiela stav IDLE.
RFID prenáša dáta cez USB virtual COM port driver. Toho ľahko povoluje prístup k dátam z každej softwarovej aplikácie, programovacieho jazyka alebo zbernice, ktorá komunikuje s COM portom. Keď je RFID aktívna a tag je správne priložený kód je prenášaný ako 12 bitový ASCII string sériovo do formátu, kde štart a stop bit nám indentifikujú že string bol poslaný správne a 10 prostredných bitov je kód.
 
'''Schéma zapojenia čítačky'''
 
 
[[Súbor:schemickaaa.jpg]]
 


'''Schéma zapojenia snímača'''
[[Súbor:Zapojenie.png]]


[[Súbor:Example.jpg]]


Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo
nahrať už aspoň 10 študentov.




Riadok 53: Riadok 124:
=== Algoritmus a program ===
=== Algoritmus a program ===


Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili.  
Všeobecný pohľad nato ako program funguje je možno vidieť na nasledujúcom vývojovom diagrame. Program  je napísaný v programovacom prostredí AVR Studio 4.  
Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu.
 
Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.
 
 
[[Súbor:diaggrramm.png]]


Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':


<source lang="c">
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */


int main(void) {
#include "common.h"
      
#include <avr/interrupt.h>
     printf("Hello, World!\n");   
#include <stdlib.h>
     return(0);
#include "serial.h"
#include<stdio.h>
 
FILE uart_output = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);
FILE uart_input = FDEV_SETUP_STREAM(NULL, recchar, _FDEV_SETUP_READ);
 
static void RFID_init(void);
static void RFID_ena(uint8_t ena);
static void TunedDelay(uint16_t);
 
 
#define RFID_IN    PIND2
#define RFID_ENA    PIND3
 
// Values taken from SoftSerial from Mikal Hart
#define CENTER_DELAY            471
#define INTRABIT_DELAY          950
 
static volatile uint8_t bDataReady;
static volatile uint8_t rxIdx;
int RFID_tag[12]; 
 
int main()
{
 
inituart();
stdout = &uart_output;
stdin = &uart_input; 
DDRD = (1<<DDD6) | (1<<DDD5);
PORTD = (0<<PD6) | (0<<PD5); //D5 zelena LED
 
    _delay_ms(5000);   
 
    RFID_init();
    RFID_ena(1);
    TunedDelay(947);
 
     for (;;)
     {
        if (bDataReady)
        {
printf("RFID tag: ");
                for(uint8_t x = 1; x < 11; x++)
                {
x++;
  printf("%i",RFID_tag[x]);
                  if (x%2==0 && x<9)
                      printf("-");
                }
                printf("\n");
 
//53-50-66-69-53 BLUE KEYCHAIN PASIVE
if (RFID_tag[10]==53 && RFID_tag[8]==69 && RFID_tag[6]==66 &&RFID_tag[4]==50 && RFID_tag[2]==53)
{
printf("Správny kód\n");
PORTD = (1<<PD5);
_delay_ms(2000);
PORTD = (0<<PD5);
_delay_ms(500);
printf("Prístup povolený\n\n");
}
else {
printf("Nesprávny kód!!\n");
  PORTD = (1<<PD6);
_delay_ms(2000);
PORTD = (0<<PD6);
_delay_ms(500);
printf("Priloz inu kartu!\n\n");
}
 
            rxIdx = 0;
            bDataReady = 0;
        }
    }
}
 
 
void RFID_init()
{
    bDataReady = 0;
    rxIdx = 0;
    // RFID_IN input from RFID Reader SOUT, RFID_ENA output to RFID Reader /ENA
    BSET(DDRD, RFID_ENA);
    BSET(PORTD,RFID_IN);    // pullup
 
    BSET(PCICR,PCIE2);  // pin change interrupt control register pcie2 -> PCICR = 0b00000100
    BSET(PCMSK2,PCINT18); // enable pin change interrupt for PCINT18 (PD2) -> PCMSK2 = 0b00000100
    BSET(SREG,7);      // Set SREG I-bit -> SREG = 0b10000000
}
 
ISR(PCINT2_vect)
{
     if (BCHK(PIND,RFID_IN)) // Start bit goes low
        return;
    uint8_t bit = 0;
    TunedDelay(CENTER_DELAY);      // Center on start bit
    for (uint8_t x = 0; x < 8; x++)
    {
        TunedDelay(INTRABIT_DELAY);
        if (BCHK(PIND,RFID_IN))
            BSET(bit,x);
        else
            BCLR(bit,x);
    }
    TunedDelay(INTRABIT_DELAY);
    RFID_tag[rxIdx] = bit;
    ++rxIdx;
    if (rxIdx == 12)
        bDataReady = 1;
}
 
void RFID_ena(uint8_t ena)
{
    if (ena)
        BCLR(PORTD,RFID_ENA);
    else
        BSET(PORTD,RFID_ENA);
}
 
void TunedDelay(uint16_t delay) // delay function
{
  uint8_t tmp=0;
 
  asm volatile("sbiw    %0, 0x01 \n\t"
    "ldi %1, 0xFF \n\t"
    "cpi %A0, 0xFF \n\t"
    "cpc %B0, %1 \n\t"
    "brne .-10 \n\t"
    : "+r" (delay), "+a" (tmp)
    : "0" (delay)
    );
 
}
 
void CriticalSegment(uint8_t ena)
{
    static uint8_t sreg;
    if (ena)
    {
        sreg = SREG;    // save off our global status register
        cli();          // stop global interrupts
    } else
    {
        SREG = sreg;    // restore global interrupt flag (and any other prev settings)
    }
}
 
 
 
}
}
</source>
</source>


Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!


Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
Zdrojový kód: [[Médiá:common.c]]  [[Médiá:common.h]]   [[Médiá:RFID_.c]]  [[Médiá:serialll.c]]  [[Médiá:serialll.h]]


[[Médiá:MojProgram.c|program.c]]
=== Overenie ===


=== Overenie ===
RFID čítačku treba zapojiť na +5V. Pred prvým použitím je potrebné nastaviť prenosovú rýchlosť 2400 baudov, 8 dátovych bitov, 1 štart bit, 1 stop bit a žiadnu paritu. Pripojenie mikropočítača je urobené pomocou USB kábla. AK svieti červená LED, tak čítačka je pripravená na čítanie a čaká kým priložíme dáky tag ( kartu, kľúčenku na prečítanie). Keď priložíme k čítačke kartu tak nám prečíta kód ktorý je tam nahraný, a môžeme ho vidieť pomocou UART komunikácie v PC. Tento kód však nie je správny, tak LED dióda svieti na červeno a uvidíme výpis: Nesprávny kód! Ak priložíme kľučenku vypíše sa nám správny kód, rozsvieti sa zelená LED a uvidíme nápis Prístup povolený.


Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí,
Obrázky na ilustráciu
ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje).
Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji,
odfotografujte ho.


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.




[[Súbor:rfid2.jpg]]
[[Súbor:rfid4.jpg]]
[[Category:AVR]] [[Category:DVPS]]
[[Category:AVR]] [[Category:DVPS]]

Aktuálna revízia z 16:11, 13. január 2015

Autori: Martin Kocian a Juraj Švančara
Študijný odbor: Aplikovaná mechatronika 2. Ing. (2014)

Zadanie

Pomocou RFID čítačky navrhnite elektronický zámok na kód. Popíšte princíp RFID vyhodnocovanie, zistite akú triedu RFID prvkov je schopná čítačka rozpoznať a zmerajte ukážkové data a vyhodnoťte meranie.

http://www.parallax.com/product/28140


Literatúra:

  • Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.

Analýza

Našou úlohou, ako bolo spomenuté je navrhnúť pomocou RFID čítačky elektronický zámok na kód. Čo v princípe znamená, že ak priložíme k čítačke kartu (klúčenku), alebo hocičo čo v sebe obsahuje kód, tak ten sa vyhodnotí ako správny len ten ktorý sme v kóde zadefinovali my. Adresy a dáta sú prenášané sériovo pomocou zbernice I2C. Komunikácia bola vykonaná cez univerzálne sériové rozhranie UART. Ako mikroprocesor sme použili ATmegu 328P,ktorý je dosadený na vývojovej doske Acrob, s ktorou sme pracovali aj na cvičení.


Čo je to RFID

RFID (Radio Frequency Identification) - rádiofrekvenčný systém identifikácie je moderná technológia na identifikáciu objektov pomocou rádiofrekvenčných vĺn. Informácie sú v elektronickej podobe ukladané do malých čipov-tagov, z ktorých je možné následne načítať a opakovane prepisovať pomocou rádiových vĺn, toto spracovanie sa však nedeje po jednotlivých čítaniach ako u v súčasnosti používaných čiarových kódov, ale hromadne. Súčasné čítacie zariadenia dokážu naraz načítať až niekoľko sto tagov za minutu. Podobne ako u čiarových kódov sa informácie zaznamenávajú na nosič dát - tzv. RFID tag, ktorý je pripevnený na sledované objekty, tag obsahuje malý čip s anténou a pamäťou. RFID tagy sú základom systému pre ukladanie a prenos informácií pomocou elektromagnetických vĺn. Môže ich hromadne prečítať a zaznamenať príslušné čítacie zariadenie, ktoré môže byť pevné alebo mobilné. Pomocou vĺn vyžiarených z čítacieho zariadenia dôjde k nabitiu chipu a následne sa informácie uložené v chipe bezdrôtovo prenesú späť do čítacieho zariadenia (každý tag obsahuje tzv. EPC kód - electronic product code, jedná sa o jednoznačné sériové číslo tagu).

Každá implementácia RFID technológie obsahuje tagy pre označenie objektov, čítacie zariadenia a tzv. Middleware (riadiaci systém, ktorý zaisťuje hromadné spracovanie všetkých načítaných tagov v dosahu čítacích zariadení a prenesení spracovaných dát do náväzného informačného alebo riadiaceho systému). Pridelené frekvenčné pásma pre UHF tagy:

  • Región 1 865 - 869 MHz Európa a Afrika
  • Region 2 902 - 928 MHz USA, Kanada a Mexiko
  • Región 3 950 - 956 MHz Japonsko a Ázie


Vlastnosti RFID reader-u (čítačky)

  • firma Parallax
  • dve LED diódy na signalizovanie stavu
  • komunikačná rýchlosť 2400 baud
  • čitanie tagov s frekvenciou 125kHz
  • napájacie napätie 4,5 - 5,5 V
  • rozmery: 62.2 x 82.5 x 5.57 mm
  • rozsah pracovnej teploty: -40 to +85 °C
  • 4 piny: VCC, /ENABLE, SOUT, GND


Zapojenie pinov RFID čítačky


Komunikácia pomocou I2C

  • sériová synchrónna zbernica vyvinutá firmou Philips nazývaná aj InterIntegrated Circuit
  • počet obvodov pripojených na zbernicu je obmedzený počtom adries a celkovou kapacitou zbernice <400 pF (jednotkou dĺžky je pF)
  • Na prenos informácie sú použité dve nesymetrické vedenia:

SCL(hodiny) SDA(data)

Tieto vodiče sú obojsmerné a pomocou PULL UP rezistorov ťahané hore. Všetky zariadenia pripojené na zbernicu musia mať "otvorený kolektor". Budiče zbernice majú implementované "drôtové AND".

  • obvody, ktoré používajú I2C protokol zahŕňajú pamäte EEPROM a RAM, senzory teploty, expandéry portov, hodiny reálneho času, atď.


Módy prenosu (prenosová rýchlosť):

  • Standard mode: <100kb/s
  • Fast mode: <400kb/s
  • Fast mode plus: <1000kb/s
  • High-speed mode: <3400kb/s (10bit adresa, až 1024 zariadení )


I2C prenos dát

Dáta sú po SDA prenášané bytovo. Niekoľko bytov oraničených Start a stoP podmienkami. Prenos bitu je podmienený jedným impulzom na SCL. Signál na SDA vodiči musí byť stabilný ak je CLK signál v úrovni Log. 1.

  • Ak je zbernica voľná, môže sa uskutočniť prenos. T.j. oba vodiče sú v logickej jednotke.
  • MASTER inicializuje a ukončuje prenos.
  • Prenos sa začne, ak MASTER odvysiela Start podmienku
  • Prenos sa ukončí, ak MASTER odvysiela stoP podmienku
  • Zbernica je medzi Start a stoP podmienkou v stave „busy“
  • Ak sa medzi Start a stoP podmienkou objaví opakovaný Start, tento stav sa označuje ako REPEATED Start podmienka (Sr, S)
  • Start a stoP podmienka sa realizujú ako zmena na SDA počas vysokej úrovne na SCL vodiči



I2C Protokol


UART

Najskôr len veľmi stručne o tom, čo je to UART a na čo môže byť dobrý. Skratka UART by sa dala preložiť ako univerzálny asynchrónny prijímač / vysielač. Je to kúsok hardvéru, ktorý pomocou dvoch pinov (väčšinou označovaných ako RX a TX) odosiela a prijíma dáta. Keďže sa jedná o asynchrónne spôsob komunikácie, obsahuje prijímač aj vysielač vlastný generátor hodinového signálu, ktorým sa UART riadi. A keďže je UART univerzálny, je tiež možné rýchlosť týchto hodín riadiť (nie je stanovená), rovnako ako veľkosť jedného bajtu, počet stôp bitov, paritný bit, atď. Často môžeme tiež počuť skratku USART. Jedná sa v podstate o to isté, len s tým rozdielom, že je USART obsahuje aj synchrónny režim.

Popis riešenia

Pin VCC sme zapojili na +5V a pin GND na zem. Pin ENABLE je invertovaný, co znamená nízka (low) úroveň ho aktivuje. Alternatívne sa dá tiež pripojiť na Gnd. My sme ho zapojili na PIN D3. Pin OUT je pin kde sú posielané dáta po prečítaní tagu. My sme ho pripojili na PIN D2. Vizuálna indikácia stavu RFID čítačky je pomocou LED diód daných na čítačku. Keď je modul úspešne napájaný a číta niečo tak svieti zelená LED. Ked je modul aktívny a hľadá komunikáciu so správnym tagom svieti červená LED.

RFID čítačka je aktivovaná cez pin /ENABLE. Keď je napájaná a /ENABLE je na log.0 modul sa spustí do aktívnej úrovne. Keď /ENABLE je na log.1 alebo nezapojený modul posiela stav IDLE. RFID prenáša dáta cez USB virtual COM port driver. Toho ľahko povoluje prístup k dátam z každej softwarovej aplikácie, programovacieho jazyka alebo zbernice, ktorá komunikuje s COM portom. Keď je RFID aktívna a tag je správne priložený kód je prenášaný ako 12 bitový ASCII string sériovo do formátu, kde štart a stop bit nám indentifikujú že string bol poslaný správne a 10 prostredných bitov je kód.

Schéma zapojenia čítačky





Algoritmus a program

Všeobecný pohľad nato ako program funguje je možno vidieť na nasledujúcom vývojovom diagrame. Program je napísaný v programovacom prostredí AVR Studio 4.



#include "common.h"
#include <avr/interrupt.h>
#include <stdlib.h>
#include "serial.h"
#include<stdio.h>

FILE uart_output = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);
FILE uart_input = FDEV_SETUP_STREAM(NULL, recchar, _FDEV_SETUP_READ);

static void RFID_init(void);
static void RFID_ena(uint8_t ena);
static void TunedDelay(uint16_t);


#define RFID_IN     PIND2
#define RFID_ENA    PIND3

// Values taken from SoftSerial from Mikal Hart
#define CENTER_DELAY            471
#define INTRABIT_DELAY          950

static volatile uint8_t bDataReady;
static volatile uint8_t rxIdx;
int RFID_tag[12];   

int main()
{

inituart();
stdout = &uart_output;
stdin = &uart_input;  
DDRD = (1<<DDD6) | (1<<DDD5);			
PORTD = (0<<PD6) | (0<<PD5);			//D5 zelena LED

    _delay_ms(5000);    

    RFID_init();
    RFID_ena(1);
    TunedDelay(947); 

    for (;;)
    {
        if (bDataReady)
        {
				printf("RFID tag: ");
                for(uint8_t x = 1; x < 11; x++)
                {
				x++;
				  printf("%i",RFID_tag[x]);
                  if (x%2==0 && x<9)
                       printf("-");
                }
                printf("\n");

				//53-50-66-69-53 BLUE KEYCHAIN PASIVE
				if (RFID_tag[10]==53 && RFID_tag[8]==69 && RFID_tag[6]==66 &&RFID_tag[4]==50 && RFID_tag[2]==53) 
				{
				printf("Správny kód\n");
				PORTD = (1<<PD5);
				_delay_ms(2000);
				PORTD = (0<<PD5);
				_delay_ms(500);
				printf("Prístup povolený\n\n");
				}
				else {
				printf("Nesprávny kód!!\n");
	  				PORTD = (1<<PD6);
					_delay_ms(2000);
					PORTD = (0<<PD6);
					_delay_ms(500);
					printf("Priloz inu kartu!\n\n");
					}

            rxIdx = 0;
            bDataReady = 0;
        }
    }
}


void RFID_init()
{
    bDataReady = 0;
    rxIdx = 0;
    			// RFID_IN input from RFID Reader SOUT, RFID_ENA output to RFID Reader /ENA
    BSET(DDRD, RFID_ENA);
    BSET(PORTD,RFID_IN);    // pullup

    BSET(PCICR,PCIE2);  // pin change interrupt control register pcie2 -> PCICR = 0b00000100
    BSET(PCMSK2,PCINT18); // enable pin change interrupt for PCINT18 (PD2) -> PCMSK2 = 0b00000100
    BSET(SREG,7);       // Set SREG I-bit -> SREG = 0b10000000
}

ISR(PCINT2_vect)
{
    if (BCHK(PIND,RFID_IN)) 			// Start bit goes low
        return;
    uint8_t bit = 0;
    TunedDelay(CENTER_DELAY);       	// Center on start bit
    for (uint8_t x = 0; x < 8; x++)
    {
        TunedDelay(INTRABIT_DELAY); 
        if (BCHK(PIND,RFID_IN))		
            BSET(bit,x);
        else
            BCLR(bit,x);
    }
    TunedDelay(INTRABIT_DELAY);
    RFID_tag[rxIdx] = bit;
    ++rxIdx;
    if (rxIdx == 12)
        bDataReady = 1;
}

void RFID_ena(uint8_t ena)
{
    if (ena)
        BCLR(PORTD,RFID_ENA);
    else
        BSET(PORTD,RFID_ENA);
}

void TunedDelay(uint16_t delay)			// delay function
{
  uint8_t tmp=0;

  asm volatile("sbiw    %0, 0x01 \n\t"
    "ldi %1, 0xFF \n\t"
    "cpi %A0, 0xFF \n\t"
    "cpc %B0, %1 \n\t"
    "brne .-10 \n\t"
    : "+r" (delay), "+a" (tmp)
    : "0" (delay)
    );

}

void CriticalSegment(uint8_t ena)
{
    static uint8_t sreg;
    if (ena)
    {
        sreg = SREG;    // save off our global status register
        cli();          // stop global interrupts
    } else
    {
        SREG = sreg;    // restore global interrupt flag (and any other prev settings)
    }
}



}


Zdrojový kód: Médiá:common.c Médiá:common.h Médiá:RFID_.c Médiá:serialll.c Médiá:serialll.h

Overenie

RFID čítačku treba zapojiť na +5V. Pred prvým použitím je potrebné nastaviť prenosovú rýchlosť 2400 baudov, 8 dátovych bitov, 1 štart bit, 1 stop bit a žiadnu paritu. Pripojenie mikropočítača je urobené pomocou USB kábla. AK svieti červená LED, tak čítačka je pripravená na čítanie a čaká kým priložíme dáky tag ( kartu, kľúčenku na prečítanie). Keď priložíme k čítačke kartu tak nám prečíta kód ktorý je tam nahraný, a môžeme ho vidieť pomocou UART komunikácie v PC. Tento kód však nie je správny, tak LED dióda svieti na červeno a uvidíme výpis: Nesprávny kód! Ak priložíme kľučenku vypíše sa nám správny kód, rozsvieti sa zelená LED a uvidíme nápis Prístup povolený.

Obrázky na ilustráciu