Forum: Mikrocontroller und Digitale Elektronik EEPROM default


von Alexander H. (ill_son)


Lesenswert?

Hallo,

kurze Frage:

ich möchte testen, ob eine EEPROM-Zelle beschrieben ist, um dann bei 
Jungfäulichkeit jener beim Programmstart in ein Setupmenü zu verzweigen 
und zur Parametereinstellung aufzufordern.
Wie verhält es sich denn beim ATMEGA32 mit dem EEPROM, hat der bei 
unbeschriebenen Zellen Defaultwerte, oder kann da irgendwas drin stehen?

Gruß, Alex

von Bastler (Gast)


Lesenswert?

lies doch einfach den Inhalt eines neuen Controllers aus und schau ihn 
mit einem Hex-Editor an.
Soweit ich weiß sind unbeschriebene Zellen immer 0xFF.

von Laplace (Gast)


Lesenswert?

In der Regel sind alle Zellen 0xFF. Ich würde mich aber nicht drauf 
verlassen. Es ist immer sinnvoll die Konfigurationsdaten eines Embedded 
Systems mit einem CRC zu versehen um Fehler zu erkennen und auch um bei 
Systemstart zu ermitteln, ob das EEPROM jungfräulich ist.

CRC lesen -> falsch ? ->neu konfigurieren

von Alexander H. (ill_son)


Lesenswert?

@Laplace:

wie wäre das den zu realisieren? Ich bin noch nicht so ganz bewandert 
auf dem Gebiet. CRC mit den EEPROM-Zellen oder wie meinst Du das? Und wo 
bekomme ich den "Sollwert" des CRC her?

von Andreas (Gast)


Lesenswert?

Manche Hersteller hinterlassen im EEPROM auch Testbitpattern.

Bei Verwendung eines nichtflüchtigen Speichers in einem embedded System 
muss man seine (gültigen) Daten vom Datenmüll (Rest der Welt) erkennen. 
Eine CRC ist damit immer erste Wahl. Damit schützt du die Daten auch vor 
Manupulation durch HW/SW Fehler.
Eventuell kann man seinen Daten auch spezielle IDs spendieren (Magic 
Numbers).


Gruß

von Laplace (Gast)


Lesenswert?

Wie man einen CRC berechnet kannst du dir hier im Forum oder in Google 
genau rausfinden. Beim CRC wird eine mathematische Verknüpfung aller 
Zellen miteinander durchgeführt. Wenn sich eine Zelle ändert lässt sich 
das mit hoher Warscheinlichkeit herausfinden. Das kannst du über eine 
Funktion machen der du eine Startadresse und die Länge mitteilst. Du 
bekommst den CRC als Rückgabe. Den schreibst du dann an eine feste 
Adresse im EEPROM (Anfang z.B.) Beim Systemstart berechnest du sie neu 
und vergleichst sie mit dem gespeicherten Wert.
CRC16 sollte reichen:

Beitrag "CRC-16 Prüfsumme (serielle Übertragung)"

von Alexander H. (ill_son)


Lesenswert?

Das heißt quasi, wenn einer eine EEPROM Zelle ändert, weil er 
beispielsweise einen Parameter im EEPROM ablegt, merke ich das, weil die 
CRC Routine was anderes liefert als mit unbeschriebener Zelle?

Werd ich mir mal in Ruhe zu Gemüte führen.

Gruß, Alex

von Laplace (Gast)


Lesenswert?

Du solltest für alle deine EEPROM-Daten einen Kontainer schaffen (in C 
eine Struktur) und den CRC für diese Struktur bei jeder Änderung 
aktualisieren.
Für den normalen Zugriff auf die EEPROM-Daten gibt es ja warscheinlich 
ein SW-Modul. Wenn jemand regulär was ändert (über eine Funktion in 
deinem Modul) wird anschliessend über die gesamte EEPROM-Datenstruktur 
der CRC berechnet und aktualisiert.

Beim Start deines Systems wird immer geprüft ob der CRC passt, wenn 
nicht muss neu konfiguriert werden.

von Alexander H. (ill_son)


Lesenswert?

ich weiß nicht, ob wir ein bisschen aneinander vorbei reden.

konkreter: ich möchte mein Gerät flashen. Das Programm ist ein 
Regelalgorithmus, der bestimme einstellbare Parameter hat, die im EEPROM 
abgelegt werden und beim Programmstart in RAM Variablen geladen werden. 
Diese Parameter sollen bei erstmaligem Einsatz (frische uC) zwingend 
definiert werden. Dazu muss ich aber rausfinden, ob der EEPROM schon mal 
beschrieben wurde. Und deshalb dachte ich, ich checke einfach eine 
bestimmte Zelle auf einen Defaultwert (wenn es den denn gibt) und ändere 
sie dann nach der Ersteinstllung einfach. Ist da ein CRC nicht ein 
bisschen über's Ziel hinaus geschossen.
Ich lasse mich gern belehren

Gruß, Alex

von Laplace (Gast)


Lesenswert?

Die CRC-Methode ist die wasserdichteste. Wenn du es einfacher haben 
möchtest kannst du einfach in die letzten 4 Byte deines EEPROMs z.B. 
0xAA01AA02 schreiben und das beim Start überprüfen. Schau dir 
sicherheitshalber den EEPROM-Inhalt bei einem jungfräulichen Baustein an 
und wähle ein Pattern was sich klar davon unterscheidet. (z.B 0xAA bei 
Anfangszustand 0x00 oder 0xFF).

von Alexander H. (ill_son)


Lesenswert?

Deshalb ja auch meine eingangs erwähnte Frage, ob jungfräuliche - um 
dieses Wort nochmal zu bemühen - Zellen einen verlässlichen Wert haben, 
worauf Du aber antwortest, dass das nicht so sicher sei.
Wie prüfe ich das denn (auch mit einem CRC), ob der EEPROM "extra 
vergine" ist, wenn ich nicht genau weiß, was drin steht? Kann ich denn 
etwas prüfen, wenn ich nicht weiß, was bei der Prüfung rauskommen soll? 
Ich fürchte ich durchblicke die ganze Thematik mit dem CRC noch nicht so 
richtig. Habt Geduld.

Gruß, Alex

von Andreas K. (a-k)


Lesenswert?

Standardeinstellung der Fuses der AVRs ist, dass bei ISP-Programmierung 
das EEPROM zusammen mit dem Flash-ROM gelöscht wird. Wenn man diese Fuse 
nicht ändert, ist folglich der Anfangszustand entweder 0xFF oder das was 
man selbst per ISP reingeschrieben hat.

von Laplace (Gast)


Lesenswert?

Man sollte bei einem nicht-flüchtigen Speicher in der Regel 
sicherstellen, daß das was man aus dem Speicher ausliest auch das ist, 
was man reingeschrieben hat (vor allem nach Neustart des Systems). Ein 
netter Seiteneffekt ist, daß bei einem unbenutzten Speicher auch die CRC 
nicht stimmt. In beiden Fällen muss das Gerät neu konfiguriert werden.

Ich habe dir den Prozess ja schon beschrieben, genauere Infos kannst du 
dir aus dem Forum suchen oder googlen.

von Alexander H. (ill_son)


Lesenswert?

Fein, dann werd ich mich mal beschlauen, und schauen, wie ich's am 
besten löse. Vielen Dank, Ihr wart hilfreich.

Alex

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
Noch kein Account? Hier anmelden.