Forum: Compiler & IDEs Werte in EEPROM an bestimmte Stelle schreiben


von Jens (Gast)


Lesenswert?

Hallo,

ich beschäftige erst seit einigen Wochen mit der µC-Controller-Thematik. 
Daher bitte ich möglicherweise etwas triviale Fragen meinerseits zu 
entschuldigen. Die Suchfunktion hat mir leider keine Ergebnisse 
gebracht. Vielleicht habe nach dem falschen Begriff gesucht.

Ich habe an meinem Atmega32 acht analoge Temp.fühler angeschlossen. Die 
Auswertung und Ausgabe über LCD als auch über USART funktioniert 
einwandfrei. Ich verwende das AVRStudio und avr-gcc.

Nun möchte ich mit dem EEPROM beschäftigen, um später in bestimmten 
Zeitintervallen dort meine Messwerte abzuspeichern und in regelmäßigen 
Abständen über den USART an den PC zu übertragen.

Die Messwerte sind vom Typ uint8_t und nehmen daher im EEPROM in Byte 
Platz ein?!?!

Um möglichst wenig Platz im EEPROM zu verschwenden, muss ich dort die 
Messwertdaten in einer bestimmten Reihenfolge ablegen können. Durch die 
systematische Speicherung der Daten kann ich dann die einzelnen Daten 
den Sensoren bei der Ausgabe über den USART zuordnen. Soweit zumindest 
meine Überlegungen...

Ich habe auch schon einzelne Werte in den EEPROM gespeichert, aber eine 
konkrete Adressierung des Speicherplatzes fehlt.
Gibt es also einen EEPROM-write Befehl, bei dem ich die Adresse im 
EEPROM fest vorgeben kann?

Falls ja, kann man die Adresse mit Hilfe einer Zählschleife bis 1024 (da 
der Atmega32 1024 Byte EEPROM besitzt) zählen lassen? Somit wüsste man 
dann auch gleich, wann der Speicher voll ist, oder?

Vielen Dank für Eure Hilfe.

Gruß
Jens

von Karl H. (kbuchegg)


Lesenswert?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM

   eeprom_read_byte(&eeFooByte);

Niemand sagt, dass du hier die Adresse einer Variablen angeben musst. 
Adresse ist Adresse und der Compiler kann sich nicht wehren :-)

    k = eeprom_read_byte( 1 );
    l = eeprom_read_byte( 2 );
    m = eeprom_read_byte( 3 );
  ..

   for( i = 0; i < 512; ++i )
     j = eeprom_read_byte( i );

 ...

von Bernd (Gast)


Lesenswert?

Du schreibst dir eine Funktion an der du die Adresse und Daten 
übergibst. Da du nur byteweise speicherst ist das recht einfach.
1
void EEPRomWrite (uint8_t Address, uint8_t Data)
2
{
3
    while (EECR & (1 << EEWE));         // EEPROM write still busy ?
4
    EEAR = Address;                     // EEPROM Adress Register
5
    EEDR = Data;                        // EEPROM Data Register
6
    EECR |= (1 << EEMWE);               // EEPROM write enable
7
    EECR |= (1 << EEWE);                // EEPROM write data
8
}

Habs jetzt nicht getestet aber so stehts im Datenblatt. Während des 
speicherns dann noch Interrupts sperren, thats it.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.