Forum: Mikrocontroller und Digitale Elektronik ATmega: Ursache für Aufhängen


von Mark U. (residuum)


Lesenswert?

Eine kleine Schaltung mit dem ATmega hängt sich immer wieder auf. Jetzt 
bin ich auf der Suche nach möglichen Ursachen, um das zu beheben.

Zur Schaltung:
Ein ATmega88 (4MHz) liest alle paar Sekunden einen Schalter ein 
(Leitungslänge ~30cm). Der zugehörige Pin hat einen externen Pull-up 
(100k) und Kondensator (100n).
Wenn sich der Zustand des Schalters ändert (Polling, kein Interrupt), 
wird das Ereignis über SPI einem Funkmodul übergeben.
Der Reset-Pin hat einen externen Pull-up (10k) und einen Kondensator 
(100n).
Die Spannungsversorgung erfolgt über eine Batterie, und beträgt minimal 
2,4V (bei maximaler Belastung mit uC und aktivem Funkmodul), also weit 
über den geforderten 1,8V (Atmega88 bei 4MHz).

Das ganze wurde mit mehreren (4) Platinen getestet, die sich alle so 
verhalten. Schlechte Lötstellen, die alle den gleichen Fehler 
produzieren, sind also unwahrscheinlich. Sicherheitshalber wurden bei 
einer Platine alle Lötstellen nochmal nachgelötet.

Die Schaltung läuft mehrere Tage bis sie nicht mehr reagiert. Nach einem 
Reset (Pin manuell kurz auf Low) geht das wieder einige Tage gut bis der 
gleiche Zustand wieder auftritt. Es wurden einige Pins zur Ausgabe des 
aktuellen Zustands verwendet, um anzuzeigen, wo sich der Controller 
aufhängt. Es ist aber kein Muster erkennbar.
Mögliche unerwartete Resets werden über das Statusregister ausgewertet 
und ausgegeben. Bisher traten jedoch keine auf. Auch wurde ein 
BADISR_vect eingefügt, der aber auch noch nie auftrat.
Außerdem ist der Brown-out Detector aktiv, auch das hat noch nicht zu 
einem Reset geführt.

Daneben wäre die Annahme, das der Controller nach einem zufälligen Reset 
sauber weiter laufen müsste, wie er das nach einem manuellen Reset auch 
tut. Die Aufhänger fallen jedoch nicht in diese Kategorie.

Es wird kein dynamischer Speicher verwendet, auch keine Rekursionen oder 
dergleichen, was zu einem Speicherproblem führen könnte.

Es wurde schon versucht, durch EMV Einkopplung (schaltender Schütz) den 
Controller aus dem Tritt zu bringen, ohne Erfolg.

Natürlich könnte ich jetzt einen Watchdog mitlaufen lassen, der das 
Problem aber nur verschleiern würde.

Was könnten also weitere Ursachen für die Aufänger sein?
Danke schon mal.

von Mathias B. (mbr)


Lesenswert?

Hallo,

wie immer bitte mal den Schaltplan posten.
Die Ursache kann an der Schaltung, aber auch an der Software liegen. 
Kommen bei der SPI Datenweiterleitung while - Schleifen vor, die kann 
man dann mit einem Timeout versehen, oder aber wie Du schreibst einen 
Watchdog verwenden.

von Ulrich F. (Gast)


Lesenswert?

Markus E. schrieb:
> Die Schaltung läuft mehrere Tage bis sie nicht mehr reagiert.

Meine Glaskugel sagt:
Da läuft ein Zählvariable über, und du handelst das nicht richtig ab.

von Falk B. (falk)


Lesenswert?

@ Markus E. (residuum)

>Ein ATmega88 (4MHz) liest alle paar Sekunden einen Schalter ein
>(Leitungslänge ~30cm). Der zugehörige Pin hat einen externen Pull-up
>(100k) und Kondensator (100n).

Der Pull-Up ist recht hochohmig und der Kondensator hat dort DIREKT 
nichts zu suchen, denn der wird vom Schalter hart kurzgeschlossen!
Da sollte man immer einen Längswiderstand nutzen, dann ist auch der 
RC-Tiefpass voll wirksam.

Etwa so!

https://www.mikrocontroller.net/articles/Entprellung#Einfacher_Taster

>Der Reset-Pin hat einen externen Pull-up (10k) und einen Kondensator
>(100n).

OK.

>Die Schaltung läuft mehrere Tage bis sie nicht mehr reagiert.

Aha.

>Was könnten also weitere Ursachen für die Aufänger sein?

Poste deinen Code als Anhang. Ein Schaltplan sowie ein Bild des realen 
Aufbaus wären auch hilfreich. Bitte die Bildformate beachten.

von Karl M. (Gast)


Lesenswert?

Hallo Markus E. ,

nimm mal ein Handfunkgerät mit 5Watt im 2m Band ~145MHz und du wirst 
sehr schnell feststellen können, das es der Tasteraufbau sein wird.

von Falk B. (falk)


Lesenswert?

Ein Handy (mit 2W) reicht schon.

von Mark U. (residuum)


Lesenswert?

In den while-Schleifen blieb der uC bisher definitiv nicht hängen, das 
wäre an den Debug-Pins zu sehen gewesen.
Den Kondensator am Schalter entferne ich mal.
Und dann nehme ich auch nochmal ein Handy her.

Schaltplan und Code kann ich leider nicht veröffentlichen, auch wenn's 
hilfreich wäre.

von Ulrich F. (Gast)


Lesenswert?

Markus E. schrieb:
> Schaltplan und Code kann ich leider nicht veröffentlichen, auch wenn's
> hilfreich wäre.

OK.....

Dann bleibt nur der Yin Weg:
Wir können über das Problem reden...
Manchmal ändert sich das Problem, während man darüber redet.
Und manchmal ändert sich die Sicht auf das Problem.
(was beides irgendwie aufs gleiche hinaus läuft)

Alternativ, die Yang Variante:
Problem erkennen
Lösung erarbeiten
Lösung durchsetzen

von Peter D. (peda)


Lesenswert?

Schaltplan, Layout, Programm.

Es versuchen zwar immer viele wie Du, aber ich kenne kein 
funktionierendes Exportfilter Schematic -> Prosa, bzw. *.c -> Prosa.

SCH -> PDF, PCB -> PDF, *.c,*.h als *.c,*.h, zippen und ab damit.

SCH geht auch als Handzeichnung und PCB als Foto.
Fotos natürlich nicht wie das verwackelte Selfie einer 3-jährigen.

von Joachim B. (jar)


Lesenswert?

Markus E. schrieb:
> Schaltplan und Code kann ich leider nicht veröffentlichen

wer oder was hindert dich?

brauchst du Hilfe beim upload?

von Peter D. (peda)


Lesenswert?

Markus E. schrieb:
> Schaltplan und Code kann ich leider nicht veröffentlichen, auch wenn's
> hilfreich wäre.

Es wäre überhaupt erstmal ein Ansatz.

Ich gehe ja auch immer ohne Fernseher zur Werkstatt, erzähle dem 
Mechaniker was vom Pferd und er gibt mir dann das richtige Ersatzteil 
mit.
Letztens wars R42, eingelötet und er geht wieder.

von Mark U. (residuum)


Lesenswert?

Abgesehen davon, dass der Code ~3000 Zeilen umfasst, die sich kaum 
jemand im Detail durchsehen wird, darf ich keine IP veröffentlichen.

Ich hatte gehofft, dass jemand ähnliche Erfahrungen gemacht hat und 
evtl. sogar eine Lösung gefunden hat, die auch für das beschriebene 
Problem passt.

Es gibt ja einige bekannte Fehlerquellen, die immer wieder Probleme 
bereiten. Vielleicht hat da jemand auch eine Checkliste.

Was ich vergaß zu erwähnen ist, dass der Aufhänger zwar meist nach 
einigen Tagen passiert, es aber auch schon wenige Minuten nach 
Einschalten bzw. Reset auftrat.

von Ulrich F. (Gast)


Lesenswert?

Markus E. schrieb:
> Ich hatte gehofft, dass jemand ähnliche Erfahrungen gemacht hat und
> evtl. sogar eine Lösung gefunden hat, die auch für das beschriebene
> Problem passt.

Wurden doch schon genannt:
1. Störeinstrahlung
2. Überläufe

Versorgungsprobleme zähle ich mal zu 1 und Heap/Stack Kollisionen zu 2.


Und dann gibts ja noch Millionen von verschiedensten Böcken, welche du 
da geschossen haben könntest.

Es wird dir nichts anderes übrig bleiben, als den Fehler einzugrenzen. 
Helfen können wir dir dabei nicht.

von Philipp K. (philipp_k59)


Lesenswert?

Abstürze sind bei mir meistens Ram, Zaehler und zu kleine arrays..

Vielleicht ist es auch ein problem in einer Schleife das unendlich 
landet...

von Joachim B. (jar)


Lesenswert?

Markus E. schrieb:
> Ich hatte gehofft, dass jemand ähnliche Erfahrungen gemacht hat

ja diese Erfahrungen finden sich hier zu Hauf:

vergessene Abblock Kondis, freihängende Resets, unsaubere Versorgung, 
fehlerhafter Code, unsaubere Lötstellen, fehlerhaftes Layout, wilde 
Verdrahtung, klappriges Steckbrett, EMV verseuchte Umgebung,

das wäre der Ansatz wo du schauen könntest. :-)

PS
Markus E. schrieb:
> darf ich keine IP veröffentlichen.

an einer IP ist hier niemand interessiert,

Markus E. schrieb:
> Schaltplan und Code kann ich leider nicht veröffentlichen,

zwischen kann und darf erkennst du einen Unterschied?

: Bearbeitet durch User
von Mark U. (residuum)


Lesenswert?

Besten Dank für eure Ideen dazu.
Ich werde denen nachgehen und bei Erfolg hier die Ursache beschreiben.

von Falk B. (falk)


Lesenswert?

@ Markus E. (residuum)

>Was ich vergaß zu erwähnen ist, dass der Aufhänger zwar meist nach
>einigen Tagen passiert, es aber auch schon wenige Minuten nach
>Einschalten bzw. Reset auftrat.

Eine nicht ganz unwesentliche Information. Sowas kann ein Zugriffsfehler 
auf Variablen sein, welche im Hauptprogramm und im Interrupt benutzt 
werden, siehe Interrupt. Der Zugriff muss volatile und atomar sein.

von foo (Gast)


Lesenswert?

Markus E. schrieb:
> Abgesehen davon, dass der Code ~3000 Zeilen umfasst, die sich kaum
> jemand im Detail durchsehen wird

Unabhängig davon ob du darfst oder nicht... es ist deutlich leichter, in 
3000 vollständigen Codezeilen die relevanten Stellen und damit den 
Fehler zu finden... als auf Auszüge davon zu starren, raten zu müssen 
wie das Programm drumrum aussieht und wie die Auszüge aufgerufen werden, 
und am Ende steckt der Fehler in einem ganz anderen Teil vom Programm.

von Peter D. (peda)


Lesenswert?

Markus E. schrieb:
> Abgesehen davon, dass der Code ~3000 Zeilen umfasst

3000 Zeilen nur für ne Tasterabfrage, das ist aber heftig.

Eine Methode SW-Fehler zu finden ist, den Code soweit abzuspecken, daß 
der Fehler gerade nicht mehr auftritt und dann anzuschauen, was man 
zuletzt entfernt hatte.

Man kann auch umgekehrt vorgehen. Alles bis auf das notwendigste 
minimieren und dann schrittweise weitere Teile wieder hinzufügen.
Falls dann schon das Minimalprogramm den Fehler enthält, ist die Suche 
wesentlich einfacher. Auch steigt dann die Chance, daß es ein 
Schaltungs- oder Layoutfehler ist.

von Karl H. (kbuchegg)


Lesenswert?

Falk B. schrieb:

> Eine nicht ganz unwesentliche Information. Sowas kann ein Zugriffsfehler
> auf Variablen sein, welche im Hauptprogramm und im Interrupt benutzt
> werden, siehe Interrupt. Der Zugriff muss volatile und atomar sein.

...auch nicht initialisierte Variablen können zu ähnlichen Sympthomen 
führen. Speziell wenn es sich um Zähler handelt, die irgendwann mal 
überlaufen.

von fredred (Gast)


Lesenswert?

Hallo Makus,

in der Annahne es ist kein Softwarefehler. Kann es auch an der 
Spannungsversorgung des Atmega88 liegen.
2,4 Volt mit Takt 4MHz sollte noch OK sein. Aber, Aber ein sehr kleiner 
Einbruch der Spannung ist fatal(1,8 Volt und 4MHz ist der Grenzwert)
Einfach mal den µC eine externe Spannung z.B. 3,3 Volt können oder den 
Takt auf 1MHz einstellen.

Mit freundlichen Grüßen
fredred

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus E. schrieb:
> In den while-Schleifen blieb der uC bisher definitiv nicht hängen, das
> wäre an den Debug-Pins zu sehen gewesen.
Wo dann?
Konkret ist es so, dass ein uC nicht "nichts tut", sondern er tut 
irgendetwas mit maximaler Rechenleistung. Jetzt musst du herausfinden, 
was das ist. Und dann, wie er dorthin gekommen ist.

Ganz gern ist auch ein ungeprüfter Pointer, der verstümmelt über eine 
Schnittstelle gekommen ist, die Fehlerquelle. Oder ein verpasstes 
Ende-Zeichen.

Meist sind solche Fehler einfach "Naivitätsfehler" frei nach den Motto: 
"Die Daten, die da kommen, sind sicherlich korrekt."

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.