mikrocontroller.net

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


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

   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 );

 ...

Autor: Bernd (Gast)
Datum:

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

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.