Guten Morgen, ich habe vor aus dem EEPROM des Atmega48 den Wert auszulesen, der an der Adresse 0x10 liegt. Wie muss ich da vorgehen? Kann ich eine Variable direkt auf die Speicheradresse setzen. Hab gerade im Tutorial geschaut, dort ist aber nur beschrieben, wie man den ganzen Bereich des EEPROM's auf feste Adressen legt. Gruß
Schau mal ins Datenblatt. Zumindest beim ATMEGA8 ist der Zugriff auf den EEPROM ausführlich beschrieben. Sogar glaube mit Code.
Tim wrote: > Guten Morgen, > > ich habe vor aus dem EEPROM des Atmega48 den Wert auszulesen, der an der > Adresse 0x10 liegt. > > Wie muss ich da vorgehen? Kann ich eine Variable direkt auf die > Speicheradresse setzen. Hab gerade im Tutorial geschaut, dort ist aber > nur beschrieben, wie man den ganzen Bereich des EEPROM's auf feste > Adressen legt. > In C? Das geht ganz einfach:
1 | uint8_t myByte; |
2 | |
3 | myByte = eeprom_read_byte((void*)0x10); |
Besser ist es aber sich für die magische Konstante 0x10 zumindest ein #define zu machen
1 | #define MY_VALUE_ADDR ((void*)0x10)
|
2 | |
3 | uint8_t myByte; |
4 | |
5 | myByte = eeprom_read_byte(MY_VALUE_ADDR); |
...wie man den ganzen Bereich des EEPROM's auf feste Adressen legt... Ich dachte immer das die EEPROM Adressen eh fest vorgegeben sind. Wie genau steht im Datenblatt. Auslesen ist eigentlich ganz leicht. Mit dem passenden Register wird die Speicherzelle adressiert und dann einfach in ein anderes Register reingelesen mit Dem dann weitergearbeitet wird. Wie schon geschrieben wurde gibts in den Datenblättern sogar Codebeispiele, meistens sogar in Assembler und in C. bye Frank
Das EEPROM beschreiben und auslesen krieg ich hin, halt nur nicht von einer bestimmten Adresse. Und das steht leider nicht nicht im Datenblatt. Benutze das AVR-Studio mit dem GCC-Compiler. Hab dort die eeprom.h eingebunden und benutze die Schreib- und Lesebefehle aus dem GCC-Tutorial.
Du musst doch der Funktion nur als Parameter die Adresse übergeben. Wo ist dein Problem? Funktioniert die Adressübergabe nicht?
Tim wrote: > Das EEPROM beschreiben und auslesen krieg ich hin, halt nur nicht von > einer bestimmten Adresse. Und das steht leider nicht nicht im > Datenblatt. > > Benutze das AVR-Studio mit dem GCC-Compiler. Hab dort die eeprom.h > eingebunden und benutze die Schreib- und Lesebefehle aus dem > GCC-Tutorial. Die Funktion eeprom_read_byte will einfach nur diese Adresse haben. Mehr nicht. Du hast diese Adresse als Zahlenwert und musst nur noch dafür sorgen, dass der Datentyp stimmt. (Siehe weiter oben)
Hallo Karl Heinz, funktioniert einwandfrei. Vielen Dank! Dann kann ich das doch beim Schreiben genauso anwenden. Oder muss ich mir da immer ne Variable so definieren: unsigned int myByte EEMEM; ?
Da auch die eeprom_write_byte- bzw. eeprom_write_word-Funktion die Adresse der Speicherzelle übergeben bekommen, geht das selbstverständlich auch. Für einen (unsigned) int nimmste dann natürlich eeprom_write_word() und eeprom_read_word().
Tim wrote: > Dann kann ich das doch beim Schreiben genauso anwenden. Oder muss ich > mir da immer ne Variable so definieren: > > unsigned int myByte EEMEM; ? Nein musst du nicht. Du benutzt das genauso wie im Read Fall. Wenn du die EEMEM Sache benutzt, dann übernimmt der Compiler für dich die ganze Adressauszählerei und sorgt dafür, dass es zu keinen Überschneidungen der 'Variablen' kommt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.