Forum: Mikrocontroller und Digitale Elektronik Atmega EEPROM auf nicht veränderbar setzen


von Michael (Gast)


Lesenswert?

Hallo zusammen,

gibt es eine Möglichkeit beim Atmega328 und AVR Studio 7 über die Fuses 
den EEPROM auf nicht mehr veränderbar festzusetzen? Ich führe an einen 
Gerät so eine Art Kalibrierung durch und schreibe diese Parameter ins 
EEPROM. Dabei kommt es selten vor, dass sich die EEPROM-Werte ändern, 
ich weiß nicht warum. Da wäre es gut, wenn ich den Zustand des EEPROMs 
quasi einfrieren könnte und der erst nach einen kompletten erase und 
Neuprogrammierung wieder zugänglich werden würde.
Die Lockbits sind ja nicht für diesen Zwecke da, oder? Die verhindern ja 
nur das Auslesen, wenn ich das richtig verstanden habe.

Danke schon mal und Grüße.

von c-hater (Gast)


Lesenswert?

Michael schrieb:

> gibt es eine Möglichkeit beim Atmega328 und AVR Studio 7 über die Fuses
> den EEPROM auf nicht mehr veränderbar festzusetzen?

Nein.

> Ich führe an einen
> Gerät so eine Art Kalibrierung durch und schreibe diese Parameter ins
> EEPROM. Dabei kommt es selten vor, dass sich die EEPROM-Werte ändern,
> ich weiß nicht warum.

Das genau ist das tatsächliche Problem. Löse es und alles wird gut.

Tipp: Wurde hier im Forum unzählige Male diskutiert...

von Wendels B. (wendelsberg)


Lesenswert?

Michael schrieb:
> Ich führe an einen
> Gerät so eine Art Kalibrierung durch und schreibe diese Parameter ins
> EEPROM.
OK.
Michael schrieb:
> Dabei kommt es selten vor, dass sich die EEPROM-Werte ändern,
> ich weiß nicht warum.

Also stimmt die Kalibrierung fast immer?
Wegen Deiner Kalibrierungsroutine.

von Michael F. (michael_f268)


Lesenswert?

Brown out ist auf 4,3V gesetzt und ansonsten gibt es auch keine 
undefinierten Zustände. Oder was wäre denn hier sonst der 
Fehlerklassiker?

von Michael F. (michael_f268)


Lesenswert?

Wendels B. schrieb:
> Also stimmt die Kalibrierung fast immer?

Also die Kalibrierung funktioniert so weit, aber manchmal verstellt es 
sich eben.

von Bernd (Gast)


Lesenswert?

Wenn Platz vorhanden ist, kannst Du die Kalibrierungsdaten in den 
Flash-Speicher schreiben und das entsprechende Lockbit setzen.

von Oliver S. (oliverso)


Lesenswert?

Michael F. schrieb:
> Brown out ist auf 4,3V gesetzt und ansonsten gibt es auch keine
> undefinierten Zustände. Oder was wäre denn hier sonst der
> Fehlerklassiker?

In dem Fall Bitkipper…
Noch viel unwahrscheinlicher wäre natürlich ein Fehler im Programm oder 
an der Hardware, aber das kannst du ja definitiv ausschließen, oder?

Oliver

von c-hater (Gast)


Lesenswert?

Michael F. schrieb:

> Brown out ist auf 4,3V gesetzt und ansonsten gibt es auch keine
> undefinierten Zustände.

Das behauptest du. Also jemand, der sogar schon explizit zugegeben hat, 
nicht zu wissen, warum der EEPROM überschrieben wird...

Es gibt eigentlich nur zwei Möglichkeiten, die sich allerdings leider 
nicht gegenseitig ausschließen, also durchaus auch in trauter Eintracht 
gemeinsam auftreten können:

1) Hardware ist Scheiße.
2) Software ist Scheiße.

Ein aktivierter BOD eleminiert schlechte Hardware als Ursache leider nur 
teilweise. Der kann, wie der Name schon sagt, nur vor dem Problem des 
Brownout schützen, also zu langsam abfallender Versorgungsspannung. Er 
kann aber z.B. nicht schützen gegen negative Spikes auf der Vorsorgung. 
Da wird er sogar kontraproduktiv. Insbesondere dann, wenn auch noch 
räudige Software werkelt, die nichtmal mitbekommt, wenn sowas passiert 
ist...

von Michael F. (michael_f268)


Lesenswert?

Ok, ich kann nicht mit Sicherheit sagen, ob der Brown-Out gut 
funktioniert. Auf jeden Fall ist die entsprechende Fuse gesetzt.

Das Gerät wird mit einer UART-USB-Bridge "kalibriert", die sich aber auf 
der Platine befindet. Evtl. passiert der Fehler, wenn die USB-Buchse an 
uns ausgesteckt wird, und irgendwas dabei auf dem Bus landet. Also die 
Hardware ist sicher nicht optimal.

Die SW funktioniert folgendermaßen:
Im String sehe ich mir die Zeichen an, und je nachdem, was das erste 
Zeichen ist, wird die entsprechende Variable verändert

switch (str[0]-'0')
     {
       case (0):
                         sscanf(&str[2],"%d",&Wert1);
       eeprom_write_float(&Wert1,Wert1);
       str[0]=0;
       break;
                 }

Das ist wahrscheinlich nicht super fehlerresistent, aber dennoch sollte 
sich doch da nichts einfach so verstellen, oder?

von Michael F. (michael_f268)


Lesenswert?

Bernd schrieb:
> Wenn Platz vorhanden ist, kannst Du die Kalibrierungsdaten in den
> Flash-Speicher schreiben und das entsprechende Lockbit setzen.

Da habe ich leider keine Platz mehr.

von Michael F. (michael_f268)


Lesenswert?

Oliver S. schrieb:
> In dem Fall Bitkipper…

Was ist denn das?

von c-hater (Gast)


Lesenswert?

Michael F. schrieb:

> Das Gerät wird mit einer UART-USB-Bridge "kalibriert", die sich aber auf
> der Platine befindet. Evtl. passiert der Fehler, wenn die USB-Buchse an
> uns ausgesteckt wird, und irgendwas dabei auf dem Bus landet.

Oder auf der Versorgung...

> Also die
> Hardware ist sicher nicht optimal.

Dann musst du da halt nachbessern. Schauen, was passiert und 
entsprechende schaltungstechnische Gegenmaßnahmen vornehmen. Also 
einfach: den ganz normalen Job eines Hardwareentwicklers ausführen.

> Die SW funktioniert folgendermaßen:
> Im String sehe ich mir die Zeichen an, und je nachdem, was das erste
> Zeichen ist, wird die entsprechende Variable verändert
[...]
> Das ist wahrscheinlich nicht super fehlerresistent, aber dennoch sollte
> sich doch da nichts einfach so verstellen, oder?

Bei einem negativen Spike auf der Versorgung, während diese Zeile

> eeprom_write_float(&Wert1,Wert1);

abgearbeitet wird: natürlich kann sich da was "verstellen". Und nichts 
in der Software wird das bemerken können. Dazu wäre im Minimum eine Art 
Marker erforderlich, der anzeigt, dass da gerade was geschrieben werden 
sollte und eine Überwachung nach eine Reset, die aus dem gleichzeitigen 
Auftreten dieses Markers und der Tatsache eines BOD-initiierten Resets 
diesen Schluß ziehen könnte. Damit wäre dann zumindest die Ursache 
eindeutig festgestellt. Die Verbesserung der Hardware bleibt aber 
trotzdem zu erledigen. Der ganze Code zur Erfassung der Situation ist 
nur nötig, solange die Hardware scheisse ist. Danach kann man ihn 
weglassen. Aber eben nicht vorher!

von Georg G. (df2au)


Lesenswert?

Michael F. schrieb:
> Im String sehe ich mir die Zeichen an, und je nachdem, was das erste
> Zeichen ist, wird die entsprechende Variable verändert

Da vermisse ich eine Prüfsumme oder gleichwertiges, was das Telegramm 
absichert. Auf der Sellerieschnitte musst du immer mit dummen Zeichen 
rechnen.

von Michael F. (michael_f268)


Lesenswert?

OK, alles klar, vielen Dank für eure Antworten, ihr habt mir schon sehr 
geholfen!

von mifritscher (Gast)


Lesenswert?

Nur mal so: Ändern sich die Daten im EEPROM zur Laufzeit, also nach der 
Kalibrierung irgendwann, obwohl die SW da eigentlich weit davon entfernt 
ist in das EEPROM zu schreiben? Ansonsten: Wie sehen die Änderungen denn 
aus? Kippen da einzelne Bits, betrifft das größere Bereiche etc.?

Ah, und du solltest die Verbindung per SW-Befehl logisch trennen, bevor 
da die USB/UART Bridge physikalisch abgezogen wird. Das Abziehen kann 
von der UART des AVRs recht leicht als weitere Bytes erkannt werden - 
wenn da dem AVR vorher nicht gesagt wurde "ne, da kommt nichts mehr, 
ignoriere alles folgende" kann sonstwas passieren. Ach ja, ein 
Startcodewort über die UART wäre auch sinnvoll.

von Adam P. (adamap)


Lesenswert?

Michael schrieb:
> Ich führe an einen
> Gerät so eine Art Kalibrierung durch und schreibe diese Parameter ins
> EEPROM. Dabei kommt es selten vor, dass sich die EEPROM-Werte ändern,
> ich weiß nicht warum.

Direkt nachdem du deine Konfig. geschrieben hast?

Was ist, wenn du das was du geschrieben hast, nicht nochmal gegenliest, 
da es ja wichtig ist...und es so belässt...dann weist du nie, ob du 
richig geschrieben hast.

Evtl. Ursachen:
Der Schreibvorgang darf nicht durch Interrupts unterbrochen werden, bei 
einigen FLASH/EEPROM Zugriffen je nach Architektur.

von Hermann Kokoschka (Gast)


Lesenswert?

UND...

1) ich würde empfehlen, NACH dem EE-Schreiben die Werte jeweils 
zurückzulesen und zu vergleichen.

2) wie bereits erwähnt könnte eine Plausibilitätskontrolle beim 
UART-Empfang auch mal nix schaden.

von Adam P. (adamap)


Lesenswert?

Hermann Kokoschka schrieb:
> 2) wie bereits erwähnt könnte eine Plausibilitätskontrolle beim
> UART-Empfang auch mal nix schaden.

Michael schrieb:
> gibt es eine Möglichkeit beim Atmega328 und AVR Studio 7 über die Fuses
> den EEPROM auf nicht mehr veränderbar festzusetzen?

Ich denke, es ist das interne EEPROM gemeint.

von Peter D. (peda)


Lesenswert?

Schreib Dir einen weiteren Befehl, der an eine Adresse des EEPROM einen 
bestimmten Wert schreibt, z.B. 0xFF. Beim Programmieren wird er mit 
einem anderen Wert vorbelegt, z.B. 0xA5.
In Deinem Programm prüfst Du dann vor jedem EEPROM schreiben, ob da 0xA5 
drinsteht.
Somit ist der EEPROM gelockt, sobald da nicht mehr 0xA5 drin steht. Auch 
diese Adresse selber kann dann nicht mehr geändert werden.

von mitlesa (Gast)


Lesenswert?

c-hater schrieb:
> 1) Hardware ist Scheiße.
> 2) Software ist Scheiße.

Ja! Und solange hier kein Schaltplan, kein Aufbau und keine
Software gezeigt wird bleibt es bei dieser Behauptung bzw.
Annahme. Hier wird nämlich seit vielen Stunden über ein
Spekulations-Objekt geredet/gerätselt das keiner kennt.
Ausser der Controller-Typ, der ist bekannt.

von Einer (Gast)


Lesenswert?

Wenn du noch einen Pin frei hast nutze einen Taster,
der während der Änderung gedrückt sein muß.

von Thomas Kalmeier (Gast)


Lesenswert?

Michael schrieb:
> Dabei kommt es selten vor, dass sich die EEPROM-Werte ändern,
> ich weiß nicht warum.

Ja  kommt vor......

Aber..

Nur in Speicherzelle 0
Das kommt, auch bei aktivierter BrownOut, dass beim Hochfahren INIT der 
CPU
ein kurzer Schreib Befehl kommt und der dir die Zelle 0 verschiesst

Also immer bei 1 Beginnen !!!

Gruß Thomas

von Dyson (Gast)


Lesenswert?

Thomas Kalmeier schrieb:
> Also immer bei 1 Beginnen !!!

Erstaunlich, wie lange sich solch alte Kamellen halten. Zu der Zeit hieß 
der Bundeskanzler noch Helmut Kohl.

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.