Hallo Forumgemeinde,
ich arbeite mit Eclipse Helius und WINAVR. Ich möchte eine Fkt.
erstellen die nur ins EEPROM schreibt, wenn der Wert ungleich ist. Dazu
möchte ich der Fkt. einen EEPROM-Zeiger und den Wert an die Fkt.
übergeben.
Das ganze sieht so aus:
__________________________________________________
...
#include <avr/eeprom.h>
...
void write_ee_byte(unsigned char new_val, unsigned char *ep_into EEMEM)
{
unsigned char old_val EEMEM;
old_val = eeprom_read_byte(&ep_into); // akt. Wert aus EEPROM lesen
if (old_val == new_val) return; // neuem Wert vergleichen
eeprom_write_byte(&ep_into, new_val); // neuen Wert schreiben
}
__________________________________________________
Jetzt bekomme ich folgende Fehler:
section attribute not allowed for 'ep_into'
und
section attribute cannot be specified for local variables
Heißt dass, das man keinen Zeiger auf ein EEPROM erstellen kann und dass
man keine lokale EEPROM-Variablen erstellen kann?
Viele Grüße,
Marcel (",)
Marcel K. schrieb: > Heißt dass, das man keinen Zeiger auf ein EEPROM erstellen kann So was wie "Zeiger auf EEPROM" gibt es gar nicht. Alle Zeiger sind gleich. Nur die Verwendung des Zeigers entscheidet, wohin er letztlich gezeigt hat. Marcel K. schrieb: > dass man keine lokale EEPROM-Variablen erstellen kann? Natürlich nicht. Wie sollte das denn gehen? Und welchen Sinn sollte "lese ein Byte aus dem EEPROM und speichere es im EEPROM zwischen" überhaupt haben? PS: Was stört dich an der fertigen Funktion eeprom_update_byte?
Marcel K. schrieb: > Heißt dass, das man keinen Zeiger auf ein EEPROM erstellen kann und dass > man keine lokale EEPROM-Variablen erstellen kann? Lokale EEPROM-Variablen kann man nicht erstellen, das sagt dir der Compiler ja. Lokale Variablen werden auf dem Stack erstellt. Pointer kannst du überall erstellen. Lokal liegen die auch auf dem Stack. Aber das >unsigned char old_val EEMEM; ist auch Unsinn. Du musst zum Vergleich keine Variable im EEPROM erstellen sondern einen Wert aus dem EEPROM ins RAM holen. Somit muß auch old_val im RAM angelegt werden. Also auf dem Stack, weil es ja lokal ist: unsigned char old_val; >unsigned char *ep_into EEMEM Das geht gar nicht. Du musst nur den Pointer ep_into übergeben. Also: void write_ee_byte(unsigned char new_val, unsigned char *ep_into) Wenn du da 127 reinschreibst zeigt der auf Adresse 127. Mehr nicht. Wo diese Adresse liegt, steht da nicht drin. Und ist auch erstmal völlig unwichtig. Die Funktion "eeprom_read_byte(...) " allerdings holt dir damit den Wert aus dem EEPROM. Dem Pointer ist das egal. Mit dem könntest du mit der richtigen Funktion auch aus dem Flash lesen oder auf einen Port schreiben. mfg.
Hallo Stefan, was macht denn die fertige Fkt. "eeprom_update_byte"? Ich möchte einfach nicht ständig ins EEPROM schreiben wenn der Wert bereits drin steht. Grüße, Marcel
Marcel K. schrieb: > was macht denn die fertige Fkt. "eeprom_update_byte"? > Ich möchte einfach nicht ständig ins EEPROM schreiben wenn der Wert > bereits drin steht. http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html
1 | In addition to the write functions there is a set of update ones. |
2 | This functions read each byte first and skip the burning if the old |
3 | value is the same with new. |
Hallo zusammen,
@Thomas:
Danke für die ausfühliche erklärung. Jetzt geht es auch bei mir!!
@Stefan:
SUUPER, das habe ich ja gesucht! Vielen Dank für die Mühe mir den Link
zu suchen...
Jetzt kann ich weiter machen :o)
Vielen Dank und schönes Wochenende...
Marcel (",)
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.