Forum: Mikrocontroller und Digitale Elektronik Aufwecken aus sleep mode tiny 2313


von T. Scholz (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag, ich bekomme meinen Tiny 2313 nicht mit einen externen 
interrupt
aus den IDLE oder Power Down sleep mode aufgeweckt.
Programm funktioniert ungefähr so: Timer0  läuft, wo nach ca. 10 sec der 
exteren interrupt int0 frei gegeben wird, der Timer0 ausgeschalten wird 
und der sleep mode aktiviert wird. Leider kann ich den Tiny dann nicht 
dazu bringen, durch den externen interrupt aufzuwachen und in dessen 
Interruptschleife zu springen und weiterzuarbeiten. Der sleep mode soll 
nach dem ext. Interrupt nicht mehr auftreten.
Bedanke mich im vornweg für Hilfe.

von 6641 (Gast)


Lesenswert?

Ja, das geht so nicht. Du kann nicht das Interrut enable im Interrupt 
betaetigen. Das ist weg, wenn der interrupt verlassen wird. Mach das im 
main.

interrupt timer0
{
 ..
 timer0came=1;
}

main
{
  loop
 {
   if timer0 came==1
   {
    enable_Ext_Int
    ..
   }
  ..
 {
}

von Falk B. (falk)


Lesenswert?

@ T. Scholz (Gast)

>aus den IDLE oder Power Down sleep mode aufgeweckt.

Sleep Mode

>Programm funktioniert ungefähr so: Timer0  läuft, wo nach ca. 10 sec der
>exteren interrupt int0 frei gegeben wird, der Timer0 ausgeschalten wird
>und der sleep mode aktiviert wird. Leider kann ich den Tiny dann nicht
>dazu bringen, durch den externen interrupt aufzuwachen und in dessen
>Interruptschleife zu springen und weiterzuarbeiten. Der sleep mode soll
>nach dem ext. Interrupt nicht mehr auftreten.

Deine Initialisierung ist schlecht. Erst ALLES initialisieren, DANN 
sei()!
Für den Sleep Mode gibt es fertige Routinen, nutzte die.
Ausserdem kann es kritisch sein, wenn ein Sleep Mode in einem Interrupt 
eingeschaltet wird. Das sollte besser in der Hauptschleife erfolgen.

MFG
Falk

von Hannes L. (hannes)


Lesenswert?

> Ausserdem kann es kritisch sein, wenn ein Sleep Mode in einem Interrupt
> eingeschaltet wird. Das sollte besser in der Hauptschleife erfolgen.

Hmmm... - Das Umschalten (Voreinstellen) des Sleep-Mode in der ISR ist 
kein Problem. Das Aufrufen des Sleep sollte natürlich in der Mainloop 
erfolgen.

So kann ein externer Low-Level-Interrupt den AVR aus dem "Tiefschlaf 
wecken", in dessen ISR wird der Sleep-Mode auf Idle umgeschaltet und der 
ext-Int deaktiviert. Nun laufen die Timer und der AVR kann ganz normal 
seine Arbeit machen, wie Tasten entprellen und darauf reagieren und nach 
jeder Mainloop-Runde bis zum nächsten (Timer-)Int. in den (Idle-)Sleep 
geschickt werden. Wird der AVR nicht mehr bedient (Time-out einbauen), 
wird lediglich der ext. Low-Level-Interrupt aktiviert und der Sleep-Mode 
auf "Power Down" umgeschaltet. Die Mainloop schickt ihn dann in den 
Sleep, worauf die Timer stehen bleiben.

...

von T. Scholz (Gast)


Lesenswert?

Vielen vielen Dank, mit einfachen integrierens in die Hauptschleife 
funktioniert es.

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.