Hallo,
ich versuche eine adresse im eeprom zu beschreiben und sie wieder
auszulesen.Doch irgendwo hackt das Programm. Sind die Funktionen für
das lesen und schreiben im eeprom eines atmega 16 richtig.Danke
char eeprom_daten_auslesen()
{
int adress;
adress=400;
while(EECR & (1<<EEWE))
{
}
EEAR=adress;
EECR=EECR | (1<<EERE);
return EEDR;
}
Ich mach' das mit WinAVR so:
#include <avr/eeprom.h>
eeprom_busy_wait();
eeprom_read_block(&Temp_Variable,(uint16_t*)0,sizeof(int));
if (!(Variable == Temp_Variable))
{
eeprom_busy_wait();
eeprom_write_block(&Variable,(uint16_t*)0,sizeof(int));
}
wobei 'Variable' die zu Schreibende /lesende Variable ist und
'Temp_Variable' eine temporäre um zu überprüfen ob der EEPROM-Inhalt
differiert. Falls der Inhalt gleich ist braucht nicht neu geschrieben
zu werden. In diesem Fall wird ab Startadresse '0' geschrieben
(gelesen). Mit sizeof wird die anzahl Bytes abgefragt, die geschrieben
werden soll (abhängig von der Variablen).
Ist aber in den Examples im WinAVR gut beschrieben.
"ja, das liegt vor mir, aber ich wollte das ein wenig umändern."
Es wäre sicher einfacher, wenn du die Änderungen im Code kommentiert
oder wenigstens markiert hättest ;-)
soviel ist nicht verändert worden:
void eeprom_daten_auslesen()
{
int adress;
adress=400;
while(EECR & (1<<EEWE))
{
}
EEAR=adress;
EECR=EECR | (1<<EERE);
eeprom_daten[0]=EEDR; !!!ich lese hier den Wert im EEDR Register
in ein Feld Namens eeprom.data[0]
}
leider liegt es daran auch nicht...habe es geändert..
er schafft es irgendwie nicht den wert zu speichern.. bzw. wieder
einzulesen...
wenn ich mir einen wert vorgebe, und ihn direkt ausgebe funktioniert es
...
nur wenn ich einen wert speichern und anschliessend lesen möchte , gibt
er mir einen falschen wert aus...
Wenn Du schon den WINAVR verwendest, wieso benutzt Du dann nicht, wie
von Sonic angegeben, die entsprechenden Funktionen aus der AVR-libc?
Die sind doch genau dafür da, dass Du Dir um die ganze Warterei und
Registerschreiberei keine Gedanken machen musst!
Deklariere Deine Variable im EEPROM mit
unsigned char EEMEM variable;
oder
unsigned char EEMEM array[LAENGE];
und greife mit
eeprom_daten[0] = eeprom_read_byte(variable);
oder
eeprom_daten[0] = eeprom_read_byte(array[i]);
drauf zu.
Vorsicht beim EEPROM-Auslesen mit AVR-Studio 4.12 (SP3)! Bei mir geht
das Auslesen erst nachdem ich das EEPROM 1x beschrieben habe! Ansonsten
bleibt def Puffer bei 0xFF.
@ Sonic
Das ist logisch. 0xFF heisst das EEPROM ist an dieser Stelle
unbeschrieben, leer, gelöscht.
@ Greenhorn
Die Zeile mit !!! ist die einzige Änderung oder hast du auch was in
eeprom_daten_speichern(); geändert? Muss man zwischen Schreiben und
Lesen eine Wartezeit einhalten?
@Stefan:
klar heißt 0xFF dass das EEPROM leer ist. das ist ja der Fehler. Das
EEPROM ist eben definitiv nicht leer, nur das AVR-Studio zeigt mir leer
an!
hallo,
hat jemand eine Beispiel-Code zum lesen und schreibe des ineternen
Eeproms. Ich wäre ihm sehr dankbar, da ich hier nicht mehr weiter
komme.
Danke
also die ausgabe per serieller schnittstelle passt schon .. er gibt mir
zahlen aus die ich vorher deklariert habe. doch wenn ich mit einer
variable eine zahl speichere und mit einer anderen variablen versuche
aus dem eeprom zu lesen , zeigt er mit die zahl 255 an ...
>doch wenn ich mit einer variable eine zahl speichere und mit einer>anderen variablen versuche aus dem eeprom zu lesen , zeigt er mit >die
zahl 255 an ...
Deswegen schlage ich ja vor, dass du mal etwas ins EEPROM schreibst,
ohne dein Programm zu benutzen.
Dann könnte man feststellen, ob es am Lesen oder am Schreiben ins
EEPROM liegt.
[OT]
Auf der Tastatur gibt es diverse Tasten, die es ermöglichen auch
Großbuchstaben zu verwenden.
[/OT]
Das Assembler-Listing habe ich mir inzwischen selbst erzeugt und
angesehen. Das sieht korrekt aus.
Ich weiss jetzt auch nicht mehr weiter, ausser bekannt funktionierende
Routinen zu checken oder das Beschreiben auch mal mit externen Tools zu
versuchen.