Forum: Mikrocontroller und Digitale Elektronik Ausfall des Mikrocontrollers


von Tom (Gast)


Lesenswert?

Hallo,

vllt. hat jemand von euch eine Ahnung?

Mein avr-Mikrocontroller (Atmega32) fällt nach einer unbestimmten Zeit 
aus und startet anschließend wieder am Anfang des Programms? Woran kann 
es liegen?

Gruß
Tom

von David M. (md2k7)


Lesenswert?

Hallo!

Ein paar typische Maßnahmen, die sowas beseitigen:

- Resetbeschaltung: externer Pull-up Widerstand ca. 10k und möglichst 
einen Keramikkondensator gegen Masse zur Unterdrückung von Störungen

- Stromversorgung: sollte irgendwie stabilisiert sein, also Elkos + 
Spannungsregler; und (sehr wichtig): möglichst nahe dem Controller ein 
100 nF-Kerko an die Versorgung

- Programmfehler: kann man hier allgemein nicht viel sagen, ohne dass du 
weitere Infos postest. Bei C wird z.B. von nicht verwendeten 
Interruptvektoren standardmäßig an die Adresse 0 gesprungen.

Gruß
David

von Dennis (Gast)


Lesenswert?

Ergänzend zu Stromversorgung:
Wenn Motoren oder sonstige größere Lasten geschaltet werden kann das die 
Stromversorgung stark beeinträchtigen.

von Tom (Gast)


Lesenswert?

Hallo David,

bzgl. deines letzten Punktes mit dem Interrupt. Ich habe zwei Timer 
Interrupts und ein ADU Interrupt. Wie kann ich prinzipell das mit dem 
Interrupt an Adresse 0 verhindern?

von Benedikt K. (benedikt)


Lesenswert?

Wenn mit einem Quarz >10MHz betrieben: CKOPT nicht gesetzt ?

von Tom (Gast)


Lesenswert?

Nein, ich habe nur den internen Takt von 4 MHz eingestellt

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe euch mal meinen Code mit bei geheftet.

Es muss irgend was mit dem TIMER1 zutun haben. Wenn ich ihn 
auskommentiere, dann bleibt der Controller immer im richtigen Zustand 
und resettet sich nicht!!!

von David M. (md2k7)


Lesenswert?

Hallo,

nicht implementierte Interrupts kann man mit
1
ISR(__vector_default) {
2
  //...
3
}

abfangen. Dann landen eben alle (vom Controller angesprungenen) 
Interrupts, die im Code nicht verwendet werden, in dieser Routine. Ist 
aber eher theoretischer Natur, man sollte natürlich keine Interrupts 
aktivieren die man nicht braucht.

Gruß

von David M. (md2k7)


Lesenswert?

Hallo nochmal,

was mir so spontan auffällt (sonst recht umfangreicher Code, eventuell 
wäre der Übersichtlichkeit halber das Aufteilen auf mehrere c-Dateien 
angebracht):

- keine eindeutige Schreibweise, z.B. bei den Interruptroutinen 
Deklarationen. Da stehen teilweise Leerzeichen vor der schließenden 
Klammer. Ich weiß nicht, wie aktuell oder ob die Information aktuell 
ist, aber laut Roboternetz macht der avr-gcc hierbei nicht, was er soll:
http://www.roboternetz.de/wissen/index.php/Avr-gcc#Interrupts
angeblich müsste man dann zB exakt die Schreibweise ISR(SIG_ADC) 
verwenden.

- du rufst loescheFensterBits() in einer Interruptroutine auf. Dabei 
sind global die Interrupts deaktiviert. loescheFensterBits() blockt 
dabei eventuell so lange, wie der Delay VERZUGSZEIT ist. Hierbei kann 
der Controller weder seine Arbeit fortsetzen noch auf andere Interrupts 
reagieren.

- F_CPU sollte idealerweise vor dem Inkludieren der anderen 
Headerdateien definiert werden.

von Tim (Gast)


Lesenswert?

Macht der µC einen Reset oder springt er nur zur addr0?

Im 1. Fall kannst du das MCUCSR auslesen und den Grund
für den Reset rausbekommen.

von Falk B. (falk)


Lesenswert?

Stacküberlauf?

von Tom (Gast)


Lesenswert?

Ich habe leider keine andere Möglichkeit, außer mit dem ISP, auf den µC 
zu zugreifen. Daher kann ich den MCUCSR nicht auslesen. Aber im meinem 
Display kann ich sehen, dass es wieder auf den Anfangszustand zurück 
springt!

von µluxx .. (uluxx) Benutzerseite


Lesenswert?

nein, du musst natürlich per software beim start des uC das Flag lesen 
und testen was der Grund war und dann entsprechend 
ausgeben/verarbeiten...

von Tom (Gast)


Lesenswert?

Ich habe es mal gestestet und herausgefunden, dass alles zurückgesetzt 
wird (alle Variablen die gesetzt waren sind auf ihre standardwerte 
zurückgesetzt wurden)!

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>Ich habe leider keine andere Möglichkeit, außer mit dem ISP, auf den µC
>zu zugreifen. Daher kann ich den MCUCSR nicht auslesen.

Wieso denn das nicht? Natürlich kannst Du das MCUSCR auslesen, auswerten 
(auf das Display schreiben) und danach alle Flags im MCUSCR wieder auf 
"0" schreiben, damit Du den nächsten RESET-Grund herausfinden kannst.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>Ich habe es mal gestestet und herausgefunden, dass alles zurückgesetzt
>wird (alle Variablen die gesetzt waren sind auf ihre standardwerte
>zurückgesetzt wurden)!

Das passiert unter "C" sowohl bei einem echten RESET, als auch bei einem 
"Durchlauf" durch den Flash, welcher von einem Stackoverflow oder einer 
unsauber beendeten Routine ausgelöst werden kann.

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.