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ß
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
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
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.
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ß
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.
Wenn ich das Flag lösche, klappt gar nichts mehr. Und wie meinst du das mit ner While(1) Schleife? Versteh ich nicht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.