Knowingly or unknowingly the RFID technology is used by us in our day to day life.
The most familiar example is seen in MNCs, schools and offices for daily
attendance or automatic door opening system. The RFID contains two parts,
namely, tag and receiver modem. When an RFID tag comes in the range of
receiver, the tag gets activated and transmits its unique identification code
to the receiver module.
The output of the RFID receiver
is the unique ID in either serial (RS232) or wiegand format. Most of the
receivers are equipped with additional hardware to send the extracted code in
the above format, which can then be used by digital signal processors. This article
shows the interfacing of ATmega16 with RFID.
// Program to get the 12 byte string and display it on LCD
by Polling method:
/*
The RFID unique code is been displayed on LCE
LCD DATA port----PORT B
ctrl port------PORT D
rs-------PD0
rw-------PD1
en-------PD2
*/
#define F_CPU 12000000UL
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) -
1)
#include<avr/io.h>
#include<util/delay.h>
#define LCD_DATA PORTA //
LCD data port
#define ctrl PORTB
#define en PB2 //
enable signal
#define rw PB1 //
read/write signal
#define rs PB0 //
register select signal
void LCD_cmd(unsigned char cmd);
void init_LCD(void);
void LCD_write(unsigned char data);
void usart_init();
unsigned int usart_getch();
unsigned char i, card[12];
void getcard_id(void);
void LCD_display(void);
int main(void)
{
DDRA=0xff; //LCD_DATA port as
output port
DDRB=0x07; //ctrl as out put
init_LCD(); //initialization of
LCD
delay_ms(50); // delay of 50 milliseconds
usart_init(); // initiailztion of
USART
LCD_write_string("Unique
ID No."); //Function to
display string on LCD
while(1)
{
getcard_id(); // Function to get RFID card no. from
serial port
LCD_cmd(0xC0); // to go in second line and
zeroth position on LCD
LCD_display(); // a function to write RFID
card no. on LCD
}
return
0;
}
void getcard_id(void) //Function
to get 12 byte ID no. from rfid card
{
for(i=0;i<12;i++)
{
card[i]=
usart_getch(); // receive card value byte
by byte
}
return;
}
void LCD_display(void) //Function
for displaying ID no. on LCD
{
for(i=0;i<12;i++)
{
LCD_write(card[i]); // display card value byte by byte
}
return;
}
void init_LCD(void)
{
LCD_cmd(0x38); //initializtion
of 16x2 LCD in 8bit mode
_delay_ms(1);
LCD_cmd(0x01); //clear LCD
_delay_ms(1);
LCD_cmd(0x0E); //cursor ON
_delay_ms(1);
LCD_cmd(0x80); // ---8 go to
first line and --0 is for 0th position
_delay_ms(1);
return;
}
void LCD_cmd(unsigned char cmd)
{
LCD_DATA=cmd;
ctrl
=(0<<rs)|(0<<rw)|(1<<en);
_delay_ms(1);
ctrl
=(0<<rs)|(0<<rw)|(0<<en);
_delay_ms(50);
return;
}
void LCD_write(unsigned char data)
{
LCD_DATA=
data;
ctrl =
(1<<rs)|(0<<rw)|(1<<en);
_delay_ms(1);
ctrl =
(1<<rs)|(0<<rw)|(0<<en);
_delay_ms(50);
return
;
}
void usart_init()
{
UCSRB
|= (1 << RXEN) | (1 << TXEN);
// Turn on the transmission and reception circuitry
UCSRC
|= (1 << URSEL) | (1<<USBS) | (1 << UCSZ0) | (1 <<
UCSZ1);
//
Use 8-bit character sizes
UBRRL =
BAUD_PRESCALE; // Load lower
8-bits of the baud rate value..
//
into the low byte of the UBRR register
UBRRH =
(BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value..
// into the high byte of the UBRR register
}
unsigned int usart_getch()
{
while
((UCSRA & (1 << RXC)) == 0); // Do nothing until data have been
received..
// and is ready to be read from UDR
return(UDR);
// return the byte
}
void LCD_write_string(unsigned char *str) // take address value of the string
in pointer *str
{
int
i=0;
while(str[i]!='\0') // loop will go on
till the NULL characters is soon in string
{
LCD_write(str[i]); // sending data on LCD byte by byte
i++;
}
return;
}