www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik EEPROM Probleme


Autor: Michael K. (mmike)
Datum:

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

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

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

Autor: Michael K. (mmike)
Datum:

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

Autor: Michael K. (mmike)
Datum:

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

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

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

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

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

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleich solltest du vor dem Schreiben bzw. Lesen warten bis das EEPROM 
'ready' ist?
Z.B.
eeprom_busy_wait();

Autor: Michael K. (mmike)
Datum:

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

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werde heute abend mal nur nen kleines Prog mit den EEPROM Anweisungen 
schreiben !
@Thilo: Soweit ich weiß sollte die Routine eeprom_write_byte das schon 
intern regeln, oder irre ich da ?

Autor: Johannes M. (johnny-m)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
Michael K. wrote:
> @Thilo: Soweit ich weiß sollte die Routine eeprom_write_byte das schon
> intern regeln, oder irre ich da ?

Nein, du irrst nicht.
eeprom_write_byte macht das bereits.

Autor: Michael K. (mmike)
Datum:

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

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.