Mein AVR nimmt mich auf den Arm - Was ist los mit dem ADC?

OP #2135169
Lesenswert?

Hallo zusammen,

Ich hab ein ominöses Problem und komm nicht auf den Fehler ...

Ich hab eine Funktion geschrieben die den MEGA168 runterfährt wenn die 
Batteryspannung kritisch wird. Siehe unten.

Es gibt z.B. eine 3V Schwelle, funktioniert super: bei Unterschreiten 
wird Berieb eingestellt.

Auch z.B. die 3,6V Schwelle funktioniert super.

Jetzt gibt es aber auch eine 6,0V Schwelle. Hier wirds komisch:
Anstatt dass der uC abschaltet, hängt er sich auf und wiederholt das 
Blinken einer LED die das "Runterfahren" anzeigt unendlich lange.
Da hilft nur ein kompletter Neustart.
AB JETZT tritt das Problem aber NIE MEHR auf - ab jetzt wird bei 
Unterschreiten auch sofort runtergefahen. Nur das erste Mal hängt er 
sich auf - und schützt so natürlich nicht die batterie. So und jetzt?? 
Hab alles mögliche probiert.

Ich messe Spannungen von 3 bis 10V und versorge den uC und ADC mit 3V.

Hier der Code. Woran kann es liegen??
1
void guard(void)
2
{
3
   if(supplyLevel_ui < voltageLevel_ui[0])
4
   {
5
      shutDown();
6
   }
7
}

1
void shutDown(void)
2
{
3
   cli();
4

5
   // Watchdog abschalten um autom. Reset (=Neustart) zu vermeiden
6
   wdt_disable();
7

8
   clearLEDs();
9

10
   //Info LED
11
   infoShutdown();    
12

13
   //Herunterfahren
14
   set_sleep_mode(SLEEP_MODE_PWR_DOWN);
15
   sleep_enable();
16
   sleep_cpu();              
17
}

Hat vielleicht jemand eine Idee? Ich verzweifle ^^
OP #2135245
Lesenswert?

Genau. Hier kann es auch kein Problem geben, funktioniert an sich.
Nur dass es sich eben beim ERSTEN Unterschreiten der 6V Schwelle 
aufhängt.

Nimmt man übrigens wenn es sich aufgehängt hat die Spannung wieder über 
die Schwelle (am Netzteil) startet der uC neu. Was bedeutet dass der 
Interrupt zum einlesen der Spannung noch funktionieren muss - obwohl zu 
demn Zeitpunkt über cli schon die Interrupts deaktiviert wurden... ?

Wie kann sich ein so simpler code so aufhängen?
OP #2135538
Lesenswert?

@Peter: Danke! Schalte ich den Watchdog gar nicht erst ein, tritt es 
nicht mehr auf. So, aber woran kann es liegen, wie Ihr oben seht, 
schalte ich den eigentlich kurz vorm runtefahren auch aus!?!
Jetzt mache ich den Watchdog disable noch früher schon beim 
SPannungsmessen, bringt aber nix das Problem tritt wieder auf. Und den 
Watchdog jetzt einfach ganz raus lassen möchte ich eig nicht...


@Gast: Der arbeitet ja nur mit dem uC vorgegeben Schwellen. Ich reagiere 
auf verschiedene Batterietypen!
#2136436
Lesenswert?

Daniel B. schrieb:
> @Peter: Danke! Schalte ich den Watchdog gar nicht erst ein, tritt es
> nicht mehr auf.

Dann wird also irgendwo vorher der Watchdog ansprechen. Und dann kannst 
Du ihn nicht eher disablen, bis das WDRF Bit gelöscht ist.

Datenblatt S.53:

"• Bit 3 - WDE: Watchdog System Reset Enable
WDE is overridden by WDRF in MCUSR. This means that WDE is always set 
when WDRF is
set. To clear WDE, WDRF must be cleared first. This feature ensures 
multiple resets during conditions
causing failure, and a safe start-up after the failure."


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren