Hi. Also ich versuche grad das EEPROM eines ATMega8515 anzusprechen. Nur aus dem AVR-GCC Tutorial werde ich nicht richtig schlau. Es steht ja da das ich bei der Funktion "eeprom_write_byte" die Adresse und den Inhalt angeben muss. Wie ist diese Adresse aufgebaut? Also wenn ich dort jetzt die Zahl 1 als Adresse hinschreib (geht das überhaupt) wird dann der Speicherbereich "1" beschrieben? Musst ich dann danach auf Adresse 9 mit dem nächsten Byte weiterschreiben? Wäre super wenn mir jemand das Grundlegend erklären könnte. Hier im Forum steht viel zum Thema EEPROM aber nicht eben wie das mit den Speicherbereichen genau aussieht.
> Also wenn ich dort jetzt die Zahl 1 als Adresse hinschreib > geht das überhaupt) Jein, du wirst eine Warnung bekommen, dass du eine Zahl übergibst, obwohl eine Adresse erwartet wird. Aber es funktioniert. ``Politisch korrekt'' wäre
1 | #include <stdint.h> |
2 | ...
|
3 | (uint8_t *)1 |
als Adressangabe. > wird dann der Speicherbereich "1" beschrieben? Ja. > Musst ich dann danach auf Adresse 9 mit dem nächsten Byte > weiterschreiben? Wieso 9? Das wäre dann 8 Bytes weiter. Außerdem ist 1 natürlich nicht die erste Adresse, sondern 0.
Danke Jörg für die schnelle Antwort. Wegen der Adresse 9 ich dachte es geht Bit weise und nicht byte weise. Also mit Adressen hab ich mich noch überhaupt nicht beschäftigt deswegen hab ich im AVR-GCC Tutorial auch nicht verstanden warum dort steht "eeprom_write_byte(&eeFooByte,myByte);" Woher weiß ich nun welche Adresse das ist ? Meines achtens wurde es ja nicht davor festgelegt oder hab ich irgendetwas übersehen? Beim lesen aus dem EEPROM ist das selbe Problem es steht im Tut.: "mybyte = eeprom_read_byte(&eeFooByte); (zuvor wurde noch geschrieben "uint8_t eeFooByte EEMEM = 123;) ? Und nach der schreib anweisung steht nun das die Variable mybyte nun den Wert 123 erzhält? Aber wurde nicht vorher die Adresse dann auf 123 gesetzt? Du sieht ich bin durch den Code leicht verwirrt.
Momeeent. Bei der Deklaration uint8_t eeFooByte EEMEM = 123; sagst du dem Compiler, dass er die Variable im EEPROM anlegen soll. Wo genau interessiert dich, als Programmierer erstmal nicht. Wenn du nun mybyte = eeprom_read_byte(&eeFooByte); ausführst, dann siehst du vor der Variable ein "&" Zeichen. Steht vor einer Variable das "&" Zeichen, wird deren Adresse zurückgegeben. Mit der Anweisung sagst du dem Compiler also "Lese den Wert aus dem EEPROM, der an der Adresse [Adresse von eeFooByte] steht". würdest du mybyte = eeprom_read_byte(eeFooByte); Also ohne "&" nehmen, dann würde er den Inhalt der Variable eeFooByte als Adresse interpretieren und in diesem Falle auf die Adresse 123 zugreifen.
eeFooByte ist eine Variable, die in einer EEPROM section
deklariert ist. Deren Adresse kann man sofort nehmen (mit
dem &-Operator), ohne dass man die exakte Adresse kennt
(kann irgendwo im EEPROM liegen). Man spricht damit also
eine EEPROM-Zelle an, ohne dass man sich dafür interessiert,
welche es denn genau ist.
Um den Initialwert zu erhalten, lädt man die EEPROM-Datei
einmalig in selbigen (mit einem Programmier-Werkzeug).
> mybyte = eeprom_read_byte(eeFooByte);
Nein, grundverkeht. Das würde die Adresse von eeFooByte benutzen,
damit aber den RAM (also eine normale Variable) aufsuchen, dann
den Inhalt der entsprechenden RAM-Zelle lesen und als EEPROM-
Adresse interpretieren, um den an dieser Stelle befindlichen
Wert zu extrahieren. Das ist sehr wahrscheinlich nicht, was du
wirklich willst. ;-)
@Jörg: Hm? Das ohne "&" Operator habe ICH geschrieben (nicht der fragesteller), zur demonstration. und auch genau so wie du erklärt.
Ahja. Dank euch erst mal aber ich dachte es ist so wichtig die Adresse zu kennen. Ich möchte jetzt am Anfang nur zum testen ein Lauflicht programmieren das an der letzten Stelle vor dem ausschalten wieder weitermacht (vor dem Ausschalten drückt man einfach eine "save" Taste). Hab ich das jetzt so richtig verstanden? Also ich möchte einfach eine 8bit Variable in den EEPROM schreiben und auch lesen. Also lege damit "uint8_t eeFooByte EEMEM = 123;" die Variable im EEPROM an und kann sie dann später über eeFooByte beschreiben und auslesen? Kann ich diese Variable dann auch ganz einfach als Array (eben für den Datenlogger anlegen) ? Und dann eben mit den read und write methoden beschreiben bzw. lesen? Später will ich einen Datenlogger realisieren aber ich denke das ist dann nicht mehr schwer wenn ich mal das grundlegende verstanden hab.
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.