AVR/Arduino RFID-läsare med UART kod i C (3 / 4 steg)
Steg 3: Skriva koden
RFID-läsare dataformat
Parallax RFID-läsare skickar data i fasta, glaciala takt av 2400 baud. En RFID-tagg är 10 byte. För att möjliggöra/felkorrigering upptäckt, eftersom läsaren skulle kunna avräknas från slumpmässigt brus, begränsas 10-byte RFID av en start och stopp sentinel. Start sentinel är radmatning (0x0A) och stop sentinel är vagnretur (0x0D). Det ser ut så här:
[Starta Sentinel | Byte 1| Byte 2 | Byte 3| Byte 4| Byte 5| Byte 6| Byte 7| Byte 8|Byte 9| Byte 10| Stoppa Sentinel]
Detta är de tre huvudstegen.
Vet när en tagg har skickats
Jag använde en Pin ändra avbryta på AVR som meddelar firmware som har skett en förändring på ett övervakade stift. Konfigurera AVR för detta är lätt och kräver att flaggan, berättar MCU vilken pin som du vill övervaka och att global avbrott biten.
Konfigurera PCINT
BSET(PCICR,PCIE2); PIN change interrupt kontroll registrera pcie2 BSET(PCMSK2,PCINT18); aktiverar pin change avbrott för PCINT18 (PD2) BSET(SREG,7); Ställ in SREG bit
Skriva din avbrottstjänstens rutin
Du vill behålla din ISR kort så i min avbrottsvektor jag läste den hela byten, bit för bit, och lagra byten i en global flyktiga karaktär utbud. Jag gör följande vid varje avbrott:
- Kontrollera för att säkerställa jag på lite start
- Centrera tidpunkten på mellersta pulsen på 2400 baud (hastigheten av RFID-läsare)
- Hoppa över startbit och pausa till mitten av nästa stycke
- Läsa in varje bit i ett osignerat heltal
- När jag har 8 bitar, sätta byten till en karaktär array
- När jag har samlat 12 byte, låt MCU vet etiketten har lästs för felsökning.
Jag ändrade SoftSerial kod från Mikal Hart som ändrade koden från David Mellis för experimentellt bestämd förseningarna i de seriella rutinerna.
Tolka RS232 utgång
Rutinen PCINT innehåller koden för att läsa den RS232 utgången från RFID-läsare.
När jag har fått 12 byte (10-byte RFID plus sentinels) jag sätta bDataReady till 1 och låt huvudloop bearbeta data och Visa den.
Detta är avbrott handlerISR(PCINT2_vect) {om (BCHK(PIND,RFID_IN)) / / startbit går låg avkastning, uint8_t lite = 0; TunedDelay(CENTER_DELAY); Center på start lite för (uint8_t x = 0, x < 8, x ++) {TunedDelay(INTRABIT_DELAY); / / hoppa lite, bror... om (BCHK(PIND,RFID_IN)) BSET(bit,x), annan BCLR(bit,x);} TunedDelay(INTRABIT_DELAY); hoppa över stop bit RFID_tag [rxIdx] = bit; ++ rxIdx; om (rxIdx == 12) bDataReady = 1;}
Uppvisning din tagg
I Main () kollar under for(ever) slingan, jag för att se om bDataReady har angetts, signalering att hela RFID-strukturen har skickats. Jag sedan kontrollera att se om det är en giltig tag (dvs start och stopp tecken är 0x0A och 0x0D, respektive), och om så, jag skicka ut min RS232 anslutning.
för (;) {om (bDataReady) {#ifdef __DEBUG__ USART_tx_S ("starta byte:"); USART_tx_S (itoa (RFID_tag [0], och ibuff[0],16)); ibuff [0] = 0; ibuff [1] = 0; USART_tx_S ("\nStop byte:"); USART_tx_S (itoa (RFID_tag [11], och ibuff[0],16)); #endif om (ValidTag()) {USART_tx_S ("\nRFID Tag:"); för (uint8_t x = 1; x < 11; x ++) {USART_tx_S(itoa(RFID_tag[x],ibuff,16)); om (x! = 10) USART_tx(':');} USART_tx_S("\n"); } rxIdx = 0; bDataReady = 0; }}