Forum: Mikrocontroller und Digitale Elektronik Hilfe beim Sleep-Mode


von Danni (Gast)


Angehängte Dateien:

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ß

von B.Schuster (Gast)


Lesenswert?

Moin

du initierst deinen interrupt nachdem du den controller schlafen 
geschickt hast.
Nutze doch die function sleep_mode() und set_sleep_mode() im 
avr/sleep.h. dort wird SE einen befehl vor sleep gesetzt und gleich nach 
dem aufwachen wieder gelöscht.
Und interrupts zu begin deines programms initieren.

Tschüss

von Willi W. (williwacker)


Lesenswert?

Anderer Ansatz,

ich hatte ein Butterfly, das ebenfalls mit diesem Sleep-Mode gearbeitet 
hat. Der Controller schien teilweise wirklich sehr verschlafen zu sein, 
so dass man die entsprechende Taste ziemlich lange drücken musste. Wie 
lange genau, weiß ich nicht mehr, aber mit einem "normalen" Klick war es 
nicht getan.

Ciao
Willi Wacker

von Johannes M. (johnny-m)


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.

von Danni (Gast)


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ß


von Danni (Gast)


Lesenswert?

An welcher Stelle sollte das Interrupt-Flag gelöscht werden?

von Johannes M. (johnny-m)


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.

von Danni (Gast)


Lesenswert?

Wenn ich das Flag lösche, klappt gar nichts mehr.

Und wie meinst du das mit ner While(1) Schleife? Versteh ich nicht.

von Johannes M. (johnny-m)


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.

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.