So I got a reply for John Ryan on the Arduino forums and he mentioned that I would need to use an interrupt to grab RFID data to ensure it did not stop my program while waiting for a tag. I banged my head around with the implementation of interrupt code but found a solution that seems to work quite well on the forum.

Come to find out, there is an easy function already included called attachInterrupt(). Went ahead and added this to my code and rearranged everything to allow proper operation. Here is what I got out of it:

// RFID reader for Arduino
// Wiring version by BARRAGAN <http://people.interaction-ivrea.it/h.barragan>
// Modified for Arudino by djmatic
// And pieces from Arduino Playground <http://www.arduino.cc/playground/Learning/PRFID>
// And then modified again by thekidd
// 12.04.2008 - Added interrupt to ensure program does not hang on RFID reader.

#include <avr/interrupt.h>
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
#define ledPin 13

// set up a soft serial port
SoftwareSerial mySerial(rxPin, txPin);

int  val = 0;
char code[10];
int bytesread = 0;

void setup() {
  // define pin modes for tx, rx, led pins:
  pinMode(rxPin, INPUT);    // Set rxPin as INPUT to accept SOUT from RFID pin
  pinMode(txPin, OUTPUT);   // Set txPin as OUTPUT to connect it to the RFID /ENABLE pin
  pinMode(ledPin, OUTPUT);  // Let the user know whats up

  // set the data rate for the serial ports
  mySerial.begin(2400);    // RFID reader SOUT pin connected to Serial RX pin at 2400bps
  Serial.begin(9600);      // Serial feedback for debugging in Wiring

  // say something
  Serial.println("Hello World!");
 
  attachInterrupt(0, readRFID, CHANGE); // Setup interrupt for SOUT on RFID reader
  digitalWrite(txPin, LOW);           // Activate the RFID reader
}

void loop() {
  // Do Something
}

void readRFID() {
  digitalWrite(ledPin, LOW);          // Turn off debug LED - Event triggered!
  if((val = mySerial.read()) == 10) { // check for header
    bytesread = 0;
   
    while(bytesread<10) {             // read 10 digit code
      val = mySerial.read();
     
      if((val == 10)||(val == 13)) {  // if header or stop bytes before the 10 digit reading
        break;                        // stop reading
      }
     
      code[bytesread] = val;          // add the digit          
      bytesread++;                    // ready to read next digit 
    }
   
    if(bytesread == 10) {             // If 10 digit read is complete
      digitalWrite(txPin, HIGH);      // deactivate RFID reader
      digitalWrite(ledPin, HIGH);     // activate LED to show an RFID card was read
      Serial.print("TAG code is: ");  // possibly a good TAG
      Serial.println(code);           // print the TAG code
    }
   
    bytesread = 0;
    digitalWrite(txPin, LOW);           // Activate the RFID reader
  }
}

Now that I got that working properly, I’m off to get my LCD set back up and add that code to the code above!

del.icio.us:Parallax RFID Reader + Arduino - Code w/Interrupt digg:Parallax RFID Reader + Arduino - Code w/Interrupt spurl:Parallax RFID Reader + Arduino - Code w/Interrupt wists:Parallax RFID Reader + Arduino - Code w/Interrupt simpy:Parallax RFID Reader + Arduino - Code w/Interrupt newsvine:Parallax RFID Reader + Arduino - Code w/Interrupt blinklist:Parallax RFID Reader + Arduino - Code w/Interrupt furl:Parallax RFID Reader + Arduino - Code w/Interrupt reddit:Parallax RFID Reader + Arduino - Code w/Interrupt fark:Parallax RFID Reader + Arduino - Code w/Interrupt blogmarks:Parallax RFID Reader + Arduino - Code w/Interrupt Y!:Parallax RFID Reader + Arduino - Code w/Interrupt smarking:Parallax RFID Reader + Arduino - Code w/Interrupt magnolia:Parallax RFID Reader + Arduino - Code w/Interrupt segnalo:Parallax RFID Reader + Arduino - Code w/Interrupt

One Response to “Parallax RFID Reader + Arduino - Code w/Interrupt”

  1. on 27 Oct 2008 at 9:17 pm Zack

    As in your other project code, it seems a LOW mode, rather than CHANGE mode in the attachInterrupt works better. For me, with CHANGE, it would hang in the read function.

    attachInterrupt(0, readRFID, LOW);

Trackback URI | Comments RSS

Leave a Reply