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
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. ...
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
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
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
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
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.
Ok danke, werde den Quelltext mir noch mal genauer anschauen. Gruß Lutz
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.