Hela idéen är att en RFIDläsare kopplas till en uC. 7 st olika dioder beskriver utåt vad det är som händer. När allt fungerar så är det meningen att den ska kopplas till något vettigare, men nu början så duger dioderna fint.
Koden är skriven som så här.
Användaren har två möjligheter (knapp1 och knapp2). Knapp ett är verifierings processen. När denna knapp är nedtryckt så kan information tas emot från RFID läsaren genom USARTen. Informationen som läses in jämförs sedan bit för bit med informationen som finns i EEPROM minnet. Skulle någon bit vara ogiltig så avbryter den direkt och indikerar genom att tända en diod.
Knapp nummer två är skrivningen till minnet. Det första den gör efter kortet är inläst är att kontrollera så att det inte redan finns i minnet. Om den inte redan existerar så skrivs kortet till minnet.
Som det ser ut nu så skriver den "shit" till minnet.
Så här såg det ut innan jag sparade ett kort i minnet:
Kod: Markera allt
:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
:00000001FF
Kod: Markera allt
:10000000F8E0F0F0F0F0E0FDF1FFFFFFFFFFFFFF91
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
:00000001FF
Lagringen av data i minnet har jag lagt upp så här.
Minnes plats ett används till att lagra antalet kort som finns i minnet.
För varje nytt kort som läggs i i minnet så ökar detta register med ett.
Här är koden till projektet.
Kod: Markera allt
#include <avr/io.h>
#include <util/delay.h>
#include <avr/iom88.h>
#define sBit(byte,bit) (byte |= 1<<bit)
#define cBit(byte,bit) (byte &= ~(1<<bit))
#define tBit(byte,bit) (byte & (1<<bit))
#define F_CPU 20000000UL //20Mhz
static unsigned char value_recive[12];
void USART_Init(void)
{
int MYUBRR = 520;
UBRR0H = (unsigned char)(MYUBRR>>8);
UBRR0L = (unsigned char)MYUBRR;
//Aktiverar mottagning
UCSR0B = (1<<RXEN0);
//Sätter en stopbit inget paritet och 8 bitar
UCSR0C = (0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);
}
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEPE));
/* Set up address and Data Registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMPE */
EECR |= (1<<EEMPE);
/* Start eeprom write by setting EEPE */
EECR |= (1<<EEPE);
}
unsigned char EEPROM_read(unsigned int uiAddress)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEPE))
;
/* Set up address register */
EEAR = uiAddress;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from Data Register */
return EEDR;
}
int read(void)
{
int counter = EEPROM_read(0); //Läser hur många kort som finns i databasen
int a; //Deklarerar a
int b; //Deklarerar b
int c; //Deklarerar c
int e; //Deklarerar e
unsigned char read_value; //Deklarerar read_value
for(a = 0; a < counter; a++) //Loppar så att antalet kort kan läsas av
{
c = a*10; //Gångrar antalet kort med 10
for(b = 1; b < 10; b++)
{
e = c+b; //Plusar på antalet gånger forlopen har gått
read_value = EEPROM_read(e); //Hämtar varje byte ur EEPROM
if(read_value != value_recive[b]) //Om angivna värdet inte stämmer överrens med lästa så hoppar loopen till nästa
{
b = 11;
}
if (b == 10)
{
return 1;
}
}
}
return 0;
}
void write(void)
{
int counter = EEPROM_read(0); //Läser hur många kort som finns i databasen
int b; //Ställer in register
counter++; //Adderar ett till antalkort som finns i databasen
counter = counter * 10; //Reserverar 10 bytes
for(b = 1; b < 10; b++) //Loopar 10 gånger, alltså skrivs 10 bytes
{
EEPROM_write(counter, value_recive[b]); //Skriver till minnet
counter++; //Ökar med en byte efter varje loop
}
}
void recive(void)
{
int b; //Ställer in register
for(b = 0; b < 10; b++)
{
while (!(UCSR0A & (1<<RXC0))); //Väntar på att information ska tas emot
value_recive[b] = UDR0; //Sparar data och retunerar allt..
}
}
int main()
{
USART_Init(); //Ställer in USARTen
DDRB = 0xFF; //Sätter dioderna som ut
DDRC = 0b00000100; //Sätter knappar som in och en diod som ut
unsigned char value[12];
int knappar1;
int knappar2;
while(1) //Loopar i all evighet
{
knappar1 = ~PINC & (1<<0); //Hämtar information om första knappen
knappar2 = ~PINC & (1<<1); //Hämtar information om andra kanppen
sBit(PORTB,0);
if (knappar1) //Kontrollerar kort
{
cBit(PORTB,0); //Släcker första dioden för att sedan tända den igen
sBit(PORTB,1); //Tänder andra dioden för att visa att uC är i läge 1
recive();
if (read() == 1) //Allt okej, kortet finns databasen
{
sBit(PORTB,2); //Tänder tredje dioden, allt OK
_delay_ms(300); //Väntar en stund
cBit(PORTB,2); //Släcker tredje dioden
}
else //Kortet finns ej i databasen
{
sBit(PORTB,3); //Tänder fjärde dioden, inte OK!
_delay_ms(300); //Väntar en stund
cBit(PORTB,3); //Släcker fjärde dioden
}
}
else if (knappar2) //Läser in nytt kort och sparar det i minnet
{
cBit(PORTB,0); //Släcker första dioden för att sedan tända den igen
sBit(PORTB,4); //Tänder femte dioden
recive(); //Hämtar information
if (read() == 1) //Kontrollerar ifall kortet finns i databasen OM ja -->
{
sBit(PORTB,5); //Tänder 6:e dioden, OK!
_delay_ms(300); //Väntar en stund
cBit(PORTB,5); //Släcker 6:e dioden
}
else //Om den inte finns i databasen
{
write(); //Hämtar och skriver till minnet
sBit(PORTC,2); //Tänder 7:e dioden, OK!
_delay_ms(300); //Väntar en stund
cBit(PORTC,2); //Släcker 7:e dioden
}
}
}
}
http://www.parallax.com/Store/Microcont ... roductName
Här är min uC:
http://www.avrfreaks.net/index.php?modu ... displayDev& objectid=77
Hoppas någon kan ge mig en hint om vad problemet skulle kunna vara.
Tack på förhand