EEPROM Probleme

OP #605828
Lesenswert?
• ▲
▼
Hallo Leute,
ich bin dabei einen Drehzahlmesser für den Modellbau zu bauen. Die 
optischen Sachen funktionieren schon wunderbar, nur leider habe ich 
Probleme beim speichern von Werten in den EEPROM. Momentan verwende ich 
einen ATMega16 mit 16MHz externem Quarz und avrgcc als Compiler. Hier 
kurz das Code - Fragment was Probleme macht:


#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/eeprom.h>

#define EEPROM_CONTRAST   0x01
#define EEPROM_OTHERVALUE 0x02


...

eeprom_write_byte ((uint8_t *) EEPROM_CONTRAST, LCDContrast);
eeprom_write_byte ((uint8_t *) EEPROM_OTHERVALUE, OtherValue);

...

uint8_t val1 = eeprom_read_byte ((uint8_t *) EEPROM_CONTRAST);
uint8_t val2 = eeprom_read_byte ((uint8_t *) EEPROM_OTHERVALUE);

...

Ausgabe von val1 und val2 auf LCD ...

Wenn ich die oberen Anweisungen ausführe, dann funktionierts auch 
wunderbar. Die richtigen Werte werden auf dem LCD angzeigt. Wenn ich 
dann die Schreib - Kommandos auskommentiere und neu programmiere, dann 
werden die falschen Werte aus dem EEPROM gelesen (Die Fuse ist gesetzt, 
daß der EEPROM nicht beim programmieren gelöscht wird ! Preserve EEPROM 
....)

Geht das so nicht, daß die Speicheradressen der Werte per #define 
gesetzt werden ?
Muss der Cast für die Adresse vielleicht uint16_t * sein, da der Mega 16 
ja 512 bytes EEPROM hat und mit 8bit nur die ersten 256 Bytes 
adressierbar sind ?

Grüße,
Michael
#605832
Lesenswert?
• ▲
▼
Michael K. wrote:
> dann die Schreib - Kommandos auskommentiere und neu programmiere, dann
> werden die falschen Werte aus dem EEPROM gelesen (Die Fuse ist gesetzt,
> daß der EEPROM nicht beim programmieren gelöscht wird ! Preserve EEPROM
> ....)
>
> Geht das so nicht, daß die Speicheradressen der Werte per #define
> gesetzt werden ?

Doch das geht.

> Muss der Cast für die Adresse vielleicht uint16_t * sein,

Nein. Du liest/schreibst ein Byte. Der Datentyp dafür
ist nun mal uint8_t, und der Pointertyp dafür ist nun mal
uint8_t*


Du hast irgendein anderes Problem entweder im Code oder
im Handling wenn du das Programm brennst. Anscheinend wird
das EEPROM doch jedesmal neui beschrieben. Oder aber du
brennst nicht das Programm, welches du denkst das du brennst
(ist mir auch schon ein paar mal passiert).
OP #605846
Lesenswert?
• ▲
▼
Hallo Karl-Heinz,
der EEPROM wird definitiv nicht überschrieben (kann ich durch auslesen 
des EEPROMs nach dem Brennen verifizieren und bestätigen!). Und 
programmiert wird das Ding sicherlich auch, da bin ich mir sicher (nutze 
das STK500) mit der neuesten Version vom WinAVR.
Nochmals eine Frage zum Datentyp. Wie würde denn der Befehl aussehen 
wenn ich Adresse 277 im EEPROM mit einem 8bit Wert beschreiben will ? 
Die Adressangabe muss ja dann ein 16bit Wert sein, sonst kann ich's ja 
nicht adressieren, oder?
#605851
Lesenswert?
• ▲
▼
> Wie würde denn der Befehl aussehen
> wenn ich Adresse 277 im EEPROM mit einem 8bit Wert

  eeprom_write_byte( (uint8_t*)277, Wert );

Was mir auch schon passiert ist:
Ich habe im Programm was verändert, habe aber nicht gemerkt,
dass ich einen Fehler ein gebaut habe. Programm gebrannt
und es verhielt sich so wie vor der Änderung. Minutenlang
gesucht, bis ich gemerkt habe, dass der Linker aufgrund
der Fehler nicht durchgelaufen ist.

Wenn dein Programm stimmt, dann wird es wohl sowas sein.
Oder du hast nicht alle write_byte Aufrufe auskommentiert.
#605852
Lesenswert?
• ▲
▼
Michael K. wrote:
> Nachtrag: Das komische auch ist, daß z.B. der LCDContrast Wert immer
> sauber ausgelesen wird, auch wenn nur aus dem EEPROM gelesen wird ...
> nur die Nachfolgenden Werte stimmen dann nicht mehr .....


Speck dein Programm auf das absolut Notwendige ab um den Fehler
zu zeigen und dann zeig mal her.
OP #605856
Lesenswert?
• ▲
▼
Hm. Ich check das heute abend nochmals genauer ab! Das mit der 
Adressierung ist irgendwie komisch. Es sträubt sich ein wenig in mir 
(uint8_t *)277 zu schreiben ... Da der 8bit Wert diese 277 ja gar nicht 
annehmen kann .... (nicht dass ich so viele Werte schreiben wollte)
Danke aber schonmals für die Hilfe. Ich melde mich heute abend dann 
nochmals ....
#605862
Lesenswert?
• ▲
▼
Thilo M. wrote:
> Vielleich solltest du vor dem Schreiben bzw. Lesen warten bis das EEPROM
> 'ready' ist?
Das machen die eeprom_write_irgendwas-Funktionen automatisch.

Michael K. wrote:
> Es sträubt sich ein wenig in mir (uint8_t *)277 zu schreiben ... Da der 8bit
> Wert diese 277 ja gar nicht annehmen kann .... (nicht dass ich so viele
> Werte schreiben wollte)
Du verwechselst immer noch "Zeiger auf 8-Bit-Wert" mit "8-Bit-Adresse"! 
Dein Cast auf uint8_t* macht lediglich dem Compiler klar, dass er den 
Ausdruck danach als Zeiger auf einen 8-Bit-Wert verwursten soll. Das hat 
aber nichts mit dem Adressraum zu tun...
OP #605891
Lesenswert?
• ▲
▼
Hab grad meine Mittagspause geopfert, weil ichs einfach wissen wollte 
und bin ins E-Labor gestapft und habs ausprobiert.... Du hast 
wahrscheinlich Recht Karl-Heinz, daß in meine Programm noch ein Fehler 
ist .... Ich werde heute abend mal suchen ...
Die Test hier in der Arbeit haben wunderbar geklappt!
Besten Dank an alle,
Grüße,
Michael

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.