Hilfe beim Sleep-Mode

Gast #567057
Lesenswert?

Guten Morgen,

ich versuche den Sleep-Mode beim Atmega88 als Ein- und Ausschalter eines 
Handsenders zu zu verwenden. Nach dem Start des Programms geht der AVR 
direkt in den Sleep-Mode. Durch einen Low-Level Interrupt(Taste) wird 
der Controller aus diesem Sleep-Mode aufgeweckt. Wird diese Taste im 
laufenden Programm für ca. 4 Sekunden gedrückt, soll der Controller 
wieder schalfen gehen.

Funktionieren tut es soweit schon ganz gut, jedoch wacht der Controller 
ab und zu mal nicht aus dem Sleep_Mode auf oder bleibt irgendwie hängen.

Hab den Code mal angehängt!

Gruß
Angehängte Dateien:
#567074
Lesenswert?

Besser vor der Freigabe des Interrupts das Interrupt-Flag löschen. Wenn 
das noch gesetzt ist (was ja durchaus sein kann, weil der Interrupt ja 
vorher gesperrt war), dann wird die ISR schon vor dem sleep aufgerufen 
und der Interrupt wieder deaktiviert. Und dann gibts kein Erwachen 
mehr...

Und es gibt überhaupt keinen Grund dafür, in diesem Programm "goto" zu 
verwenden! goto sollte in C nur dann verwendet werden, wenn es mit 
anderen Mitteln nicht geht. Und ich behaupte, dass es in diesem Falle 
definitiv anders geht.
Gast #567208
Lesenswert?

Danke für die Antworten!

>>Und es gibt überhaupt keinen Grund dafür, in diesem Programm "goto" zu
>>verwenden! goto sollte in C nur dann verwendet werden, wenn es mit
>>anderen Mitteln nicht geht. Und ich behaupte, dass es in diesem Falle
>>definitiv anders geht.

Ich benutze es auch nur ungerne. Wäre super, wenn du mir einen Tip geben 
könntest, wie es ohne "goto" funktioniert.

Gruß

#567376
Lesenswert?

Danni wrote:
> An welcher Stelle sollte das Interrupt-Flag gelöscht werden?
Vor der Freigabe des Interrupts in der sleep_mode_init() (also vor dem 
"EIMSK |= (1 << INT1);").

> Wäre super, wenn du mir einen Tip geben
> könntest, wie es ohne "goto" funktioniert.
Mit ner while(1)-Schleife. Das ganze Ding wird eh immer wieder 
durchlaufen.
#567408
Lesenswert?

Danni wrote:
> Wenn ich das Flag lösche, klappt gar nichts mehr.
Öhh, ich hoffe Du löschst wirklich das Flag und nicht das 
Enable-Bit...

EDIT: Da müsste also ein
1
EIFR = 1 << INTF1;
hin.

> Und wie meinst du das mit ner While(1) Schleife? Versteh ich nicht.
Die while(1)-Schleife, die Du in dem Programm drin hast, ist an der 
Stelle völlig unsinnig, da sie sowieso nach einmaligem Durchlaufen durch 
das goto abgebrochen wird (vorausgesetzt, ich habe mich mit den Klammern 
nicht verzählt; bitte formatiere Deinen Code mal so, dass nach jeder 
öffnenden Klammer eine Einrückung kommt und dass man sofort erkennt, 
welche Klammern zusammengehören...). Schreib anstelle von "start:" ein 
"while(1)" und den ganzen Block dahinter bis zu der schließenden Klammer 
hinter dem "goto start" in Klammern. Das "goto start" weg und das ganze 
sollte funktionieren.

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