www.mikrocontroller.net

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


Autor: minipilot (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setze mal nen BADISR-Handler auf.


Peter

Autor: minipilot (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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.)
#include <avr/interrupt.h>
ISR(BADISR_vect)
{
// user code here
}


Peter

Autor: minipilot (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Peter, er springt in die
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
ISR(TIM1_OVF_vect)
 springen?

Gruß Lutz

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
minipilot wrote:
> Danke Peter, er springt in die
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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
minipilot wrote:
> Denn normal sollte nach dem Überlauf von Timer0 in
>
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.

Autor: minipilot (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok danke, werde den Quelltext mir noch mal genauer anschauen.

Gruß Lutz

Autor: minipilot (Gast)
Datum:

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

Danke an alle die geholfen haben.

Gruß Lutz

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.