Forum: Mikrocontroller und Digitale Elektronik Was passiert beim ausschalten?


von Dennis (Gast)


Lesenswert?

Hallo!
Ich habe ein Problem und hoffe auf Ideen.

Ich habe seit langem eine Schaltungen mit ATMega32, EADOGM162 und 
diversen Tasten im Einsatz. Diese funktionierte bisher immer recht gut.
Nach diversen Änderungen um den Quellcode übersichtlicher und 
universeller zu gestalten habe ich nun ein Phänomen!

Nach dem ausschalten startet die Schaltung nicht mehr. Es geht zwar noch 
eine LED an, aber das Display wird wohl nicht initialisiert...
Aus diesem Zustand bekomme ich die Schaltung nur mit dem alten Programm 
wieder raus. Wenn ich das neue flashe, tut dies auch für unbestimmte 
Zeit wieder.
Das Phänomen tritt also nicht bei jedem ausschalten auf, sondern nur 
manchmal.

Hat jemand eine Idee was dort in dem Controller passiert?

Den Quellcode zu posten wäre wohl sehr unübersichtlich, weil es sich um 
ca. 30 c-Files/Header-Files handelt...


Gruß

von Bastelheinz (Gast)


Lesenswert?

>Den Quellcode zu posten wäre wohl sehr unübersichtlich, weil es
>sich um ca. 30 c-Files/Header-Files handelt...

Tja, da müssen wohl wieder die Glaskugeln an die Front.

von Thomas (Gast)


Lesenswert?

Nimm einen 0815 Logikanalyser und vergleiche die beiden Inits des LCDs.
Dann noch den init-Quelltext dazu und du solltest den Fehler finden.

Ohne Schaltplan und Code wird dir nieman helfen können.

Thomas

PS: Ich hatte einen ähnlichen Fehler, beim Reset wurden die Register 
nicht sauber initiiert und deshalb kam ne falsche Init-Sequenz und das 
LCDblieb (zu recht!) dunkel.

von Davis (Gast)


Lesenswert?

Da kann viel passieren und es können verschiedenen Ursachen in Frage 
kommen. Du solltest hier und da in der Schaltung nach Eigentümlichkeiten 
suchen und vielleicht den einen oder anderen Befund sorgfältig prüfen. 
Auch im Internet finden sich viele Hinweise. Es gilt: Ruhe bewahren und 
den Anordnungen der Moderatoren folgen. Viel Glück!

von Udo S. (urschmitt)


Lesenswert?

Code und Funktionalität schrittweise soweit reduzieren bis der Fehler 
nicht mehr auftritt.
Die letzte Version bei der der Fehler noch auftrat sollte dann so klein 
sein, daß man es posten kann.

Ja Fehlersuche kann sehr mühsam sein.

von Kevin (Gast)


Lesenswert?

Dennis schrieb:
> Nach diversen Änderungen um den Quellcode übersichtlicher und
> universeller zu gestalten

Wozu ändert man etwas wenn es funktioniert?
In dem Moment wo es funktioniert interessiert mich
das Wie und Warum nicht mehr.

Never touch a running system!

von c-hater (Gast)


Lesenswert?

Dennis schrieb:

> Das Phänomen tritt also nicht bei jedem ausschalten auf, sondern nur
> manchmal.
>
> Hat jemand eine Idee was dort in dem Controller passiert?

Könnte ein Brownout sein.

Der Controller macht Mist, weil die beim Ausschalten langsam fallende 
Spannung ihm Zeit dazu gibt. Sie ist für eine nennenswerte Zeitspanne 
einerseits nicht mehr hoch genug, daß er korrekt arbeiten kann, 
andererseits aber noch nicht gering genug, daß er komplett stehenbleibt.

Was dann genau passiert, ist teils Zufall, teils exemplarabhängig, teils 
gesetzmäßig. Es kann gut passieren, daß schon geringe Codeänderungen 
dafür sorgen, daß plötzlich mit stark erhöhter Wahrscheinlichkeit etwas 
passiert, was auch nach dem nächsten PowerUp noch wirkt (also Flash oder 
EEPROM teilweise überschreibt).

Das liegt nicht daran, daß der Code an sich fehlerhaft ist. Er ist 
einfach nur anders und sorgt dafür, das die stochastischen Vorgänge beim 
Brownout anders verlaufen.

Es gibt nur zwei Möglichkeiten, Brownout-Effekte zuverlässig zu 
verhindern. 1) Internen Brownout-Detector verwenden. 2) Externen 
Brownout-Detector verwenden (z.B. in Form eines sog. "Reset-IC")

Beide machen aber letztlich das Gleiche: Bei Unterschreiten einer 
definierten Mindestspannung den µC möglichst fix in den Reset-Zustand zu 
versetzen. Dann steht er nämlich komplett und kann keinen sinnlosen Müll 
mehr ausführen. Diese Mindestspannung muß einerseits niedrig genug sein, 
daß nicht schon im normalen Betrieb gelegentlich der Brownout-Detector 
das Teil resettet, andererseits aber hoch genug, daß der Reset 
rechtzeitig wirksam wird, noch bevor der Controller anfängt Müll zu 
machen.

von Axel S. (a-za-z0-9)


Lesenswert?

c-hater schrieb:
> Könnte ein Brownout sein.

[längliche Erklärung gesnipt]

Das könnte man ganz einfach überprüfen, indem man den µC ausliest und 
mit dem Original .hex vergleicht. Bzw. falls die Programmierumgebung das 
kann, gleich ein Verify mit dem Original machen.


XL

von Dennis (Gast)


Lesenswert?

Axel Schwenke schrieb:
> Das könnte man ganz einfach überprüfen, indem man den µC ausliest und
> mit dem Original .hex vergleicht.

Den Brown Out kann man denke ich ausschließen. Wenn ich das Flashfile 
per ISP neu reinschreibe ist ja noch das gleiche verhalten da.
Erst wenn das alte Flashfile geschrieben wird tut es wieder.

Ich bin dieses Wochenende aber nicht mehr zuhause, so das ich mich erst 
nächste Woche daran machen werde den Code zu reduzieren.
Ich hoffe der Abstand tut mir gut, war heute nachmittag ganz schön 
genervt! :-(

Danke schonmal für die vielen Tips!

von Amateur (Gast)


Lesenswert?

... ist doch ganz klar: In Zeile 42 von Modul 5 wird eine Variable nicht 
richtig initialisiert.
Darüber hinaus würde ich R10 etwas niedriger wählen.

Meine Glaskugel ist aber leicht beschlagen.

von Anja (Gast)


Lesenswert?

Dennis schrieb:
> Nach dem ausschalten startet die Schaltung nicht mehr.

Bei mir passiert das immer wenn ich das TTL-Signal vom USB-> TTL-Wandler 
angeschlossen lasse.

Gruß Anja

von Uwe (de0508)


Lesenswert?

Hallo Anja,

ja das kann ich auch bestätigen und tritt leider bei einem aktuellen 
Projekt mit m162 immer auf.

RXD (TTL) hat auch einen Pullup erhalten.

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

selbst wenn Daten dauerhaft verändert werden, die Init-Sequenz muss so 
gestaltet sein, dass das System unter allen Umständen starten kann. Da 
hilft eigentlich nur, den Ablauf logisch Schritt für Schritt 
durchzugehen, ob wirklich alles initialisiert wird und ob es denkbare 
Dateninhalte gibt, die ein Starten verhindern. Auch wenn es mühsam ist, 
sonst müsste man einen LA haben der den gesamten Startvorgang 
aufzeichnen kann.

Man kann ja einen PC per BIOS-Einstellungen so versauen, dass die 
Hardware nicht mehr funktioniert, aber selbst dann stellt sich der PC 
spätestens beim nächsten Start auf erprobte Standard-Einstellungen 
zurück - wenn das BIOS sauber programmiert ist. So sollte das bei jedem 
System sein. Dauerhaft gespeicherte Daten, die einen Neustart 
verhindern, darf es keinesfalls geben.

Gruss Reinhard

von Konrad S. (maybee)


Lesenswert?

Ich hatte neulich mal einen hartnäckigen Fehler. Die Symptome waren 
wirr. Manchmal schien es, als liefe der µC kurz nach den ersten 
Initialisierungsschritten in einen Reset. Machmal lief auch die 
Hauptschleife, aber die Debug-Ausgabe über UART klappte nur bei zwei 
Schleifendurchläufen, dann zwei Durchläufe nicht, dann wieder von vorne, 
obwohl die Diagnose-LEDs eigentlich auf keine Störung schließen ließen. 
Durch Zufall bemerkte ich, dass der Reset-Knopf oft zu einem anderen 
Ergebnis führt als ein Power-Cycle. Selbstverständlich habe ich auch mal 
den µC ausgetauscht und die Schaltung komplett neu aufgebaut. Natürlich 
hat alles nichts geholfen.
Die Ursache der Probleme war - wie sollte es anders sein - vollkommen 
unspektakulär: Ich hatte bei der Anpassung meines Makefile-Templates an 
das Projekt es fertiggebracht das -mmcu=atmega328p nur beim Kompilieren, 
nicht aber beim Linken einzubauen. Jetzt mit verbessertem Template 
passiert mir das nicht mehr - hoffentlich!

von Anja (Gast)


Lesenswert?

Uwe S. schrieb:
> ja das kann ich auch bestätigen und tritt leider bei einem aktuellen
> Projekt mit m162 immer auf.
>
> RXD (TTL) hat auch einen Pullup erhalten.

Das Problem tritt dadurch auf daß der ATMEGA durch die TTL-Spannung 
halblebig versorgt wird. Es tritt also kein richtiger RESET auf.

Gruß Anja

von Reinhard Kern (Gast)


Lesenswert?

Anja schrieb:
> Das Problem tritt dadurch auf daß der ATMEGA durch die TTL-Spannung
> halblebig versorgt wird. Es tritt also kein richtiger RESET auf.

Was ist denn aus den guten alten Resettastern geworden?

Gruss Reinhard

von c-hater (Gast)


Lesenswert?

Reinhard Kern schrieb:

> selbst wenn Daten dauerhaft verändert werden, die Init-Sequenz muss so
> gestaltet sein, dass das System unter allen Umständen starten kann.

Wenn nun die dauerhaft veränderten Daten ausgerechnet der Code der 
Init-Sequenz oder irgendeiner ISR sind?

Dann fällst du mit deinem absolut nicht durchdachten Ansatz gnadenlos 
auf die Schnauze.

> Man kann ja einen PC per BIOS-Einstellungen so versauen, dass die
> Hardware nicht mehr funktioniert, aber selbst dann stellt sich der PC
> spätestens beim nächsten Start auf erprobte Standard-Einstellungen
> zurück - wenn das BIOS sauber programmiert ist.

Auch dort gibt's das gleiche Problem. Wenn z.B. das RAM, in den das BIOS 
aus dem seriellen Flash geladen wird, eine Macke halt...

> System sein. Dauerhaft gespeicherte Daten, die einen Neustart
> verhindern, darf es keinesfalls geben.

Das wird aber schwierig. Code ist schließlich nix anderes als dauerhaft 
gespeicherte Daten.

von Anja (Gast)


Lesenswert?

Reinhard Kern schrieb:
> Was ist denn aus den guten alten Resettastern geworden?

Das macht man heutzutage automatisiert mit dem Flash-Tool.

Dennis schrieb:
> Wenn ich das neue flashe, tut dies auch für unbestimmte
> Zeit wieder.

Gruß Anja

von Reinhard Kern (Gast)


Lesenswert?

c-hater schrieb:
> Dann fällst du mit deinem absolut nicht durchdachten Ansatz gnadenlos
> auf die Schnauze.

So ein Blödsinn, es geht z.B. um Parameter - und nicht um 
selbstmodifizierenden Code. Natürlich kann ein PC-BIOS sich nicht selbst 
reparieren, sehr wohl aber falsche Parameter zurücksetzen. Aber das war 
für entschieden zu hoch.

Auch beim vom TO beschreibenen Problem ist die Vermutung absurd, das der 
Fehler darauf beruht, dass sich beim Resetten die Firmware verändert.

Gruss Reinhard

von Malte S. (maltest)


Lesenswert?

Du hat sporadisch nach dem Einschalten, aber nicht nach dem Flashen oder 
sonstigem Reset das Problem? Hat das Display beim Powerup genug Zeit, 
bis die Init-Sequenz kommt? Zu schnelles Ansprechen des Displays würde 
ja in dem Fall nur nach dem Ausschalten oder genauer nach dem 
Einschalten auffallen, während es nach einem Reset dann normal täte.

von c-hater (Gast)


Lesenswert?

Reinhard Kern schrieb:

> So ein Blödsinn, es geht z.B. um Parameter - und nicht um
> selbstmodifizierenden Code.

Ein Brownout kann (natürlich ungewollt) Code zu selbstmodifzierendem 
Code machen. Das geht immer dann, wenn der Code in einem Speicher 
steckt, der zur Laufzeit modifizierbar ist. Flash gehört zu dieser 
Kategorie.

Das genau ist, was du scheinbar nicht zu begreifen vermagst.

> Natürlich kann ein PC-BIOS sich nicht selbst
> reparieren

Es ist noch viel Schlimmer: Es kann nichtmal selbst zuverlässig 
erkennen, daß es beschädigt ist. Weil nämlich schon die Testroutine 
selber beschädigt sein kann.

Und wieder: Das genau ist, was du scheinbar nicht zu begreifen vermagst.

> Auch beim vom TO beschreibenen Problem ist die Vermutung absurd, das der
> Fehler darauf beruht, dass sich beim Resetten die Firmware verändert.

Natürlich nicht. Beim Resetten wird die Firmware ganz sicher nicht 
verändert, jedenfalls solange der Code selber keine Routinen zur 
Firmware-Manipulation enthält (z.B. einen Bootloader), die durch einen 
Reset zur Unzeit unterbrochen werden könnten.

Bei einem unkontrollierten Powerdown hingegen ist das aber grundsätzlich 
immer möglich. Genau das ist ja das besonders fiese am Brownout. Er kann 
bleibende Schäden am Code anrichten, auch wenn dieser eigentlich 
überhaupt keinen Code zur Firmwaremanipulation enthält.

Ob das hier in Frage kommt, ist nach den bisherigen Einlassungen des OP 
schlicht nicht entscheidbar. Er betreibt aus unerfindlichen Gründen 
leider keine sinnvolle Strategie zur Fehlereingrenzung, obwohl es 
wirklich einfach wäre, Brownout-Effekte als Ursache zuverlässig 
auszuschließen. Man bräuchte doch im sichtbaren Fehlerfall nur das Image 
aus dem Controller lesen und mit dem Sollimage zu vergleichen...

Keine Ahnung, warum er das nach zwei Dutzend Postings im Thread noch 
nicht auf die Reihe bekommen hat und statt dessen nach der "es kann 
nicht sein, weil es nicht sein darf"-Methode diesen Mechanismus als 
Ursache ausschließt. Wenn es eine einfache Methode gibt, eine ganze 
Fehlerklasse zuverlässig als Ursache auszuschließen, dann benutzt man 
die. Alles andere ist nur eins: völlig idiotisch.

Wenn er einfach das Sinnvolle getan hätte, bräuchten wir uns nicht mehr 
über Möglichkeiten zu streiten.

von Peter D. (peda)


Lesenswert?

Wenn möglich, den BOR aktivieren, das verhindert schonmal einen amok 
laufenden Programmcounter.

Ansonsten ist irgendeine Initialisierung unvollständig.
Beim AVR gerne gemachter Fehler, das SPI initialisieren, bevor /SS als 
Ausgang gesetzt ist.
Oder Eingänge als volle 8Bit abzufragen, anstatt nur den gewünschten 
Pin.

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.