Forum: Mikrocontroller und Digitale Elektronik Bootloader flasht schlampig - Code zerbröselt nach 3 Wochen


von Gregor Z. (greg)


Lesenswert?

Hallo,
habe ein sehr seltsames Problem, das so aussieht als würde ein Atmega8 
über einen Bootloader 'schlampig' ins Program-Memory schreiben.

Hardware ist ein Atmega8 der über 2 Multiplexer 16 Potis abfragt. Er 
empfängt über RX Daten (Midi) und sendet über TX wieder welche raus. 
Externer Quartz 8MHz, Spannungsversorgung über Steckernetzteil und 7805. 
Wird die Software über SPI geflasht funktioniert soweit alles perfekt. 
Gerät ausgeschaltet monatelang in die Ecke stellen, anschalten und es 
funktioniert noch. Ähnliche Eigenbauten habe ich seit Jahren im 
fehlerfreien im Einsatz.

Nun hat das Teil kürzlich auch einen Bootloader bekommen, der die 
Firmware über RX einlesen und flashen kann. Auch der funktioniert 
zuverlässig mit den üblichen boot_page_erase() / boot_page_write()-usw. 
Befehlen. In den ersten 3 Wochen nach dem flashen tut das Gerät alles 
was es soll. Ist Tagelang komplett vom Saft getrennt und funktioniert 
nach dem Einschalten absolut zuverlässig. Nach ca. 3 Wochen stürzt es 
dann nach dem Einschalten mit immer denselben Symptomen ab. Es hat eine 
Startup-Welcome-Blinki-routine für die LEDs, die tut noch, Absturz ist 
wohl im Main-Loop. Der Bootloader selbst ist noch gesund, nach einem 
erneuten flashen funktioniert das Gerät wieder, nur wie lange?

Ich habe eine Reihe mit 8 Geräten mit jew. leicht unterschiedlicher 
Software, davon zeigen derzeit 3 Stück dieses Phänomen. Jeweils pro 
Gerät leicht unterschiedliche Symptome aber beim jew. Gerät immer 
dasselbe Fehlermuster beim Einschalten. Es sieht so aus als würde der 
geflashte Code mit den Wochen zerbröseln. Alle AVRs stammen aus 
derselben Bestellung beim großen R.

Hier noch meine Routine zum Schreiben einer Page. page und rx_buffer 
sind ausserhalb der Funktion definiert. (Ich sehe gerade daß Interrupts 
nicht deaktiviert werden vor dem Schreiben, das kanns doch aber nicht 
sein?)
1
void write_buffer_to_flash() {
2
  uint16_t i;
3
  const uint8_t* p = rx_buffer;
4
  eeprom_busy_wait();
5
6
  boot_page_erase(page);
7
  boot_spm_busy_wait();
8
9
  for (i = 0; i < SPM_PAGESIZE; i += 2) {
10
    uint16_t w = *p++;
11
    w |= (*p++) << 8;
12
    boot_page_fill(page + i, w);
13
  }
14
15
  boot_page_write(page);
16
  boot_spm_busy_wait();
17
  boot_rww_enable();
18
}

Kann mir hier jemand eine Richtung weisen für die Fehlersuche? 
Herzlichen Dank.

von Mac G. (macgyver0815)


Lesenswert?

Eine Möglichkeit:
Der Bootloder empfängt Müll (EMV) und überschreibt dann Teile des 
Speichers.
Pullups?
POR richtig konfiguriert?
Stromversorgung wirklich Störungsfrei?

von der alte Hanns (Gast)


Lesenswert?

Ich vermute eher, dass der Bootloader an sich in Ordnung ist, aber zur 
Unzeit aktiv wird.

von Bitflüsterer (Gast)


Lesenswert?

> Es sieht so aus als würde der geflashte Code mit den Wochen zerbröseln.

Ganz ausschliessen kann man so etwas nicht, aber es ist sehr 
unwahrscheinlich.
Für wesentlich wahrscheinlicher halte ich, das aus irgendeinem Grund 
(z.B.Stacküberlauf) der Bootloader oder irgendwas anderes, das in den 
Flash-Speicher schreibt, ausgeführt wird.

Um Deine Vermutung zu verifizieren, kannst Du ja erstmal den momentanen 
Code zurücklesen. Dann nochmal den Bootloader laufen lassen und den 
neuen Flash-Inhalt mit dem vorherigen vergleichen.

von Einhart P. (einhart)


Lesenswert?


von Stefan (Gast)


Lesenswert?

Ich würde tippen, dass der Bootloader zwar korrekt Dein Flash 
beschreibt.
Aber beim Einschalten manchmal fehlerhaft meint, Dein Flash löschen zu 
müssen.

Eine andere Möglichkeit ist, daß Deine Firmware ab und an abstürzt und 
dabei in den Bootloader-Code springt und diesen teilweise ausführt.

Kannst Du die fehlerhaften Controller mal auslesen, bevor Du sie neu 
beschreibst, und kontrollieren, wo Unterschiede im Flash stehen?

Gruß Stefan

von Peter D. (peda)


Lesenswert?

Gregor Z. schrieb:
> Wird die Software über SPI geflasht funktioniert soweit alles perfekt.

Flashe mal Applikation + Bootloader über SPI. Wenns dann auch crasht, 
wir der Bootloader versehentlich aufgerufen.
Oft sind Bootloader nicht abgesichert und interpretieren Müll auf den 
Datenleitungen als Kommandos.

Und natürlich das BOR enablen.

von Gregor Z. (greg)


Lesenswert?

Donnerwetter :) Herzlichen Dank für die vielen Hilfestellungen. Ich 
werde den Ansätzen allen mal nachgehen und weiter berichten.

... mich wundert halt die zeitlich schon erstaunlich nah beisammen 
liegende Auftritt des Fehlers in 3 von 8 Geräten.

von Gregor Z. (greg)


Lesenswert?

Stefan schrieb:
> Kannst Du die fehlerhaften Controller mal auslesen, bevor Du sie neu
> beschreibst, und kontrollieren, wo Unterschiede im Flash stehen?

Leider nein, die Fusebits gegen Auslesen sind gesetzt. Ich muss den 
Fehler wohl nochmal versuchen zu verifizieren ohne die Lockfuses.

von der alte Hanns (Gast)


Lesenswert?

Vor diesem Vorgehen würde ich wegen des Aufwandes zurückschrecken.

"...doch ein Dump auf hundert Seiten
kann Entsetzen nur verbreiten."

von Paul Baumann (Gast)


Lesenswert?

Hans schrob:
>"...doch ein Dump auf hundert Seiten
>kann Entsetzen nur verbreiten."

Jedoch zum schnellen Fehlersuchen
kann man doch Studenten buchen!

;-)
MfG Paul

von der alte Hanns (Gast)


Lesenswert?

für Paul Baumann
"A great heap of paper lies on the floor, a continuous sheet of computer 
paper streaming out of the carriage of Gollum's system console. 
Stretched out, the sheet would run across the room and back again 
several times. You could fit a fairly detailed description of American 
history from the Civil War to the present on it. Veres sits in the midst 
of this chaos, the picture of the scholar. He's examined it all."
Kidder: The Soul of a New Machine

Those were the days, my friend

(nur ganz am Rande: haben Sie Oliver Sacks gelesen?)

-----------

Aber zurück: Welches Resultat sollte ein Dump-Vergleich erbringen ausser 
dem, wovon alle hier ausgehen, dass nämlich der Ist- nicht dem 
Soll-Zustand des Programmes entspricht; dass ein eventuelles 
Fehler-Muster tiefergehende Rückschlüsse auf die Fehler-Ursache erlaubt, 
halte ich für unwahrscheinlich. Besser die Zeit und gute Laune in die 
Analyse der anderen hier genannten Faktoren investieren.

von Uwe (Gast)


Lesenswert?

Würde auch versuchen den µC zu stressen um den Fehler zu reproduzieren.
Aber wenn du ihn reproduziert hast kann man den Flash natürlich aulesen 
und gucken was passiert ist. Wenn z.B. nur ein Paar oder nur ein 
Bitdreher drin ist, wirds wohl der Bootloader nicht sein. Wenn da ne 
ganze Seite 0xFF zu finden sind wo normalerweise was anderes ist ist der 
Bootloader wohl irgendwie aufgerufen worden. Werden ansonsten SPM 
Befehle benutzt außerhalb des Bootloaders bzw. BOD aktiviert (auf einem 
sinnvollem Spannungslevel).

von Bitflüsterer (Gast)


Lesenswert?

der alte Hanns schrieb:
> Aber zurück: Welches Resultat sollte ein Dump-Vergleich erbringen ausser
> dem, wovon alle hier ausgehen, dass nämlich der Ist- nicht dem
> Soll-Zustand des Programmes entspricht; dass ein eventuelles
> Fehler-Muster tiefergehende Rückschlüsse auf die Fehler-Ursache erlaubt,
> halte ich für unwahrscheinlich. Besser die Zeit und gute Laune in die
> Analyse der anderen hier genannten Faktoren investieren.

Nun, zum einen gehen sicher nicht alle davon aus, das ein Unterschied 
besteht.
Der TO selbst scheint davon auszugehen, einige Antworter halten das für 
gut möglich, einige andere, durchaus die Mehrheit (denke ich) nicht.
Wenn kein Unterschied besteht, dann ist die Wahrscheinlichkeit groß, 
dass es sich um einen der anderen Faktoren handelt.
ABER: Davon müssen nicht nur die Antworter sondern auch der TO überzeugt 
werden.

Zum zweiten ist, zumindest für mich, Deine Suggestion von einer langen 
Schlange Papier nicht so recht plausibel. Niemand würde das ausdrucken. 
Wie kommst Du darauf, das man das so macht?

Zum dritten ist das Verfahren so ziemlich das kürzeste im Vergleich zur 
Auffindung möglicher anderen Ursachen. Es bietet darüber hinaus noch den 
Vorteil, dass evtl. Probleme beim Auslesen eher noch in die Richtung 
dieser anderen Ursachen deuten würde.

Uwe schrieb:
> Aber wenn du ihn reproduziert hast kann man den Flash natürlich aulesen
> und gucken was passiert ist.
Nun, er hat ja gerade einen uC vorliegen, bei dem das Problem schon 
aufgetreten ist. Das kann er ja, mit einem vergleichen den er frisch 
geladen hat, mit dem Image, wie es nach der Ausführung des Bootloaders 
entsteht (Notfalls mit einer Simulation).

von Bitflüsterer (Gast)


Lesenswert?

Uups, da ist mir ein Fehler unterlaufen.
Statt:

>Der TO selbst scheint davon auszugehen, einige Antworter halten das für
>gut möglich, einige andere, durchaus die Mehrheit (denke ich) nicht.

sollte es heissen:

>Der TO selbst scheint davon auszugehen, einige Antworter, das kann durchaus 
durchaus die Mehrheit sein (denke ich), halten das für
>gut möglich, einige andere nicht.

Jedenfalls ist die Überprüfung der anderen Möglichkeiten wesentlich 
aufwendiger (wenn sie hier im Forum geschehen soll, auf jeden Fall).
Man müsste ein Foto von dem Aufbau, einen Schaltplan haben, ansehen und 
diskutieren und vermutlich noch eine Diskussion über Sinn und Unsinn von 
Abblockkondesatoren führen.

von Uwe (Gast)


Lesenswert?

> Nun, er hat ja gerade einen uC vorliegen, bei dem das Problem schon
> aufgetreten ist.

Er hat aber auch geschrieben das nach dem erneuten Flashen das problem 
weg ist.

von hauspapa (Gast)


Lesenswert?

Hast Du mal geschaut was das Ding nach einem Watchdog Reset macht? Ich 
durfte schon leidvoll erleben das das nicht immer dasselbe sein muss wie 
bei Power on Reset.

Das würde auch zur langen fehlerfreien Zeit passen.

viel Erfolg
Hauspapa

von Bitflüsterer (Gast)


Lesenswert?

Uwe schrieb:
>> Nun, er hat ja gerade einen uC vorliegen, bei dem das Problem schon
>> aufgetreten ist.
>
> Er hat aber auch geschrieben das nach dem erneuten Flashen das problem
> weg ist.

Er hat aber auch geschrieben: "davon zeigen derzeit 3 Stück dieses 
Phänomen". Unter "derzeit" habe ich "jetzt, hier und heute" verstanden.

Falls er die allle schon neu geflasht hat, dann ist's natürlich Essig. 
Dann kann man sich gleich auf die anderen möglichen (Hardware-) Ursachen 
konzentieren.

von Hans-Georg L. (h-g-l)


Lesenswert?

Dein Programm könnte auch durch einen irgendwie gearteten fehlerhaften 
Zustand dein write_buffer_to_flash aufrufen und dann wird erstes das 
Flash gelöscht. Zum Testen kannst ja mal vor dem boot_page_erase ein 
Zeichen an PC senden oder einen freien Ausgangspin setzen.

von Andreas D. (rackandboneman)


Lesenswert?

Wurde diff neuerdings entfunden? Und ob es Muster gibt die einem sehr 
viel sagen können wenn man einen Soll-Ist-Vergleich macht. zB wenn immer 
ein bestimmtes Bit betroffen ist, oder immer ein bestimmter 
Addressbereich zer...rieben wird ...

von der alte Hanns (Gast)


Lesenswert?

>empfängt über RX Daten (Midi)
>Wird die Software über SPI geflasht funktioniert soweit alles perfekt.
>Gerät ausgeschaltet monatelang in die Ecke stellen, anschalten und es
>funktioniert noch. Ähnliche Eigenbauten habe ich seit Jahren im
>fehlerfreien im Einsatz.
>Nun hat das Teil kürzlich auch einen Bootloader bekommen, der die
>Firmware über RX einlesen und flashen kann. Auch der funktioniert
>Nach ca. 3 Wochen stürzt es dann nach dem Einschalten mit immer denselben 
>Symptomen ab
>Der Bootloader selbst ist noch gesund, nach einem
>erneuten flashen funktioniert das Gerät wieder

Es scheint also doch so, dass der Bootloader unter undefinierten 
Bedingungen aktiv wird, und ich würde gezielt hier ansetzen.
Nach meiner Erfahrung ist eine Dump-Analyse eine der letzten Zufluchten, 
aber jeder hat seine eigenen, für ihn passenden Methoden entwickelt, 
letztlich muss es für Gregor Z. stimmen.

von Gregor Z. (greg)


Lesenswert?

Update:

Ich habe nun ein Setup gebastelt, das mehrere der Geräte zugleich ein 
paar zigmal den Saft komplett an und wieder abdreht, die Lockbits 
rausgenommen und Program-Memory-Dumps verglichen direkt nach dem 
Bootloader-Flashen und nach ca. 5x, 20x und 50x Power-On-Reset.

Vorläufiges Ergebnis: grob geschätzt und jew. unregelmässig nach 30-60x 
Power-On-Reset werden in den ersten ungefähr 100 Bytes vereinzelt und 
jedesmal anders Daten überschrieben, ca. 5-10% hat sich verändert, 
unzusammenhängend. Nicht mit 0xff, schön verschieden. Das scheinbare 
'Altern' kommt also daher, daß es in ca. 3 Wochen etwa 30 - 60 x 
angeschaltet wurde (Minuspunkt wegen off-topic-thread Titel)

Jetzt muss ich nur noch rausfinden warum. Ausser im Bootloader werden 
nirgens flash-befehle genutzt. Und wenn beim Start eine bestimmte Taste 
nicht gehalten wird, wird der Bootloader übersprungen. Ausserdem 
erwartet der Bootloader eine exakt vorgegebene Sequenz und jew. korrekte 
Checksummen bevor er tatsächlich write_buffer_to_flash() aufruft.

>Dein Programm könnte auch durch einen irgendwie gearteten fehlerhaften
>Zustand dein write_buffer_to_flash aufrufen und dann wird erstes das
>Flash gelöscht. Zum Testen kannst ja mal vor dem boot_page_erase ein
>Zeichen an PC senden oder einen freien Ausgangspin setzen.

Prima Idee, das könnte ich mal testen. Aber dann sollten doch ganze 
Pages verschieden sein, es sind nur einzelne Bytes.

>Pullups?
Ja

>POR richtig konfiguriert?
Äh, 'POR'?

>Stromversorgung wirklich Störungsfrei?
Ich denke schon, eine simple 9V-DC-7805 Schaltung mit den üblichen 
100n-Kondensatoren am 7805 In und Out, 10µ dahinter,100µ davor und die 
100n-Datenblatt-Abblockkondensatoren direkt am Atmega8. Nur eine 
HF-Drossel habe ich (noch) nicht drin.

'BOR' ist der Reset über Brown Out Detection? Habe ich bislang noch 
nicht enabled.

von Einhart P. (einhart)


Lesenswert?

Gregor Z. schrieb:
> 'BOR' ist der Reset über Brown Out Detection? Habe ich bislang noch
> nicht enabled.

Oh Mann - das wird aber auch Zeit.

Zitat aus dem Link den ich gepostet habe:

"Keep the AVR RESET active (low) during periods of insufficient power 
supply
voltage. This can be done by enabling the internal Brown-out Detector 
(BOD)."

: Bearbeitet durch User
von Gregor Z. (greg)


Lesenswert?

Einhart Pape schrieb:
> Gregor Z. schrieb:
>> 'BOR' ist der Reset über Brown Out Detection? Habe ich bislang noch
>> nicht enabled.
>
> Oh Mann - das wird aber auch Zeit.

Ganz doof gefragt: was soll der Brown Out Reset aussagen, ausser mir zu 
zeigen, daß meine Spannungsversorgung aus irgendeinem Grunde 
'zusammenbricht'?

P.S. ich habe die Technote Deines Links gelesen, habe aber (so ganz 
laienhaft denkend) keinen Grund anzunehmen, daß die Spannung meiner 
Schaltung aus irgendeinem Grunde unter 2.7 V sinken könnte und das 
EEprom dadurch nicht sauber beschrieben würde.

: Bearbeitet durch User
von Einhart P. (einhart)


Lesenswert?

Wenn beim Aus- oder Anschalten die Spannung zu klein wird / ist dann 
kommt es zu undefinierten Zustanden im Controller. Das soll die brown 
out detection verhindern.

Meinst du die Versorgungsspannung baut sich im Mikrosekundenbereich auf 
und ab? Was hast du gegen das BOD Flag? Das ist nicht aus Jux und 
Dollerei vorhanden.

: Bearbeitet durch User
von der alte Hanns (Gast)


Lesenswert?

>EEprom dadurch nicht sauber beschrieben würde.

? - Was hat das mit dem Problem zu tun? Läuft der Controller in 
Abhängigkeit vom EEPROM in den Bootloader?

von Gregor Z. (greg)


Lesenswert?

Einhart Pape schrieb:
> Wenn beim Aus- oder Anschalten die Spannung zu klein wird / ist dann
> kommt es zu undefinierten Zustanden im Controller. Das soll die brown
> out detection verhindern.

Genau so habe ich es auch verstanden. Der Bootloader wird aber manuell 
aktiviert. Bevor irgendetwas geschrieben wird muss er von aussen über RX 
mit Daten befüttert werden per Midi von einem PC, manuell von einem 
Menschen. Bis dahin sollte die Spannung stabil sein.

von Gregor Z. (greg)


Lesenswert?

der alte Hanns schrieb:
>>EEprom dadurch nicht sauber beschrieben würde.
>
> ? - Was hat das mit dem Problem zu tun? Läuft der Controller in
> Abhängigkeit vom EEPROM in den Bootloader?

sorry, vertippt. Nein. Der Bootloader wird manuell enabled indem man 
beim Powerup eine Taste hält.

von Einhart P. (einhart)


Lesenswert?

Was bedeutet "undefinierter Zustand" - da kann alles Mögliche passieren. 
Meinst du Atmel schreibt dummes Zeug?

von Gregor Z. (greg)


Lesenswert?

Einhart Pape schrieb:
> Meinst du die Versorgungsspannung baut sich im Mikrosekundenbereich auf
> und ab? Was hast du gegen das BOD Flag? Das ist nicht aus Jux und
> Dollerei vorhanden.

Ich habe nichts gegen das BOD Flag. Ich habe mich bisher nur noch nicht 
eingehend damit beschäftigt. Was ich darüber gelesen habe erschien mir 
bislang für meinen Anwendungsbereich nicht notwendig. Ich lasse mich 
aber gerne eines besseren belehren und mache den Stresstest nochmal 
komplett mit enable-tem BOD-Flag.

von stefanus (Gast)


Lesenswert?

Flash Speicher verlieren manchmal ihre Daten, wenn man sie liest, 
während die Spannungsversorgung zu niedrig oder instabil ist.

Mir ist das mit den Speicher eines Ethernet Controllers in kombination 
mit einem Handy-Ladegerät (als Netzteil) hundert mal passiert, bis ich 
dahinter gekommen bin.

Brown-Out Detection in Kombination mit einem 500ms Sleep am Anfang der 
main() Funktion löste das Problem zuverlässig.

von Einhart P. (einhart)


Lesenswert?

Jau, das ist der richtige Weg. Alles ausschließen was sich einfach 
machen lässt!

von der alte Hanns (Gast)


Lesenswert?

>Der Bootloader wird manuell enabled indem man
>beim Powerup eine Taste hält.

Dann stellen sich zwei Fragen:
- sind die fuse-bits für das power-up-timing korrekt
- wie sieht die Hardware um diese Taste herum aus

von Gregor Z. (greg)


Lesenswert?

der alte Hanns schrieb:
>>Der Bootloader wird manuell enabled indem man
>>beim Powerup eine Taste hält.
>
> Dann stellen sich zwei Fragen:
> - sind die fuse-bits für das power-up-timing korrekt

Habe sie vorsorglich auf die längstmögliche Startuptime gesetzt (weiss 
sie nicht auswendig)

> - wie sieht die Hardware um diese Taste herum aus

Auf Ground schaltende Taster sind direkt mit Portpins verbunden, deren 
interne Pullups aktiviert sind. Software Entprellung.

von Gregor Z. (greg)


Lesenswert?

stefanus schrieb:
> Flash Speicher verlieren manchmal ihre Daten, wenn man sie liest,
> während die Spannungsversorgung zu niedrig oder instabil ist.
>
> Mir ist das mit den Speicher eines Ethernet Controllers in kombination
> mit einem Handy-Ladegerät (als Netzteil) hundert mal passiert, bis ich
> dahinter gekommen bin.
>
> Brown-Out Detection in Kombination mit einem 500ms Sleep am Anfang der
> main() Funktion löste das Problem zuverlässig.

Ah, so etwas Ähnliches habe ich schonmal gelesen mit der Warteschleife 
vor main(). Ich werde das auch mal in die nächste Testrunde mit 
einbauen. Danke.

von Tim (Gast)


Lesenswert?

>Auf Ground schaltende Taster sind direkt mit Portpins verbunden, deren
>interne Pullups aktiviert sind. Software Entprellung.

Falsch. Mach da einen Externen Pullup dran.

Und das mit der BOD Fuse solltest du echt machen.
Habe da auch so meine Erfahrungen.....

Delay am anfang von main brauchst du nicht.

von Gregor Z. (greg)


Lesenswert?

Tim schrieb:
>>Auf Ground schaltende Taster sind direkt mit Portpins verbunden, deren
>>interne Pullups aktiviert sind. Software Entprellung.
>
> Falsch. Mach da einen Externen Pullup dran.

warum externe Pullups? Steht es nicht auch so im Tutorial?

von Tim (Gast)


Lesenswert?

Und wie viele µs vergehen zwischen pullup ein und Port auslesen?

von Nosnibor (Gast)


Lesenswert?

Gregor Z. schrieb:
> Der Bootloader wird manuell enabled indem man
> beim Powerup eine Taste hält.

...oder (mit etwas Pech) beim brown-out: während die Versorgungsspannung 
allmählich wegdämmert, werden einige Bits schwach, während die meisten 
noch weiterarbeiten. Wenn zufällig Bits im oberen Teil des Program 
Counter von einem Schwächeanfall betroffen sind, "springt" die CPU 
einfach mal irgendwohin, mit etwas Pech auch irgendwo in den Bootloader.

von m.n. (Gast)


Lesenswert?

Nosnibor schrieb:
> während die Versorgungsspannung
> allmählich wegdämmert, werden einige Bits schwach, während die meisten
> noch weiterarbeiten.

Vielleicht den Bits ein Erfrischungsgetränk reichen?
Ich dämmer auch gleich weg :-(

Peter Dannegger schrieb:
> Flashe mal Applikation + Bootloader über SPI.
> ...
> Und natürlich das BOR enablen.

Wurde das schon gemacht?
Wenn nein, warum nicht?

von Georg A. (georga)


Lesenswert?

Herrgott, mach einfach den Brownout-Reset rein. Das sind 10s Arbeit. 
Danach gibts keinerlei Corruptions mehr. Dein Symptom kommt 100%ig 
davon. BTDT...

Aber man kann natürlich auch erstmal tagelang rumdiskutieren ;)

von Stefan (Gast)


Lesenswert?

Ich sehe das auch so wie Nosnibor:

Das grössere Problem ist das Ausschalten. Je nach Kapazitäten an Deiner 
Versorgung kann sich das ziemlich lange hinziehen. Und in dieser Zeit 
kann die CPU ziemlichen Unsinn veranstalten. Daß nur die ersten ~ 100 
Byte betroffen sind, kann darauf hindeuten, daß die CPU mit Unsinn 
anfängt, dafür aber nicht mehr viel Zeit hat ...

@ der alte Hanns:
Ich finde es aufschlussreich, wo die Daten im Flash überschrieben 
werden: nur am Anfang, mittendin, alle zusammen oder nur ein parr 100 
...
Ein typisches Beispiel: Speicherstelle Null des Eeproms ist immer der 
erste Kandidat für einen BOR-Fehler. Bei früheren Atmels war die 
EE-Adresse 0 fast nicht benutzbar.

Für ein Runaway der CPU spricht auch, daß das Problem erst auftritt, 
seitdem Code zum Ändern des Flash vorhanden ist.

Gruß Stefan

von der alte Hanns (Gast)


Lesenswert?

an Stefan

Zugegeben.
Aber können Sie sich auf dieses einen Reim machen? Ich erstmal nicht.

>Aber dann sollten doch ganze
>Pages verschieden sein, es sind nur einzelne Bytes.

von Gregor Z. (greg)


Lesenswert?

Update 2

ging nicht schneller. Nach dem enablen der BOT auf 4V sind alle 3 
getesteten Geräte nach ca. 150 Power-On Resets fehlerfrei, (vorher waren 
alle nach ca. 30-50 Resets 'beschrieben'). Ich werde noch etwas 
eingehender testen aber ich denke das war es wohl. Hätte nicht gedacht, 
daß in dieser Power On/Power Off Phase derart gravierende Dinge 
passieren können wie etwa das unautorisierte Benutzen von Teilen meines 
Bootloaders.

Herzlichen Dank für die umfassende Hilfestellung und tut mir leid wenn 
ich mit einem Anfängerfehler genervt habe. Ich habe wenigstens viel 
gelernt.

: Bearbeitet durch User
von Stefan (Gast)


Lesenswert?

Kann sein, daß boot_page_write(0) aufgerufen wird, ohne die page vorher 
zu löschen. Dann werden nur Bits von 1 auf 0 geändert (oder war es 
andersherum, Atmega ist schon so lange her ..?), je nachdem, was im 
page-Buffer steht.

Auf jeden Fall sollte das Einschalten des BOR helfen.

Gruß Stefan

von der alte Hanns (Gast)


Lesenswert?

an Stefan

Soll das heißen, dass in diesem Abschalt-Delirium Zeit genug ist, eine 
Seite zu lesen und verändert zurückzuschreiben? Merkwürdig.

von vcd (Gast)


Lesenswert?

der alte Hanns schrieb:
> an Stefan
>
> Soll das heißen, dass in diesem Abschalt-Delirium Zeit genug ist, eine
> Seite zu lesen und verändert zurückzuschreiben? Merkwürdig.

Ein einziger Schreibvorgang reicht doch, um Unheil anzurichten.
Da muß doch keine komplette Seite gelesen und wieder geschrieben werden.
Und wenn die Spannung langsam genug sinkt, ist auch die Zeit größer, wo 
undefinierte Aktionen passieren können.

von der alte Hanns (Gast)


Lesenswert?

Das verstehe ich nicht. Ich hatte das Datenblatt so interpretiert, dass 
nur eine ganze Seite geschrieben werden kann. Und wenn, wie Gregor Z. 
schreibt, lediglich einzelne Bytes, und nicht mal nur jeweils die 
ersten, verändert sind, so muss doch vorher die Seite gelesen worden 
sein.

von Georg A. (georga)


Lesenswert?

> tut mir leid wenn ich mit einem Anfängerfehler genervt habe.

Och, das Problem hat die Industrie sicher schon viele tausend 
Mannstunden und viele 100k$ und Rückrufe gekostet. Das Hauptproblem ist, 
dass Atmel sich wohl nicht dazu durchringen kann, eine ganz dicke fette 
Warnung ins Datenblatt zu bringen oder den BOD gleich per Default 
schonmal auf die niedrigste Stufe zu programmieren.

BTW: Selbst die Fuse-Settings für den Programmspeicher können sich durch 
den Bug ändern. Ich hatte die immer ungeschützt und mit der Corruption 
wurde das öfter auch mal auf nicht auslesbar oder nicht mehr 
beschreibbar gesetzt. Da half dann auch der Bootloader (der nich 
funktioniert hat) nichts mehr...

von vcd (Gast)


Lesenswert?

der alte Hanns schrieb:
> Das verstehe ich nicht. Ich hatte das Datenblatt so interpretiert,
> dass
> nur eine ganze Seite geschrieben werden kann. Und wenn, wie Gregor Z.
> schreibt, lediglich einzelne Bytes, und nicht mal nur jeweils die
> ersten, verändert sind, so muss doch vorher die Seite gelesen worden
> sein.

Kleines Mißverständnis :-)
Ich hatte es so gemeint, daß ja während des Schreibvorganges durchaus 
die Spannung gesunken sein kann, daß der Schreibvorgang nicht vollendet 
wurde. Deswegen meinte ich, daß ja schon der Beginn des Schreibvorganges 
reicht, wenn nur ein oder wenige Bytes geschrieben sind.

von herbert (Gast)


Lesenswert?

"Code zerbröselt nach drei Wochen"...mehr Zement in die Mischung und 
weniger Sand...

von Andreas (Gast)


Lesenswert?

der alte Hanns schrieb:
> so muss doch vorher die Seite gelesen worden
> sein.

Nein, muss sie nicht.
Die Schreibfunktion kann den Wert eines Bits nur von 1 auf 0 ändern, 
nicht umgekehrt (das kann die Löschfunktion).
Wenn im Flash also in einem Byte der Wert 0x03 steht und Du den Wert 
0x07 hineinschreibst passiert - nix. Wenn Du statt dessen 0x01 
hineinschreibst, änder sich der Wert im Flash von 0x03 auf 0x02.

von der alte Hanns (Gast)


Lesenswert?

an Andreas

Das klingt pausibel, danke für die Erläuterung.

von c-hater (Gast)


Lesenswert?

Georg A. schrieb:

> Das Hauptproblem ist,
> dass Atmel sich wohl nicht dazu durchringen kann, eine ganz dicke fette
> Warnung ins Datenblatt zu bringen oder den BOD gleich per Default
> schonmal auf die niedrigste Stufe zu programmieren.

Unsinn. Bei einem professionell entwickelten Gerät sollte es niemals 
vorkommen, daß irgendwelche Default-Einstellungen des 
Controllerherstellers irgendeine Auswirkung auf die Funktion des 
fertigen Gerätes haben.

> BTW: Selbst die Fuse-Settings für den Programmspeicher können sich durch
> den Bug ändern.

Das ist gleich Doppel-Unsinn.

1) Irreguläres Verhalten bei einem Brownout ist kein "Bug", sondern 
normales Verhalten. Nicht nur bei AVRs, sondern bei allem, was 
elektronisch rechnet. Jeder, der das Grundlagenstudium erfolgreich 
überstanden hat, sollte nicht nur wissen, DASS das so ist, sondern sogar 
WARUM es so ist.

2) Die Lockbits sind zusammen mit den Fuses genau die Sachen, die von 
Brownout-Schäden praktisch nie betroffen sind, weil sie eben deshalb als 
Fuse implementiert sind, damit niemals schreibend aus dem MCU-Core 
darauf zugegriffen werden kann.

Wenn zu idiotischer Entwicklung bezüglich der Brownout-Problematik 
allerdings noch genau dieselbe Idiotie bei der Reset-Beschaltung und der 
Auslegung der Stromversorgung kommt, dann kann es auch mal die Fuses 
oder Lockbits verstellen. Dazu ist aber wirklich komplette Unfähigkeit 
des Entwicklers nötig, der muß alles, aber wirklich auch alles so 
grundfalsch machen, was man es nur machen kann.

Der Typ ist dann krass unfähig->feuern und Schadensersatzklage gleich 
hinterher. Schließlich hat er von seinem AG Zahlungen entgegengenommen 
für eine Leistung, die er definitiv nicht zu erbringen in der Lage war, 
nämlich kompetente Entwicklungsarbeit.

von Georg A. (georga)


Lesenswert?

> daß irgendwelche Default-Einstellungen des
> Controllerherstellers irgendeine Auswirkung auf die Funktion des
> fertigen Gerätes haben.

Die Default-Einstellung des BOD auf Off hat eine desaströse Auswirkung, 
und zwar eine langfristig 100% Chance auf Flash-Corruption.

>> BTW: Selbst die Fuse-Settings für den Programmspeicher können sich durch
>> den Bug ändern.
> Das ist gleich Doppel-Unsinn.
>...
> 2) Die Lockbits sind zusammen mit den Fuses genau die Sachen, die von
> Brownout-Schäden praktisch nie betroffen sind, weil sie eben deshalb als
> Fuse implementiert sind, damit niemals schreibend aus dem MCU-Core
> darauf zugegriffen werden kann.

Tja, du bist ja auch voll der Superhecht.

Atmega8 Manual, Seite 209: "Setting the Boot Loader Lock Bits by SPM"

Damit ist deine Kompetenz zu diesem Thema genug bewertet. Und Tschüss.

von spess53 (Gast)


Lesenswert?

Hi

>Die Default-Einstellung des BOD auf Off hat eine desaströse Auswirkung,
>und zwar eine langfristig 100% Chance auf Flash-Corruption.

Als pauschale Aussage, Blödsinn.

MfG Spess

von Thomas (Gast)


Lesenswert?

Spricht was gegen das grundsätzliche Setzen von "Brown Out Detection" ?
Gibt es Situationen, mit denen man sich Probleme einhandeln kann?

Ansonsten habe ich wieder was gelernt und werde BOD immer setzen.

Danke und Gruß
Thomas

von Georg A. (georga)


Lesenswert?

> Als pauschale Aussage, Blödsinn.

Probiers einfach mal aus, und zwar nicht mit zweimal abschalten, sondern 
ein paar tausendmal. Und jetzt komm bitte nicht mit "liegt an der 
Stromversorgung" oder "nimm einen Resetgenerator". Das ist ein 
neuzeitlicher Microcontroller, der muss ohne externen Schnickschnack 
zurechtkommen.

von der alte Hanns (Gast)


Lesenswert?

an Thomas

Stromverbrauch: z.B. wenn man bei einem ATmega16 einen Netzausfall mit 
einem Goldcap überbrücken will, fallen die ca. 15 uA ins Gewicht.

von spess53 (Gast)


Lesenswert?

Hi

>Probiers einfach mal aus, und zwar nicht mit zweimal abschalten, sondern
>ein paar tausendmal.

Reichen auch ein paar tausend Geräte mit bis zu 15 Jahren im 
industriellen Einsatz?

MfG Spess

von Georg A. (georga)


Lesenswert?

Dann hast du Glück gehabt oder Schreib-Zugriffe via SPM in den Fuses 
generell disabled. Dann kann ich mir aber auch gleich eine OTP-CPU 
kaufen, kommt billiger...

von Alex (Gast)


Lesenswert?

> Spricht was gegen das grundsätzliche Setzen von "Brown Out Detection" ?
> Gibt es Situationen, mit denen man sich Probleme einhandeln kann?

Jepp, zumindest in meinem Fall:

Billige Brushlessregler im Modellbaubereich mit einfacher 
uC-Spannungsversorgung oder aber auch mit getakteter Spannungsversorgung 
mittels StepDown, der nicht schnell genug ausregelt. Im Moment der 
Vollgasstellung bricht die uC-Spannungsversorgung um 1V ein und der Chip 
wird resetet> Neuausrichtung der Neutralgasstellung im Flug usw. nötig. 
Hab auf diese Weise den Flieger fast zwei mal ums Leben gebracht. Hab 
den Regler von Schrumpfschlauch befreit und siehe da ein ATmega8, 
eigenen Reglercode drauf gejagt, BOD aus und das Ding funktioniert wie 
es soll, trotz immer noch vorhandenem leichten Spannungseinbruch.
Nun gut, in diesem Fall ist es natürlich schlicht und einfach eine 
fehlkonstruierte Spannungsversorgung, die Funktion des BODs im 
OFF-Zustand hilft aber, diesen Mangel einigermaßen zu beseitigen.
Das hierbei auch ein Fehlverhalten des uCs fast schon provoziert wird, 
ist natürlich klar, allerdings habe ich bisher mit dieser Konfiguration 
im letzen Sommer bei über 50 Flügen keinen einzigen ungewollten 
Reglerreset mehr gehabt.

von Walter (Gast)


Lesenswert?

Alex schrieb:
> Im Moment der
> Vollgasstellung bricht die uC-Spannungsversorgung um 1V ein

dann könnte man BOD ja auch auf 2,x Volt setzen.
Gibt es sonst irgendeinen Grund warum man das Bit überhaupt braucht,
also warum BOD nicht fest verdrahtet ist?

von Einhart P. (einhart)


Lesenswert?

Der Controller hat ja auch noch Elektronik drum herum. Atmel weiß nicht, 
welche Grenzwerte dort für die Versorgung gelten.

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.