mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe beim Sleep-Mode


Autor: Danni (Gast)
Datum:
Angehängte Dateien:

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

Autor: B.Schuster (Gast)
Datum:

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

Autor: Willi Wacker (williwacker)
Datum:

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

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

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

Autor: Danni (Gast)
Datum:

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


Autor: Danni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An welcher Stelle sollte das Interrupt-Flag gelöscht werden?

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

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

Autor: Danni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das Flag lösche, klappt gar nichts mehr.

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

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

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

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.