Forum: Mikrocontroller und Digitale Elektronik Erwachen aus dem idle Mode mit Attiny24


von minipilot (Gast)


Lesenswert?

Hallo!

Habe ein Problem mit dem idle-Mode bei einem ATtiny24. Ich kann den 
Modus auswählen und den µc auch schlafen legen. Mit dem timero wecke ich 
ihn nach einem überlauf auch wieder auf. Das Problem ist nur, das 
Programm startet wie nach einem Reset (in der Simulation wie auch in der 
Hardware). Ich verwende in einem anderen Abschnitt den Power-Down mode 
den ich mit einem externen Interrupt wieder beende. Dieser startet wiede 
an der stelle, nach dem ich den µC schlafen gelegt habe.

Warum führt der Idle mode einen art Reset anch dem erwachen aus?

Danke für eure Hilfe

Gruß Lutz

von Hannes L. (hannes)


Lesenswert?

Ich verwende den (ASM-) Befehl SLEEP immer am Ende der Mainloop. Im 
Normalfall ist der Sleepmode IDLE vorgewählt.

Muss ich in Power-Down, dann initialisiere ich den Aufweck-Interrupt, 
stelle den Sleep-Mode auf Power-Down um und lasse das Programm 
weiterlaufen, irgendwann hat es die Mainloop fertig und geht in 
Power-Down-Sleep.

In der Weck-ISR schalte ich den Sleepmode wieder auf IDLE zurück und 
deaktiviere den Weck-Interrupt. Der Controller arbeitet die Mainloop ab 
und fällt in den IDLE-Sleep, worauf die Timer weiter werkeln und 
Interrupts auslösen können.

Dies klappt bei ziemlich allen AVRs, im Tiny24 habe ich allerdings noch 
keinen Tiefschlaf gebraucht, es also noch nicht ausprobiert. Mir fällt 
aber kein Grund ein, warum es nicht funktionieren sollte.

...

von Peter D. (peda)


Lesenswert?

Setze mal nen BADISR-Handler auf.


Peter

von minipilot (Gast)


Lesenswert?

Nach dem aufwecken aus dem Idle Mode fängt mein Programm auch wiede in 
der main schleife an. Jedoch befindet sich in der main eine while(1) in 
der auch der µC in den Idel-Mode geschickt wird. Jedoch nach dem 
Aufwecken fängt er wieder in der main an.
Im Tiefschlaf funktioniert alles wie es soll. nach dem Wecken läuft er 
da weiter, wo er eingeschalfen ist.

Peter:
Kannst du mit das mit dem BADISR-Handler besser erklären, ich finde 
darüber nicht (google, forum).

Gruß Lutz

von Peter D. (peda)


Lesenswert?

minipilot wrote:
> Kannst du mit das mit dem BADISR-Handler besser erklären, ich finde
> darüber nicht (google, forum).

In der WINAVR-Doku:

Catch-all interrupt vector If an unexpected interrupt occurs (interrupt 
is enabled and no handler is installed, which usually indicates a bug), 
then the default action is to reset the device by jumping to the reset 
vector. You can override this by supplying a function named BADISR_vect 
which should be defined with ISR() as such. (The name BADISR_vect is 
actually an alias for __vector_default. The latter must be used inside 
assembly code in case <avr/interrupt.h> is not included.)
1
#include <avr/interrupt.h>
2
ISR(BADISR_vect)
3
{
4
// user code here
5
}


Peter

von minipilot (Gast)


Lesenswert?

Danke Peter, er springt in die
1
ISR(BADISR_vect)
. Kannst Du mir auch erklären was ich bei dem aufwachen aus dem 
Idle-Mode falsch mache. Denn normal sollte nach dem Überlauf von Timer0 
in
1
ISR(TIM1_OVF_vect)
 springen?

Gruß Lutz

von Peter D. (peda)


Lesenswert?

minipilot wrote:
> Danke Peter, er springt in die
1
ISR(BADISR_vect)
. Kannst Du mir
> auch erklären was ich bei dem aufwachen aus dem Idle-Mode falsch mache.


Schau in Deinen Quelltext. Du hast irgendeinen Interrupt enabled, zu dem 
Du keinen Handler geschrieben hast.


Peter

von Johannes M. (johnny-m)


Lesenswert?

minipilot wrote:
> Denn normal sollte nach dem Überlauf von Timer0 in
>
1
ISR(TIM1_OVF_vect)
> springen?
Nö, eher in die TIM0_OVF_vect (*), meinste nicht?

(*) Vorausgesetzt, der heißt tatsächlich so. Schau in der libc-Doku, wie 
der Vektor für den Tiny24 heißen muss.

von minipilot (Gast)


Lesenswert?

Ok danke, werde den Quelltext mir noch mal genauer anschauen.

Gruß Lutz

von minipilot (Gast)


Lesenswert?

schon gefunden, ich lasse den Timer0 laufen und versuche mit
1
ISR(TIM1_OVF_vect)
 von Timer1 (der nicht mal aktiviert ist) den Übelauf zu dedektieren.

Danke an alle die geholfen haben.

Gruß Lutz

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.