Paso 3: Escribir el código
Formato de datos de lector RFID
El lector de RFID de paralaje envía datos a un ritmo fijo, glacial de 2400 baudios. Una etiqueta RFID es de 10 bytes. Para permitir la detección/corrección de errores, ya que el lector se podía fijar apagado de ruido aleatorio, el RFID 10 byte está delimitado por un centinela de start y stop. El centinela de inicio es línea de alimentación (0x0A) y el centinela de la parada es retorno de carro (0x0D). Este aspecto:
[Start Sentinel |Byte 1|Byte 2|Byte 3|Byte 4|Byte 5|Byte 6|Byte 7|Byte 8|Byte 9|Byte 10| Stop Sentinel]
Estos son los tres pasos principales.
Saber cuándo se ha presentado una etiqueta
Usé una interrupción de cambio de Pin en el AVR que notifica el firmware que se ha producido un cambio en un perno monitoreado. Configurar el AVR para esto es fácil y requiere de la bandera, diciendo el MCU que pin, que desea supervisar y el bit de interrupción global.
Configurar el PCINT
BSET(PCICR,PCIE2); // pin change interrupt control register pcie2 BSET(PCMSK2,PCINT18); // enable pin change interrupt for PCINT18 (PD2) BSET(SREG,7); // Set SREG I-bit
Escriba su rutina de servicio de interrupción
Desea mantener su ISR corta así en mi vector de interrupción que leer el byte entero, poco a poco y almacenar los bytes en una matriz de caracteres volátiles global. Hago lo siguiente en cada interrupción:
- Asegurarse de que estoy en un bit de arranque
- Centro de sincronización en el pulso medio a 2400 baudios (la velocidad del lector RFID)
- Saltarse el bit de inicio y pausa a la mitad del siguiente bit
- Leer cada bit en un entero sin signo
- Cuando tengo 8 bits, poner el byte en una matriz de caracteres
- Cuando yo he recogido 12 bytes, sepa el MCU que se ha leído la etiqueta para la detección de errores.
He modificado el código de SoftSerial de Hart Mikal que modifica código de David Mellis los retrasos determinado experimentalmente en las rutinas de la serie.
Analizar la salida RS232
La rutina PCINT contiene el código para leer la salida RS232 del lector RFID.
Cuando he conseguido 12 bytes (10 bytes RFID más centinelas) bDataReady el valor 1 y el bucle principal procesar los datos y mostrar.
// this is the interrupt handlerISR(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); // skip a bit, brother... if (BCHK(PIND,RFID_IN)) BSET(bit,x); else BCLR(bit,x); } TunedDelay(INTRABIT_DELAY); // skip stop bit RFID_tag[rxIdx] = bit; ++rxIdx; if (rxIdx == 12) bDataReady = 1;}
Mostrar la etiqueta
En el main(), durante el circuito de for(ever), verificar para ver si se ha establecido bDataReady, señalización que se ha enviado toda la estructura RFID. Yo entonces comprobar para ver si es un tag válido (es decir Inicio y parada de personajes es 0x0A y 0x0D, respectivamente), y si así, lo envíe a mi conexión RS232.
for (;;){ if (bDataReady) {#ifdef __DEBUG__ USART_tx_S("Start byte: "); USART_tx_S(itoa(RFID_tag[0],&ibuff[0],16)); ibuff[0] = 0; ibuff[1] = 0; USART_tx_S("\nStop byte: "); USART_tx_S(itoa(RFID_tag[11],&ibuff[0],16));#endif if ( ValidTag() ) { USART_tx_S("\nRFID Tag: "); for(uint8_t x = 1; x < 11; x++) { USART_tx_S(itoa(RFID_tag[x],ibuff,16)); if (x != 10) USART_tx(':'); } USART_tx_S("\n"); } rxIdx = 0; bDataReady = 0; }}