Forum: Mikrocontroller und Digitale Elektronik Controller hängt sich nach sehr langer Zeit auf Ursache?


von Sebastian B. (sebastian86)


Lesenswert?

Guten Tag zusammen,

ich habe ein Programm geschrieben welches mittlerweile recht groß 
geworden ist. Nur habe ich ein großes Problem nach 2-4 Monaten hängt 
sich vermutlicherweise der Controller auf.

Folgendes zum Aufbau.

Mit dem Controller werden ein paar Pumpen und Ventile, über ein LCD mit 
Menu, geschaltet. Doch irgendwann nach einer großen Zeitspanne hängt 
sich der Controller auf und schaltet alles aus und auf dem Display 
werden Nur Hyroglyphen angezeigt. in den Letzten 12 Monaten ist das 3 
Mal passiert :(

Ich habe nun mal zusätzlich einen Watchdog in die Software implementiert 
um irgendeine blöde Sache abzufangen wo sich die Controller aufhängen 
würde und das er sich einfach resetet. Es ist auch immer Passiert wenn 
keiner in der Nähe war - das heisst es hat keiner irgendwelche tasten 
gedrückt oder sonst irgendwas. Es gab auch KEINEN spannungsausfall das 
kann ich mit 100%tiger sicherheit sagen. Desweiteren kann es auch nicht 
wirklich ein reset sein denn dann würde das Display ja ganz normal 
initialisiert werden.

Wie könnte ich nun am besten rausfinden woran es liegt?
Könnte ich vieleicht einem Stack Overflow zum Opfer fallen? so das er 
mir quasi in mein Ram schreibt und dann irgendwas überschreibt?

Das Programm ist leider zu groß um es hier rein zu posten. Aber 
vieleicht hat ja jemand einen Lösungseinsatz?!


Ich würde mich riesig freuen.

Schönen Gruß

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Poste dein Programm doch als Anhang, sonst können wir nur rätselraten... 
Hast Du eigentlich den BrownOut-Detector an?

von Juppes (Gast)


Lesenswert?

>> nach 2-4 Monaten hängtsich vermutlicherweise der Controller auf

Nicht ungewöhnlich!

=> Watchdog ist das Zauberwort.  Entweder im Controller oder ein 
externer WD.

Genau dafür sind die WauWau's

Juppes

von Marvin M. (Gast)


Lesenswert?

Hallo,

ein Stack-Problem ist oftmals der Fall bei sporadischen Ausfällen. 
Genauso gut kann es aber auch sein, dass deine Schaltung empfindlich 
gegen EM-Strahlung ist und dann aussteigt... das könnte man feststellen, 
wenn man die Schaltung absichtlich solcher Strahlung aussetzt (z.B. 
Relais als Summer ohne Funkenlöschung...)
Auch möglich sind Störungen von außen (über die Betriebsspannung).
Bei Software-Problemen wird es eklig. Evtl. kannst du die Software im 
"Zeitraffer" ablaufen lassen? Oder im Simulator laufen lassen und 
schauen, was der Stack so macht.
Mit einem Watchdog sollte das Problem erstmal gelöst sein - wenn damit 
auch nur die Symptome bekämpft werden und nicht die Ursache.

Viel Erfolg bei der Suche...

von Sebastian B. (sebastian86)


Lesenswert?

Ich weiss nicht ob das Programm veröffentlich werden darf - ist zwar 
komplett von mir geschrieben - aber gerade auch kein vorgesetzter da den 
ich fragen könnte.

Brown Out ist an, aber wie gesagt einen spannungseinbruch kann ich zu 
99,9 Prozent ausschließen weil diese mehrfach überwacht und mitgeloggt 
wird.


Ja einen Watchdog habe ich nun aktiviert und eingebunden. Nur muss ich 
jetzt erstmal wieder 2-4 Monate warten :(.


Gibt es eine Möglichkeit in der Simulation vom AVR Studio die Zeit 
extrem zu beschleunigen? also quasi 1 Tage in einer Sekunde ? Dann 
könnte ich ja mal die Simulation laufen lassen und gucken ob es dort 
auch passiert.

von Karl H. (kbuchegg)


Lesenswert?

Juppes schrieb:
>>> nach 2-4 Monaten hängtsich vermutlicherweise der Controller auf
>
> Nicht ungewöhnlich!

Eigentlich schon.
So ein Controller sollte sich aus Softwaregründen nie aufhängen! Mein 
Mega in der Heizungssteuerung läuft jetzt seit ich ihn eingebaut habe 
durch. 24 Stunden am Tag, 7 Tage die Woche ... seit 2.5 Jahren.

> => Watchdog ist das Zauberwort.  Entweder im Controller oder ein
> externer WD.

Ein Watchdog sollte aber nicht dazu missbraucht werden, Software Fehler 
zu ignorieren. Wenn es einen Programmfehler gibt, dann muss man den 
korrigieren, den Fehlschaltung aufgrund erster Fehlfunktionen im 
Programm kann auch ein Watchdog nicht verhindern.

Aus Softwaresicht ist ein Watchdog das letzte Bollwerk, wenn sonst gar 
nichts mehr geht.

von Sebastian B. (sebastian86)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Aus Softwaresicht ist ein Watchdog das letzte Bollwerk, wenn sonst gar
> nichts mehr geht.

Ja das sehe ich auch so, habe ihn nun erstmal verwendet um erstmal in 
einen Sicheren Zustand zu kommen, da es ja anscheinend einen Software 
Fehler gibt. Die Frage ist nur wie ich Ihn am Besten finde :/

von Bond (Gast)


Lesenswert?

So sporadische Fehler sind schwer zu finden, kenne das.

Manche µC bieten die Möglichkeit festzustellen wer
z.B. Reset ausgelöst hat (Watch-Dog, Brown out, Power-On etc.)
siehe Datenblatt, einfach diese Ereignisse registrieren
(z.B. im EEPROM mitzählen) und Auswerten. Hilft manchmal
bei der Suche nach der Ursache weiter.

Würde für Testzwecke auch mal das RAM mit einem bestimmten
Wert pro Byte (z.B. 0x5A) laden, aber jede Zelle mit dem
gleichen Wert.

Nach einiger Betriebszeit -ohne über Reset zu gehen-
RAM auslesen. Gibt es noch ein paar 0x5A Bytes die direkt
aufeinander folgen? Je mehr, desto besser.

von Sebastian B. (sebastian86)


Lesenswert?

Das Problem ist ja irgendwie das er nicht so wirklich resetet wird. Denn 
nach einem Brown Out oder Power-On Reset oder meinet wegen auch nach 
einem Strom - AUS / AN Reset sollte er ja wieder quasi im ersten Menu 
sein und das Display zeigt normale Sachen an. Aber das 4 Zeilen 20 
Zeichen Display ist Komplett mit Hyroglyphen vollgeschrieben also nicht 
nur Zeile 1 und 3.

Ich meine mich auch Daran zu errinnern das Wenn man eine Taste gedrückt 
hat um durchs Menue zu Scrollen das dann irgendwas hyroglyophen mässiges 
auf das LCD geschrieben wurde.

/EDIT
Achja ich habe den Watchdog ja jetzt implementiert und natürlich WENN 
dieser auslöst dann bekomme ich das in der Hauptschleife mitgeteilt das 
seit dem letzten normalen Start der Reset ausgelöst wurde.

von (prx) A. K. (prx)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Ein Watchdog sollte aber nicht dazu missbraucht werden, Software Fehler
> zu ignorieren.

Sagt die Theorie. Bloss lassen sich Fehler, die nur alle paar Monate 
sporarisch auftreten, mitunter derart schwer eingrenzen, dass als 
Notwehr nur der Watchdog praktikabel ist.

Freilich sollte man beides anpeilen. Neben dem Watchdog noch ausreichend 
detailfreudige Protokollierung in einen round-robin Speicher, um ggf. 
den Ablauf nachvollziehen zu können. Nach einen WD-Reset wird der dann 
eingefroren und kann zur Analyse verwendet werden.

von ucWriter (Gast)


Lesenswert?

Softwareseitig könntest du deinen Quellkode mit statischen 
Analyse-Werkzeugen überprüfen: Z.B. splint? Passt es mit dem Stack? Gibt 
es vielleicht irgendwelche Compiler/Linker-Warnungen?

von Falk B. (falk)


Lesenswert?

Kann sollte auch mal prüfen, ob man grundlegende Reglen bei der 
Programmierung eingehalten hat. Beliebte Stolperfallen, nicht nur für 
Anfänger, sind Zugriffsfehler bei Variabeln, die im Hauptprogramm und in 
Interrupts genutzt werden, Stichwort volatile und atomar. BEIDES 
muss erfüllt sein. Pufferüberläufe durch falsche, nicht geprüfte 
Parameter in Funktionen sind auch sehr "beliebt".

>Achja ich habe den Watchdog ja jetzt implementiert und natürlich WENN
>dieser auslöst dann bekomme ich das in der Hauptschleife mitgeteilt das
>seit dem letzten normalen Start der Reset ausgelöst wurde.

Da hast du glaub ich was falsch umgesetzt. WENN der Watchdog zuschlägt, 
gibt es einen Reset. In den meisten Controllern kann man per Register 
auslesen, was die Resetursache war. Das macht man direkt beim 
Programmstart. Im Fehlerfall (Watchdogreset), zeigt man eine 
Fehlermeldung an und das Programm bleibt stehen. Man kann, je nach 
Hardware, auch die aktuelle Zeit anzeigen, bei der der Watchdogreset 
auftrat. Damit muss man nicht immer neben der Kiste stehen, sondern es 
reicht, einmal die Woche nachzuschauen. HighTec Enthusiasten verschicken 
im Fehlerfall eine SMS per Handmodul.

MfG
Falk

von (prx) A. K. (prx)


Lesenswert?

Falk Brunner schrieb:

> Im Fehlerfall (Watchdogreset), zeigt man eine
> Fehlermeldung an und das Programm bleibt stehen.

Das würde ich beispielsweise bei einer Heizung lieber nicht so machen. 
Sonst darfst du, wenn du Pech hast, nach dem Urlaub sämtliche Heizkörper 
und Rohrleitungen auswechseln. ;-)

> HighTec Enthusiasten verschicken
> im Fehlerfall eine SMS per Handmodul.

Hatte ich mir auch überlegt, aber ein kleiner Webserver erschien mir 
praktischer. Insbesondere wenn man bei 23°C am Urlaubsort auf dem Phone 
zusehen kann, wie die Leute zu Hause bei -10°C frieren. ;-)

von Sebastian B. (sebastian86)


Lesenswert?

Nein stehen bleiben darf das Programm nach einem Watchdog Reset auf gar 
keinen Fall. Ich speicher im EEPROM zu ausgewählten Momenten diverse 
Stati-Meldungen. Anhand dieser Meldungen wird nach einem Reset das Gerät 
wieder in den letzt bekannten Zustand gefahren.

von Uwe (Gast)


Lesenswert?

Naja Folgendes :
1. Wenn du ne keine Taste drückst und sich nichts auf dem Display ädert.
2. Du ne Taste drückst und sich auf dem Display genau dann was ändert.

Dann scheint er ja noch sein Program auszuführen aber sendet falsche 
Daten ans Display. Die Tasten werden ja auch ausgewertet. Das würde 
bedeuten das ecventuel auch noch der Watchdog resetet wird. Da die 
Tasten warscheinlich hart is flash als Konstanten compiliert sind 
scheint alles was aus dem flash kommt noch (einigermaßen) zu 
funktionieren. Also ich würde auf RAM inhalt zerstört Tippen. Wenn du 
den Spannungseinbruch wirklich ausschließen kannst würde ich auch auf 
den Stack tipppen (irgendwo nen pop vergessen in einer Funktion die 
nicht sooft ausgeführt wird so alle 3-4 Monate).

von Simon K. (simon) Benutzerseite


Lesenswert?

Die vom TO geschilderten Probleme laufen zu 90% auf Fehler bei atomaren 
Zugriffen (schon erwähnt) oder ungültige Array-Indizierung hinaus. 
Alternativ kann dann auch noch der Stack zu groß werden.

von Karl H. (kbuchegg)


Lesenswert?

A. K. schrieb:
> Karl Heinz Buchegger schrieb:
>
>> Ein Watchdog sollte aber nicht dazu missbraucht werden, Software Fehler
>> zu ignorieren.
>
> Sagt die Theorie. Bloss lassen sich Fehler, die nur alle paar Monate
> sporarisch auftreten, mitunter derart schwer eingrenzen, dass als
> Notwehr nur der Watchdog praktikabel ist.

Wenn das der Fall ist, dann ist, mit Verlaub gesagt, der Programmierer 
ein dummer Hund.

Klar lassen sich solche Fehler nur schwer finden. Und es gibt Fehler die 
sind lange Zeit gut versteckt. Ich hatte letzte Woche einen Fehler zu 
tracken. Nach einem halben Tag hatte ich die vergessene Epsilon Abfrage 
bei einem Floating Point Vergleich entdeckt. Das Programm hat einen Wert 
von -9E-17 als negativ klassifiziert (anstelle von 0) und daher 
komplette Geometrieaufbauten in die verkehrte Richtung durchgezogen. Ich 
hab den Code dazu mit Sicherheit mehr als 30 mal durchgesteppt (der 
Bereich um den es da ging umfasst ca. 8000 bis 10000 Lines of Code), in 
wechselnden Aufrufhierarchietiefen, bis ich dann endlich so tief unten 
war, dass in der 10-ten oder 12-ten Hierarchiestufe, in den 
Basisroutinen die zu einer Kontur eine bestimmte Parallelkontur 
berechnen, das Problem offen dalag. Der Code war datiert mit September 
1993 (kein Scherz. Der Bug war seit 19 Jahren im Code ohne dass er 
auffiel. Ich hatte das Pech/Glück beim Testen auf eine bestimmte 
Geometriesituation zu stossen, bei der er sich erstmals auswirkte).

Es hilft aber nichts. Wenn es ein Softwarefehler ist, dann muss er 
gefunden werden. Und anschliessend muss man überlegen, wie es dazu 
gekommen ist und für die Zukunft lernen, wie man seinen Code so aufbaut, 
dass einem dieser Fehler nicht mehr passiert. Alles andere ist 
Amateurvorgehen. Und zumindest für mich nicht tolerierbar.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und zumindest für mich nicht tolerierbar.

Im Prinzip ja richtig.

Aber was tun wenn ein Kunde die Sachen gleich haben will ? Wer testet
denn ein System monatelang um solche Sachen zu finden ?

Alleine die Entscheidung Soft- oder Hardwareproblem ist sehr schwierig.

von Erich (Gast)


Lesenswert?

Warum denn keinen Not-(Watchdog-) Reset ?
Ist es ein Flugzeug ?

Ich hatte vor längerer Zeit mal eine Telefonanlage (eines renomierten, 
noch aktiven Herstellers). Das Teil war ganz neu --zu neu--.
Es hat seinen eigenen Flashspeicher (Programmbereich) überschrieben 
durch seine wohl damals noch fehlerhafte "EEPROM" Emulation. Immer nach 
einigen -zig Betriebsstunden trat das auf. Totaler Hänger der Anlage.
Der Hersteller hatte auf die Schnelle keine neue SW.

Die Hotline sagte:
Nehmen Sie eine Schaltuhr, stellen diese Nachts auf 03:30 und nehmen 
damit für 5 Minuten die Netzspannung weg.
Diese Lösung hat prima funktioniert!

Gruss

von Karl H. (kbuchegg)


Lesenswert?

Joachim Drechsel schrieb:
> Karl Heinz Buchegger schrieb:
>> Und zumindest für mich nicht tolerierbar.
>
> Im Prinzip ja richtig.
>
> Aber was tun wenn ein Kunde die Sachen gleich haben will ? Wer testet
> denn ein System monatelang um solche Sachen zu finden ?

Brauchst du mir nicht sagen.
Aber die Methode "da kleben wir ein Pflaster drüber" ist nun mal keine 
adequate Methode um Rostlöcher in der Karosserie zu 'beheben'.

Ausnahmslos jede Nachlässigkeit, die ich mir in der Vergangenheit zu 
schulden kommen habe lassen, aber wirklich jede einzelne, sei es ein 
Designfehler von dem ich wusste, sei es eine lasche Implementierung, sei 
es Abfrage von Fehlersituationen die ich auf 'später' verschoben habe, 
egal was ... jede einzelne dieser bewussten Nachlässigkeiten ist mir 
irgendwann auf den Kopf gefallen. Der einzige Unterschied im Vergleich 
zum Zeitpunkt des Nichtbehandelns ... alles war danach nur noch 
schlimmer zu beheben.

> Alleine die Entscheidung Soft- oder Hardwareproblem ist sehr schwierig.

Schon klar. Aber unter den Tisch kehren ist keine Lösung.
Gebranntes Kind scheut das Feuer.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ausnahmslos jede Nachlässigkeit, die ich mir in der Vergangenheit zu
> schulden kommen habe lassen, aber wirklich jede einzelne, sei es ein
> Designfehler von dem ich wusste, sei es eine lasche Implementierung, sei
> es Abfrage von Fehlersituationen die ich auf 'später' verschoben habe,
> egal was ... jede einzelne dieser Nachlässigkeiten ist mir irgendwann
> auf den Kopf gefallen. Der einzige Unterschied zum Zeitpunkt des
> Nichtbehandelns ... alles war danach nur noch schlimmer.

Äm ... ja ... (ich weiß, ist auch meine Erfahrung).

Dazu kommen aber wieder mal die lieben Kunden. Meist "muß es gestern
fertig sein", ständig kommen Änderungswünsche oder man haut ihnen mal
schnell ein Muster zusammen was sie dann nicht mehr herrausrücken.

Ich habe da das "Glück" immer Zugriff auf die fertigen Sachen zu
haben (alles läuft über's Web) und habe da wenigstens noch Möglickeiten
einzugreifen und zu korrigieren.

Alles austesten ist schlicht nicht möglich.

Beispiel: Ich hatte mal einen Datenimport der damals auf einemm 386er
mit W311 12,5 Tage (!) ohne Absturz (!!!) gelaufen ist. Crash ?
Wie denn da einen Fehler finden ? HW, SW, Windows ? Hmmm ...

von (prx) A. K. (prx)


Lesenswert?

Karl Heinz Buchegger schrieb:

> dass einem dieser Fehler nicht mehr passiert. Alles andere ist
> Amateurvorgehen. Und zumindest für mich nicht tolerierbar.

Wenn du aber Microsoft heisst und ein Betriebssystem programmierst, dann 
kannst du vor dem Dilemma stehen, dass in den 19 Jahren seither hunderte 
Programmierer den Bug im API oder der Lib bereits gefunden haben und die 
Macke in den eigenen Programmen ausmerzen. Wenn du dann den Bug behebst, 
dann funktionieren diese Programme nicht mehr, weil sie den Fehler 
voraussetzen (kein Witz!).

von Karl H. (kbuchegg)


Lesenswert?

Joachim Drechsel schrieb:

> Beispiel: Ich hatte mal einen Datenimport der damals auf einemm 386er
> mit W311 12,5 Tage (!) ohne Absturz (!!!) gelaufen ist. Crash ?
> Wie denn da einen Fehler finden ? HW, SW, Windows ? Hmmm ...

Extrem schwer, da irgendwas zu finden. Ist mir schon klar.

Sowas kriegt man nur in den Griff, wenn man von vorne herein bei der 
Implementierung schon rigoros vorgeht. Jedes Subsystem durchläuft Tests 
ehe es zum Einsatz kommt. Gerade in C: Jede Stringoperation wird 
hingeschrieben und gleich danach überlegt: Kann der String zu groß sein, 
wo kommt er her, ist er dort getestet worden, etc. Dasselbe für 
Array-Dinge. Möglichst wenig Querverknüpfungen zwischen Codeteilen die 
unkontrolliert auf Variablen zugreifen (die große Stärke der OOP). Ganz 
wichtig: sein Werkzeug (die Programmiersprache) wirklich beherrschen und 
nicht auf in Foren zusammengeschnorrtem 1/4-Wissen sitzenbleiben 
(wichtig zb für Datentyp-Promotionen. Das sind Dinge, die müssen 
sitzen!) Wenn man Fehler macht (und wer macht die nicht), nicht danach 
zum Tagesgeschehen übergehen sondern ein paar Minuten Zeit nehmen: wie 
ist es dazu gekommen, was kann ich für die Zukunft daraus lernen, wie 
kann ich den Code so gestalten, dass mir das nicht nochmal passiert?

Nur so kriegt man das letzten Endes in den Griff. Und das geht auch 
nicht von heute auf morgen, ist schon klar. Aber wer nie anfängt, kommt 
auch nie am Ziel an.
Wartbarkeit muss von vorne herein in den Code eingebaut sein. In einem 
sauber aufgebauten modularen System ist das schon zu knacken. Programme 
auf einem µC sind ja nicht so dermassen groß, dass man sie nicht noch 
einigermassen überblicken könnte.

von Karl H. (kbuchegg)


Lesenswert?

A. K. schrieb:
> Karl Heinz Buchegger schrieb:
>
>> dass einem dieser Fehler nicht mehr passiert. Alles andere ist
>> Amateurvorgehen. Und zumindest für mich nicht tolerierbar.
>
> Wenn du aber Microsoft heisst und ein Betriebssystem programmierst, dann
> kannst du vor dem Dilemma stehen, dass in den 19 Jahren seither hunderte
> Programmierer den Bug im API oder der Lib bereits gefunden haben und die
> Macke in den eigenen Programmen ausmerzen. Wenn du dann den Bug behebst,
> dann funktionieren diese Programme nicht mehr, weil sie den Fehler
> voraussetzen (kein Witz!).

Genau das ist einer der Punkte, die ich mit ".... danach ist alles nur 
noch schlimmer" gemeint habe. Denkst du, das ist mir noch nie passiert, 
dass ich um einen Bug zu beheben, erst mal alle Codestellen finden 
musste, die auf diesem Bug aufbauen? Alles schon dagewesen.

Noch schlimmer ist nur noch: Du kommst drauf, dass du den Bug nicht 
beheben kannst, weil das komplette Design Scheisse ist. Design kannst du 
aber nicht ändern, weil alles rundherum darauf aufbaut, dass sich ein 
Subsystem genau so verhält wie es sich verhält. Und mit dem Design das 
du hast, ist der Bug systemimanent. Da sitzt du erst recht in der Tinte 
und schweren Herzens schluckst du die nächste Krot in Form eines 
halbherzigen Fixes, genau wissend, dass dir genau dieser Fix irgendwann 
in den nächsten 5 Jahren wieder auf den Kopf knallen wird.


Und zum Thema Mikrosoft:
Meine persönliche Meinung - das ist der größte Haufen 
Amateurprogrammierer auf Gottes Erdboden überhaupt. Ein paar gute Köpfe 
sind schon dabei, aber der überwiegende Anteil der Entwickler ist 
bestenfalls unterer Durchschnitt.

von Falk B. (falk)


Lesenswert?

@  Karl Heinz Buchegger (kbuchegg) (Moderator)

>Und zum Thema Mikrosoft:
>Meine persönliche Meinung - das ist der größte Haufen
>Amateurprogrammierer auf Gottes Erdboden überhaupt. Ein paar gute Köpfe
>sind schon dabei, aber der überwiegende Anteil der Entwickler ist
>bestenfalls unterer Durchschnitt.

Hmm, keine Ahnung. Aber rein praktisch gesehen kann es gar nicht anders 
sein. In einem Laden dieser Größe KÖNNEN niemals nur Elite-Leute sitzen. 
Rein statistisch nicht machbar. Wichtig ist wie immer, dass an den 
kritischen Positionen TOP-Leute sitzen und gute Konzepte erarbeiten bzw. 
deren Umsetzung überwachen. Die "Drecksarbeit" kann auch der 
Durchschnitt dann erledigen. Ist keine Abwertung, nur nüchterne 
Betrachtung der Realität. Die Masse ist nicht zum Nobelpreisträger 
geboren, ich auch nicht ;-)

Es gab mal hir im Forum einen Link auf ein Video einer Präsentation von 
so einem Softwerker, bissel korpulent. Ging um Extreme Programming etc. 
Fand ich richtig gut, wenn gleich an einigen Stellen schon sehr 
selbsbewusst ;-)
Finde ich leider nicht mehr.

MfG
Falk

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Sowas kriegt man nur in den Griff, wenn man von vorne herein bei der
> Implementierung schon rigoros vorgeht. Jedes Subsystem durchläuft Tests
> ehe es zum Einsatz kommt.

Subsystem ? Wie soll das funktionieren ?

Subsysteme habe ich erst wenn die Idee steht. Ist die schon Murks
kann ich mir die Subsysteme sowieso schenken (an der Idee scheitern
doch schon die meisten). Programmieren ist eine Bauchsache, die
Idee kommt aus dem Gefühl - in den seltensten Fällen aus der Logik.
Ich habe da schon einigen gestandenen Informatikern mal die Klemmen
zeigen müssen in die sie sich manövriert hatten.

Die technische Umsetzung ist das Einfachste.

Bis auf meine 8080, 6502 und AVR-Sachen habe ich jetzt noch nicht
soviel Erfahrungen mit Mikrocontrollern, ich kann aber aus dem Gefühl
heraus ungefähr abschätzen was ich brauche und wie ich an das Problem
herangehe.

Aber noch BEVOR ich auch nur einen Programmteil schreibe.

Da hat man im Lauf der Zeit dann (für sich selbst) gelernt wie man
das halbwegs unfallfrei hinbekommt.

<bash>Informatiker: A5 - Zettel Millimeterpapier und dann links oben mit
einem H5-Bleisift eine Miniatur hinkrakeln. Die können nicht mal
mit Papier umgehen. Mann nimmt min A3 und einen fetten Stift ...
und fängt in der Mitte an</bash>

Ich plädiere für top-down ;)

von Falk B. (falk)


Lesenswert?

@  Joachim Drechsel (Firma: JDCC) (scheppertreiber)

>Subsystem ? Wie soll das funktionieren ?

So wie es die Profis machen (die ihren Namen verdienen).

>Subsysteme habe ich erst wenn die Idee steht.

Ja und? Das sollte AM ANFANG sein!

> Ist die schon Murks
>kann ich mir die Subsysteme sowieso schenken

Welch Erkenntnis!

>(an der Idee scheitern doch schon die meisten).

Nö, "nur" an der Umsetzung.

>Programmieren ist eine Bauchsache, die
>Idee kommt aus dem Gefühl - in den seltensten Fällen aus der Logik.

???
Reden wir über das Gleiche? Programmieren von Sequentiellen, finiten 
Algorithmen? Mit Bauchsache hat das sehr wenig zu tun, bestenfalls 
ERFAHRUNG, Wissen und ein Schuß Intuition.

>Ich habe da schon einigen gestandenen Informatikern mal die Klemmen
>zeigen müssen in die sie sich manövriert hatten.

Du Held.

>Die technische Umsetzung ist das Einfachste.

;-)

Maulheld. Papier ist geduldig, Forumstexte erst recht.

>Bis auf meine 8080, 6502 und AVR-Sachen habe ich jetzt noch nicht
>soviel Erfahrungen mit Mikrocontrollern, ich kann aber aus dem Gefühl
>heraus ungefähr abschätzen was ich brauche und wie ich an das Problem
>herangehe.

>Aber noch BEVOR ich auch nur einen Programmteil schreibe.

Logisch. Jeder der die "Sturm und Drang" Zeit hinter sich hat, macht 
das.

>Da hat man im Lauf der Zeit dann (für sich selbst) gelernt wie man
>das halbwegs unfallfrei hinbekommt.

Einige lernen es nie wirklich.

MfG
Falk

von Anja (Gast)


Lesenswert?

Sebastian B. schrieb:
> ich habe ein Programm geschrieben welches mittlerweile recht groß
> geworden ist.

Was Du als einsamer Held ganz allein?
Wer hat Dein Design und Deinen Code gereviewt und freigegeben?
Welcher (unabhängige) Tester hat das getestet?

Du glaubst gar nicht wie schnell ein anderer Bediener Dein Gerät zum 
Absturz bringen kann wenn da nicht alles sauber designed und codiert 
ist.

Gruß Anja

von Stefan W. (wswbln)


Lesenswert?

Hübsch, wie sich der Thread entwickelt hat.

Aber ich möchte nochmal zum ersten Beitrag zurückkommen. Auch wenn sich 
alle gleich auf mögliche Software-Fehler eingeschossen haben 
(Erfahrungssache?? ;-) ), möchte ich unbesehen Designschwächen der 
Hardware nicht ganz ausschließen.

Sebastian B. schrieb:
> Mit dem Controller werden ein paar Pumpen und Ventile, über ein LCD mit
> Menu, geschaltet. Doch irgendwann nach einer großen Zeitspanne hängt
> sich der Controller auf und schaltet alles aus und auf dem Display
> werden Nur Hyroglyphen angezeigt. in den Letzten 12 Monaten ist das 3
> Mal passiert :(

Pumpen und Ventile schalten klingt für mich nach Relais oder 
elektronische Schalter und induktive Lasten. Damit kann man auch viel 
Spass haben!

Gibt es vielleicht noch ein paar mehr Infos zum Design und Aufbau?
Woraus wird das Ganze versorgt? Was hängt noch am selben Netz? Wie sehen 
die Filterschaltungen an Versorgung, Ein- und Ausgängen aus? Haben die 
Schalter Snubber (Funkenlöschglieder)?

von holger (Gast)


Lesenswert?

>Du glaubst gar nicht wie schnell ein anderer Bediener Dein Gerät zum
>Absturz bringen kann wenn da nicht alles sauber designed und codiert
>ist.

Korrekt. Der Entwickler bedient das Gerät immer richtig.
Man muss den DAU (Dümmsten anzunehmenden User) auf das
Gerät loslassen. Der darf gar nicht wissen wie man es bedient.
Einfach nur Tasten drücken lassen wie ein Wahnsinniger.

>Aber ich möchte nochmal zum ersten Beitrag zurückkommen. Auch wenn sich
>alle gleich auf mögliche Software-Fehler eingeschossen haben
>(Erfahrungssache?? ;-) ), möchte ich unbesehen Designschwächen der
>Hardware nicht ganz ausschließen.

Kann man im Moment halt nicht sagen was da passiert ist.
Display abgefault könnte ESD sein. Controller abgeschmiert
auch ESD, aber möglicherweise auch irgendwo ein Stackoverflow.
Oder irgendein Zähler läuft nach drei Monaten über. Den dann als
Index für ein Array und bumm. Wirkt sich mit hoher Wahrscheinlichkeit
auch auf die Displayausgabe aus.

von Anja (Gast)


Lesenswert?

holger schrieb:
> Kann man im Moment halt nicht sagen was da passiert ist.
> Display abgefault könnte ESD sein.

Es ist ja nicht nur das Display sondern auch die Lasten sind 
ausgeschaltet.
-> das ganze klingt für mich wie Brown out mit für Display und Prozessor 
unterschiedlichen Schaltschwellen bzw. unterschiedlichem Timing.

Gruß Anja

von Fabian (Gast)


Lesenswert?

Handelt es sich um ein 8 Bit Prozessor?
Solche Fehler sind dann typisch, wenn Variablen > 8 Bit also (u)int16 
oder (u)int32 im Hauptprogramm und in einem Interupt verwendet werden. 
Und zwar dann, wenn man mit dem Wert im Hauptprogramm arbeitet - ohne 
vorher den entsprechenden IRQ zu sperren. Man muss sich nämlich im 
klaren sein, dass es sich um einen 8bit Prozessor handelt und 16 oder 
32bit Operationen mehrere Zyklen brauchen, die durch den IRQ 
unterbrochen werden könnten.
Dies tritt dann aber meist sehr selten auf und das macht es so 
schwierig.

Beispiel:

x= 0x2FFF

wird dieser Wert in der Hauptschleife inkrementiert, so geschieht dies 
in zwei Schritten:

x=0x2F00
x=0x3000

wird dies durch den IRQ zwischendurch unterbrochen, so ist x im 
Interrupt 0x2F00. Also einen Wert, den man nicht erwarten würde.

von Falk B. (falk)


Lesenswert?

Ich hatte mal den Fall, dass ein LCD ala HD44780 partou bei einem 
Relaisschaltereignis das Licht ausging. Der angeschlossene AVR lief 
problemlos. Filtern und schirmen zeigten keine Wirkung. Was tun? Ich hab 
es sekündlich neu initialisiert, fällt nicht auf, man überschreibt ja 
alles. Aber der hinweis ist schon richtig, es kann die Hardware mit EMV 
Problemen sein. Also einfach mal die Relais deutlich öfter schalten 
lassen. Vielleicht erwischt man den Fehler dann nach Minuten oder 
Stunden, anstatt Monaten.

MFG
Falk

von Falk B. (falk)


Lesenswert?

@  Fabian (Gast)

>Solche Fehler sind dann typisch, wenn Variablen > 8 Bit also (u)int16
>oder (u)int32 im Hauptprogramm und in einem Interupt verwendet werden.

Hatten wir schon mehrfach erwähnt. Ist auch im Link erklärt.

Beitrag "Re: Controller hängt sich nach sehr langer Zeit auf Ursache?"

von Fabian (Gast)


Lesenswert?

Falk Brunner schrieb:
> Hatten wir schon mehrfach erwähnt. Ist auch im Link erklärt.

Sorry, hatte ich übersehen

von Klaus (Gast)


Lesenswert?

@Sebastian

Gibt es einen Systemzustand, bei dem man schadlos absichtlich den 
Watchdog auslösen kann? Das System sollte sich dadurch wieder einfangen, 
der "Monatstimer" auf Null gesetzt werden.

Das gibt einem die Zeit, nach dem wirklichen Problem zu forschen.

MfG Klaus

von holger (Gast)


Lesenswert?

>Es ist ja nicht nur das Display sondern auch die Lasten sind
>ausgeschaltet.
>-> das ganze klingt für mich wie Brown out mit für Display und Prozessor
>unterschiedlichen Schaltschwellen bzw. unterschiedlichem Timing.

Sagen wir einfach mal die Schaltung hat keine ESD Probleme.
Ist schon relativ wahrscheinlich weil sie drei Monate
durchläuft. Da stell ich mir jetzt einfach einen langsamen
Zähler vor der einmal am Tag hochgezählt wird. Jetzt
kommt der Zähler an einen Punkt wo er einen zulässigen Wert
überschreitet und die Software fängt das nicht ab. Dann
läuft evtl. ein Pointer Amok im RAM und alle beschriebenen
Symptome können auftreten.

von Stefan W. (wswbln)


Lesenswert?

holger schrieb:
> Kann man im Moment halt nicht sagen was da passiert ist.

...weshalb ich ja auch nach mehr Details fragte. Aber die muss wohl eher 
der OP bringen...

von Marvin M. (Gast)


Lesenswert?

Hallo,

mal ne Frage: Ist das LCD ein Standard-LCD, das per 4-Bit Modus 
angesteuert wird?
Theorie: Beim 4-Bit Modus könnte es passieren, dass die Synchronität 
verloren geht und dann irgendwann Low/High-Nibble vertauscht sind.
Das könnte die Hieroglyphen erklären und dass das Gerät noch auf 
Tastendruck reagiert. Ursache könnte ein knappes Timing sein - oder auch 
ein Interrupt, der einen nicht-atomaren Zugriff unterbricht.
Hast du noch Fotos von den Hieroglyphen? Evtl. kann man anhand der 
Code-Tabelle nachvollziehen, ob diese Theorie zutreffen könnte.

von Sebastian B. (sebastian86)


Lesenswert?

Guten Morgen,

So nun habe ich auch wieder Internet und ich Versuche mal mehr Licht ins 
Dunkle zu bringen. Schonmal vorab vielen Dank für die ganzen Antworten 
und Lösungsvorschläge.

Kurze Beschreibung: Über zwei Pumpen(3-phasig) und Ventile(24VDC) soll 
in einem Kasten ein Hochvakuum gepumpt werden.

Softwarebeschreibung: Die Pumpen und Ventile sind so veriegelt das man 
keine doofen Zustände erreicht werden können ;). Desweiteren, die Pumpen 
sind Wassergekühlt - Sollte das Kühlwasser ausfallen, dann erkennt es 
der µC und schaltet die Pumpen ab und solche Dinge.

Ich benutze 2 Timer einen Timer um Tasten einzulesen und einen um 
diverse Zustände (Kühlwasser, Stellungen der Ventile etc. einzulesen) 
und LED anzuzeigen.

zum Hardware Aufbau: Es gibt einen Zentralen Trafo 24V / 80A aus diesem 
erzeuge ich mir mit einem DCDC Wandler meine 5V für den µC die Ventile 
Schalte ich über eine Doppelte galvanische Trennung (Optopkoppler und 
einem Relais zum durchschalten der 24V zum Relais)
Die Pumpen schalte ich über ein Schütz an welches ebenfalls über einen 
Optopkoppler und einem Relais geschaltet wird.


Zu den Fehlermöglichkeiten:

Brown Out: Dieser ist auf 2,7 Volt gesetzt - ich habe aber mal 
probeweise die Versorgungsspannung so runtergedreht das ich bei ca. 2,4V 
bin. Der µC arbeitet problemlos weiter nur das Display ist nicht mehr 
lesbar -> da zu wenig Spannung. Wenn ich die Spannung aber wieder 
hochdrehe kann man das Display auch wieder ablesen. Also man sieht keine 
Störung. Erst wenn ich unter 2,0 Volt komme scheint der µC sich zu 
resetten, weil wenn dann die spannungwieder hochgedreht wird dann sieht 
man das der µC Controller gerade neugestartet hat den ich kann in einem 
Menupunkt die momentane Programmlaufzeit sehen.


Wie ich oben schon geschrieben habe - das ich 2 Timer benutze - Gibt es 
einen Blöden Fall ich hantiere im Timer 1 mit einem 32 bit wert für die 
Programmlaufzeit - was passert wenn während dessen der andere Timer auch 
einen Interrupt auslöst? Stören die sich eventuell gegenseitig? Ein 
Timer läuft mit 10ms (Taster) und einer mit ca. 150ms (Einlesen der 
Zustände, Programmlaufzeit, Uhr und sowas)


Ich schicke das erstmal ab sonst ist das soviel Text.

von (prx) A. K. (prx)


Lesenswert?

Sebastian B. schrieb:

> Wie ich oben schon geschrieben habe - das ich 2 Timer benutze - Gibt es
> einen Blöden Fall ich hantiere im Timer 1 mit einem 32 bit wert für die
> Programmlaufzeit

Dieser unverständlich der Satz.

Wenn du auf mögliche gleichzeitige Interrupts anspielst: Die werden ggf. 
nacheinander ausgeführt. Sowas gibt nur Ärger, wenn man - wie manche 
Leute gerne aber falsch tun - in ISRs längere Warteschleifen 
einprogrammiert.

von Krapao (Gast)


Lesenswert?

> Brown Out: Dieser ist auf 2,7 Volt gesetzt - ich habe aber mal
> probeweise die Versorgungsspannung so runtergedreht das ich bei ca. 2,4V
> bin. Der µC arbeitet problemlos weiter

Wie kann das sein bzw. macht dich das nicht stutzig? Hast du vielleicht 
nur den Level gesetzt (BODLEVEL) und vergessen den Brownout zu enablen 
(BODEN)?

von Falk B. (falk)


Lesenswert?

@Sebastian B. (sebastian86)

>Kurze Beschreibung: Über zwei Pumpen(3-phasig) und Ventile(24VDC) soll
>in einem Kasten ein Hochvakuum gepumpt werden.

Klingt eher einfach.

>Ich benutze 2 Timer einen Timer um Tasten einzulesen und einen um
>diverse Zustände (Kühlwasser, Stellungen der Ventile etc. einzulesen)
>und LED anzuzeigen.

Klingt eher Overkill.

>zum Hardware Aufbau: Es gibt einen Zentralen Trafo 24V / 80A aus diesem

80A? Sauber!

>erzeuge ich mir mit einem DCDC Wandler meine 5V für den µC die Ventile
>Schalte ich über eine Doppelte galvanische Trennung (Optopkoppler und
>einem Relais zum durchschalten der 24V zum Relais)

Käse. Die Relais reichen. Und die Störungen kommen am Ende sowieso 
anders in den uC als du denkst. Snubber an den Relaiskontakten?

>Die Pumpen schalte ich über ein Schütz an welches ebenfalls über einen
>Optopkoppler und einem Relais geschaltet wird.

>Brown Out: Dieser ist auf 2,7 Volt gesetzt - ich habe aber mal
>probeweise die Versorgungsspannung so runtergedreht das ich bei ca. 2,4V
>bin. Der µC arbeitet problemlos weiter nur das Display ist nicht mehr

Dann ist der brown out nicht aktiv.

>Wie ich oben schon geschrieben habe - das ich 2 Timer benutze - Gibt es
>einen Blöden Fall ich hantiere im Timer 1 mit einem 32 bit wert für die
>Programmlaufzeit - was passert wenn während dessen der andere Timer auch
>einen Interrupt auslöst?

Wenn man es richtig macht, gar nichts.

>Stören die sich eventuell gegenseitig? Ein
>Timer läuft mit 10ms (Taster) und einer mit ca. 150ms (Einlesen der
>Zustände, Programmlaufzeit, Uhr und sowas)

Gähn, der arme Mikrocontroller langweilt sich zu tode. Das kann man 
spielend mit einem Timer machen, der halt mit 10ms läuft. Dann verringet 
sich auch die Gefahr von Race Conditions.

MFG
Falk

von Sebastian B. (sebastian86)


Lesenswert?

Mit dem BOD Sorry da habe ich mich falsch ausgedrückt bzw was vergessen. 
WENN! der Brown Out aktiviert ist und die Schwelle auf 2,7V gesetzt ist 
dann reagiert dieser natürlich. Aber da ich mir da nicht so sicher war 
und ich einfach wissen wollte wie weit die Spannung zusammen brechen 
darf habe den BO einfach mal deaktiviert und die Spannung runter 
gedreht. so sind diese Werte entstanden. Der Brown Out funktioniert also 
korrekt.


Zu den Timern:
Dort habe ich keine Warteschleifen Programmiert.
der 10ms Timer braucht laut Simulation 7,33µs für einen Durchlauf und 
der ~150ms Timer braucht 72µs.




@ Falk.

Trafo Jo 80A sind 2 Redundante Systeme 2 Trafos á 80A sollte einer 
Ausfallen kommt sofort der nächste zum tragen "ohne" verlust der 
Versorgungspannung

Ja an den Relais sind Snubber verbaut.

Natürlich es ist keine Hochkomplexe Aufgabe. Es muss nur auf ein paar 
Zustände geachtet werden und dann darf erst geschaltet werden.
Es gibt einen Manuellen Modus (Alles muss von Hand bedient werden) und 
einen Automatik - Modus -> Der Pumpstand versucht eigenständig ein 
Hochvakuum hinzubekommen und alles läuft automatisch ab bzw ist es auch 
Möglich das der Pumpstand Automatisch kontrolliert vom Hochvakuum wieder 
auf Atmosphäre-Druck kommt

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.