PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : EEPROM beschreiben und auslesen....



schamp
03.08.2005, 08:47
Hi Leutz !

Versuch hier grad was ins EEPROM vom Mega88 zu schreiben und dieses dann wieder auszulesen. Die ausgelesenen Werte werden dann einfach ans Terminal geschickt.
Die Funktionen EEPROM_write und EEPROM_read hab ich aus dem Datenblatt.
Leider erscheint nichts am Terminal... :-k
Hab auch schonmal das EEPROM Hexfile mit AVR Studio ausgelesen, welches aber dann nicht wirklich so aussieht wie ichs eigntlich erwarten würde.
Könnt ihr ma drüberschauen ??




#include <iom88.h>
#include <ina90.h>
#include "sw_uart.h"


void EEPROM_write(unsigned int adress, char data);
char EEPROM_read(unsigned int adress);


__task void main(void)
{
unsigned int adresse=0;
char datenbyte=0;


char byte1=0;
char byte2=0;
char byte3=0;
char byte4=0;


__enable_interrupt();


/* AFFE ins EEPROM schreiben */
adresse = 0x0000;
datenbyte = 0x0A;
EEPROM_write(adresse, datenbyte);


adresse = 0x0008;
datenbyte = 0x0F;
EEPROM_write(adresse, datenbyte);


adresse = 0x0010;
datenbyte = 0x0F;
EEPROM_write(adresse, datenbyte);


adresse = 0x0018;
datenbyte = 0x0E;
EEPROM_write(adresse, datenbyte);



/* AFFE wieder auslesen */
byte1 = EEPROM_read(0x0000);

byte2 = EEPROM_read(0x0008);

byte3 = EEPROM_read(0x0010);

byte4 = EEPROM_read(0x0018);


/* und ans Terminal senden */
while(1)
{
send_one_byte(byte1);
send_one_byte(byte2);
send_one_byte(byte3);
send_one_byte(byte4);
send_one_byte('\r');
send_one_byte('\n');
}
}


void EEPROM_write(unsigned int adress, char data)
{
/* Warten bis vorheriger Schreibvorgang beendet */
while(EECR & (1<<EEPE));

EEAR = adress; // Adresse an der das Byte im EEPROM geschrieben werden soll

EEDR = data; // Datenbyte, welches im EEPROM gespeichert werden soll

EECR |= (1<<EEMPE);

EECR |= (1<<EEPE); // Starte EEPROM Write
}



char EEPROM_read(unsigned int adress)
{
while(EECR & (1<<EEPE));

EEAR = adress; // Adresse an der Byte im EEPROM ausgelesen werden soll

EECR |= (1<<EERE); // Auslesen starten

return EEDR;
}

Gruß schamp

linux_80
03.08.2005, 10:17
Hallo,
ich hab jetzt grad mal den unterschied zwischen Mega8 und Mege 88 EEprom gesucht, und beim M88 muss man anscheinend noch zwei weitere Bits setzen, bzw. löschen, obwohl das PRG-beispiel das gleiche ist !
Schau mal die Beschreibung vom EECR die Bits EEPMx die gibts beim Mega 8 gar nicht.
Und nicht vergessen den IRQ deaktivieren in dieser Zeit, nicht das da auch noch was dazwischen funkt.

schamp
03.08.2005, 11:37
Thx für die Tipps !!

Hab jetzt funktionierenden Code:


#include <iom88.h>
#include <ina90.h>
#include "sw_uart.h"


void EEPROM_write(unsigned int adress, char data);
char EEPROM_read(unsigned int adress);


__task void main(void)
{
unsigned int adresse=0;
char datenbyte=0;


char byte1=0;
char byte2=0;
char byte3=0;
char byte4=0;


/* ins EEPROM schreiben */
adresse = 0x0000;
datenbyte = 0x41; // 'A'
EEPROM_write(adresse, datenbyte);


adresse = 0x0008;
datenbyte = 0x46; // 'F'
EEPROM_write(adresse, datenbyte);


adresse = 0x0010;
datenbyte = 0x46; // 'F'
EEPROM_write(adresse, datenbyte);


adresse = 0x0018;
datenbyte = 0x45; // 'E'
EEPROM_write(adresse, datenbyte);



/* AFFE wieder auslesen */
byte1 = EEPROM_read(0x0000);

byte2 = EEPROM_read(0x0008);

byte3 = EEPROM_read(0x0010);

byte4 = EEPROM_read(0x0018);


sw_uart_init();

__enable_interrupt(); // Interrupts erst zulassen, wenn EEPROM beschrieben ist !!


/* und ans Terminal senden */
while(1)
{
send_one_byte(byte1);
send_one_byte(byte2);
send_one_byte(byte3);
send_one_byte(byte4);
send_one_byte('\r');
send_one_byte('\n');
}
}


void EEPROM_write(unsigned int adress, char data)
{
/* Warten bis vorheriger Schreibvorgang beendet */
while(EECR & (1<<EEPE));

EEAR = adress; // Adresse an der das Byte im EEPROM geschrieben werden soll

EEDR = data; // Datenbyte, welches im EEPROM gespeichert werden soll

EECR &=~ (1<<EEPM0); // Erase and Write in one Operation (siehe Datenblatt Programming Mode)

EECR &=~ (1<<EEPM1);

EECR |= (1<<EEMPE);

EECR |= (1<<EEPE); // Starte EEPROM Write
}



char EEPROM_read(unsigned int adress)
{
while(EECR & (1<<EEPE));

EEAR = adress; // Adresse an der Byte im EEPROM ausgelesen werden soll

EECR |= (1<<EERE); // Auslesen starten

return EEDR;
}

Hab jetzt zusätzlich noch die EEPMx in der eeprom_write Funktion eingestellt. Entsprechende Hexcodes für ASCII verwendet (damit wirklich AFFE im Terminal angezeigt wird). Enable Interrupts erst wenn EEPROM beschrieben wurde.
Und zu guter letzt noch vergessen Software UART zu initialisieren :-b

Gruß schamp

linux_80
03.08.2005, 12:03
Das mit dem IRQ deaktivieren und aktivieren würde ich aber in die EEprom_write verlegen, jedesmal wenn geschrieben wird, sonst funktinoert evtl. etwas andres nicht, wenn Du das PRG später mal woanders verwendest.

Beim lesen vom EEprom ist es nicht so kritisch, aber sicherheitshalber könnte man ums lesen auch den IRQ deaktivieren, nicht das genau in diesem Moment in einem IRQ jemand die Adresse tauscht !

benites
12.12.2005, 17:33
hallo,

wäre möglich die oben genannte Datei "sw_uart.h" zu bekommen.
Danke

Benites