Étape 3: Écrire le Code
Format de données pour le lecteur RFID
Le lecteur RFID de parallaxe envoie des données à un rythme fixe et glaciaire de 2400 bauds. Une étiquette RFID est de 10 octets. Afin de permettre de détection/correction d’erreur, étant donné que le lecteur pourrait être partit de bruit aléatoire, la RFID de 10 octets est délimitée par une sentinelle start et stop. La sentinelle de départ est (0x0A) de saut de ligne et la sentinelle d’arrêt est de retour chariot (0x0D). Il ressemble à ceci :
[Start Sentinel |Byte 1|Byte 2|Byte 3|Byte 4|Byte 5|Byte 6|Byte 7|Byte 8|Byte 9|Byte 10| Stop Sentinel]
Voici les trois étapes principales.
Savoir quand une balise a été soumise
J’ai utilisé un code Pin modifier interrompre l’AVR qui avertit le firmware qu’un changement s’est produite sur un axe surveillé. Configurer l’AVR pour cela est facile et nécessite définissant l’indicateur, en disant la MCU qui NIP que vous souhaitez surveiller et définissant le bit global interrupt.
Configurer P.C.int
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
Écrivez votre routine d’interruption du service
Vous voulez garder votre ISR court donc dans mon vecteur d’interruption, j’ai lu l’octet entier, morceau par morceau et stocker les octets dans un tableau de caractère volatile global. Je fais ce qui suit à chaque interruption :
- Assurez vous que je suis sur un bit de départ
- Centrez le calendrier sur le pouls moyen à 2400 bauds (la vitesse du lecteur RFID)
- Passer le bit de départ et de faire une pause au milieu de la mèche suivante
- Lire chaque bit dans un entier non signé
- Quand j’ai 8 bits, mettre l’octet dans un tableau de caractères
- Lorsque j’ai recueilli 12 octets, informez le MCU que la balise a été lue pour la détection d’erreurs.
J’ai modifié le code SoftSerial de Mikal Hart qui a modifié le code de David Mellis pour les délais déterminés expérimentalement dans les routines de série.
Analyser une sortie RS232
La routine P.C.int contient le code pour lire la sortie RS232 du lecteur RFID.
Lorsque j’ai obtenu 12 octets (10 octets RFID plus sentinelles), j’ai mis bDataReady 1 et laisser la boucle principale de traiter les données et les afficher.
// 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;}
Afficher votre balise
Dans le main(), au cours de la boucle de for(ever), j’ai vérifier si bDataReady a été défini, signalisation que la structure entière de la RFID a été envoyée. J’ai ensuite vérifier pour voir si c’est une étiquette valide (c’est à dire commencer et arrêt caractères sont 0x0D, 0x0A et respectivement), et si donc, j’ai envoyer ma connexion 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; }}