Shop OBEX P1 Docs P2 Docs Learn Events
interfacing Atmega32 to 28440 RFID HELP — Parallax Forums

interfacing Atmega32 to 28440 RFID HELP

omniaomnia Posts: 5
edited 2012-05-02 19:54 in General Discussion
Hi , I really would like some help in interfacing atmega32 to 28440 rfid and I am connecting the atmega32 to LCD to make sure that the code is working properly , I wrote a code using codevision but when connecting the circuit the rfid module doesnot flash red only green
I really don't know what's wrong here is my code to see if Iam doing something wrong
#include <mega32.h>
#include <stdlib.h>
#include <delay.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#include <alcd.h>
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
#endif
#ifndef DOR
#define DOR 3
#endif
#ifndef FE
#define FE 4
#endif
#ifndef UDRE
#define UDRE 5
#endif
#ifndef RXC
#define RXC 7
#endif
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index++]=data;
#if RX_BUFFER_SIZE == 256
// special case for receiver buffer size=256
if (++rx_counter == 0)
{
#else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
#endif
rx_buffer_overflow=1;
}
}
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#endif
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
#if TX_BUFFER_SIZE <= 256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif
// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index++];
#if TX_BUFFER_SIZE != 256
if (tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
#endif
}
}
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index++]=c;
#if TX_BUFFER_SIZE != 256
if (tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
#endif
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
char c;
int i;
char str[4];
void usart_init()
{
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 8
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
lcd_putsf("HAHA"); // this is ony to make sure that the LCD is functional
delay_ms(1000);
for(i = 0; i <2; i++)
{
usart_init();
printf("!RW");
putchar(0x01);
putchar(33);
}
for(i = 0; i < 5; i++)
{
c = getchar();
lcd_putsf("XAXA"); // and this is to make sure if it gets any character
itoa(c, str);
lcd_puts(str);
lcd_putsf(",");
}

}

}

ional
the output of this code is only HAHA
I really don't know if the RFID is working in the first place or my code is not functional

Comments

  • FranklinFranklin Posts: 4,747
    edited 2012-04-30 10:12
    Too much unformatted code to go through. How do you have the two connected to each other and how are you powering it? Have you tried Atmel forums for the coding help?
  • omniaomnia Posts: 5
    edited 2012-04-30 11:38
    Franklin wrote: »
    Too much unformatted code to go through. How do you have the two connected to each other and how are you powering it? Have you tried Atmel forums for the coding help?

    That's because I am using codevision .I have connected the sin pin in the rfid to the TX pin in atmega32 which is pin PD1 (pin 15) and the sout to the RX pin which is pin PD0 (pin 14) . I have used a 5 v power supply and I have tried to go through Atmel forums but I can't seem to find something useful , I really appreciate any suggestions or tips of what might be wrong .Thanx for your reply
  • Martin_HMartin_H Posts: 4,051
    edited 2012-04-30 11:39
    If you use the code tags the forum will preserve white space.

    attachment.php?attachmentid=78421&d=1297987572

    It makes code much easier to proof read.
  • Mike GreenMike Green Posts: 23,101
    edited 2012-04-30 12:04
    We can't help you with the Atmel code itself. It sounds like you have the proper connections. You have to configure the Atmel's serial I/O for 9600 Baud, 8 bits, no parity, normal mode (not inverted). Once you have that, it should work. The examples in the RFID device's documentation use the Stamp's SEROUT and SERIN statements which are very very simple. You can ignore most of the statements except for the stuff in the square brackets ([]). The stuff in quotes ("") is sent literally. Variable values are sent as 8-bit bytes. The SERIN statements get byte values as received. The STR prefix is used to fill a byte array with a specified number of bytes. The REP prefix is used for multiple (repeated) values. Be a little careful since some constant and variable names have underlines in them (like RFID_Read) which don't show up too well in the on-line document.
  • FranklinFranklin Posts: 4,747
    edited 2012-04-30 12:21
    Redacted as wrong info......
  • Mike GreenMike Green Posts: 23,101
    edited 2012-04-30 12:25
    The code that Franklin posted is for the read-only RFID reader, not the read / write RFID device that you're using. These are very different devices.
  • FranklinFranklin Posts: 4,747
    edited 2012-04-30 12:32
    Oops, Sorry....
  • Mike GreenMike Green Posts: 23,101
    edited 2012-04-30 13:00
    Here's a modification for part of your code. It will send a command to read the 4 bytes stored at location 33 of the RFID tag:
    usart_init();
    do {
       printf("!RW");
       putchar(0x01);
       putchar(33);
    } while ((errCode = getchar()) <> 0x01);
    
    At this point, the read operation is successful and the RFID reader will return the data read:
    for (i=0;i<4;i++) dataBytes[i] = getchar();
    
  • omniaomnia Posts: 5
    edited 2012-05-01 15:42
    I have modified the code but nothing seems to work ,I was just wondering if there is any initialization sequence for the 28440 RFID before starting to use it that is not mentioned in the data sheet
    I have tested my atmega32 and it is working properly and I am sure that I have wired it correctly .I have missed something but I can't figure out what it is :(
  • Mike GMike G Posts: 2,702
    edited 2012-05-01 15:58
    I've built several 28440 RFID projects. I can confirm that the datasheet has everything you need. You must have a bug in your code or a connection problem.

    What kind of RFID tag are you using?
  • omniaomnia Posts: 5
    edited 2012-05-01 21:29
    I am using the RFID R/W 54mm x 85mm Rectangle Tag EM Microelectronic-Marin SA EM4x50 family ..
  • omniaomnia Posts: 5
    edited 2012-05-02 13:29
    Is it possibly that I should perform a write operation first before trying to read the tag ? this is the only thing that i came out with after reading the data sheet over and over again ..
  • Mike GMike G Posts: 2,702
    edited 2012-05-02 19:15
    It's very simple. Transmit the read command. The LED goes from Green to Red. Read the response. you might not see the LED turn green again. It depends on how fast the read command is issued.
    The RFID Read/Write Module responds to each command with a single-byte status/error code in
    hexadecimal format followed by any returned data, if applicable. In most standard implementations, the
    user will repeatedly call the desired function until the ERR_OK status byte is returned, indicating that the
    function successfully completed with no errors.

    You have a bug in your code or your connection or both.
  • Mike GreenMike Green Posts: 23,101
    edited 2012-05-02 19:54
    As Mike G noted ... If you correctly transmit the read command, the RFID module will respond with a status byte. If the status byte is ok (0x01), then the status byte will be followed by 4 data bytes. That's it. If it doesn't work, you most likely have a bug in your code or something wrong with the connections between the module and your processor. You might try to find someone with an oscilloscope or logic analyzer to look at the actual signals between the two.
Sign In or Register to comment.