mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sleep beim Attiny2313 und erwacht nimmer mehr


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank an alle die immer gern mit Rat und Tat versuchen zu helfen.

Im Anhang ist mein Code mit dem ich mich momentan schon sehr viel 
abgemüht habe. Habe viele Beiträge zum Sleepmode gelesen aber nichts hat 
mich bisher entscheidend weitergebracht.

Solange der Sleep-Befehl deaktiviert war wurde INT0 oder INT1 ausgelöst 
und er ging zurück in die Endlosschleife. Im nächsten Schritt wollte ich 
durch den Sleep (PowerDown) testen wie sich die Stromaufnahme verändert 
bzw. ob dies so funktioniert. Leider erwacht der Attiny daraus nicht 
mehr.

In den ganzen Beiträgen gesucht ob bzw. wie der generelle Ablauf beim 
Sleepmodus sein soll. Die Lösung war leider nicht dabei.

Also wende ich mich verzweifelt an euch, es lässt mir keine Ruhe wo mein 
Denkfehler ist.

Vielen Dank für eure Hilfe!!!

Gruß
RFG

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Bin jetzt nicht so der ASM Freund, aber ich denke, das du aus dem 
Powerdown nur mit einem Low Level Int kommst.

Du mußt also bevor du in den Sleep gehst, den Int neu konfigurieren auf 
Low Level.

Und beim aufwachen wieder ändern, auf deine Flanke.

MFG
Dieter

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> durch den Sleep (PowerDown) testen
>   ldi   temp, 0b01111010      ;(1<<ISC01) | (1<<ISC11) | (1<<ISC00) | (1<<ISC10) 
| (1 << SE) | (1 << SM0)| (1 << SM1); INT0 und INT1 auf fallende Flanke 
konfigurieren; sleep aktivieren

Das ergibt kein PowerDown Sleepmode sondern Standby.

INT0 weckt nur mit Level Interrupt auf. Das ist aber nicht eingestellt, 
sondern Flanke.

Am INT0 Pin sollte dann ein Pullup aktiviert sein, um den Ruhezustand zu 
garantieren. Habe ich in den Bitmustern nicht kontrolliert.

BTW. Warum schreibst du Bitmuster im Code und symbolische Namen in den 
Kommentaren? Das ist doch pervers :-)

Autor: rfg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann es kauum glauben das ich das übersehen habe. Vielen Dank! Es 
hat soweit funktioniert.

Letzte Frage: Warum springt er nicht in meine Interruptroutine sondern 
bleibt in der Endlosschleife? Da bin ich wohl noch nicht tief genug 
drin.

Gruß
RFG

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Endlosschleife?

Beim Stellen des Weckers (INT0 scharf machen) würde ich unbedingt noch 
die Interruptflags löschen bevor das sei gemacht wird. Ohne kann es 
passieren, dass der sleep ganz kurz (sei Instruktion unmittelbar vor 
sleep Instruktion) oder ganz lang (Instruktionen zwischen sei und sleep) 
ist.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BTW.

Du musst sowieso aufpassen mit deiner Programmlogik:

       Wecker stellen (INT0 enable + sei)
loop:
       Pennen legen (sleep)
       Duselig aufwachen
       LEDs klimpern
       zu loop springen

Mit Wecker (INT0 ISR):
       Den Wecker töten (cli)
       Bei Aufwachen weitermachen

Die erste Nacht geht das noch gut, die nächste Nacht verpennst du den 
Morgen, weil der Wecker nicht kräht :-)

Autor: rfg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Schleife "Loop" in der der sleep-Befehl ist.

Im Debugger springt er in die Interuptroutine und dann die Schleife 
bearbeitet, auf dem Steckbrett wird nur die Schleife ausgeführt und 
wieder in den sleepmoduus zurück. Hängt das auch an den Flags?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Antwort und Frage haben sich überschnitten.

Autor: rfg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das klappt nicht so wie ich mir das vorstelle. Ich kappier einfach 
nicht warum der sleepmodus verlassen wird durch auslösen des externen 
Interrupts, daann aber nicht meine Interruptroutine gestartet wird. Wie 
kann ich so unterscheiden welcher Interrupt ausgelöst wurde?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Sleepmodus wird verlassen (nach dem sleep gehts weiter...), wenn 
eine der ISRs abgearbeitet wurde.

[Zitat]
If an enabled interrupt occurs while the MCU is in a sleep mode, the MCU 
wakes up. The MCU is then halted for four cycles in addition to the 
start-up time, it executes the interrupt routine, and resumes execution 
from the instruction following SLEEP.
[/Zitat]

Die ISR werden ab dann nicht mehr ausgeführt, weil die ISRs Interrupts 
global sperren (cli) und die Sperre vor dem nächsten sleep nicht 
mehr aufgehoben wird.

Hast du die anderen Probleme schon behoben? Ich würde mich mal auf nur 
einen IRQ z.B. INT0 konzentrieren.

Autor: rfg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das bedeutet es ist egal an welchem INT0 oder INT1 der Interrupt 
ausgleöst wird, es kann im späteren Verlauf nicht mehr nachvollzogen 
werden ob es nun INT0 oder INT1 war der den MCU aufgeweckt hat.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest in den ISRs spezifische Werte in eine Variable schreiben 
z.B. Bit0 in der ISR für INT0 und Bit1 in der ISR von INT1. Nach dem 
Aufwachen hinter sleep prüfst du die Variable und setzt sie fürs nächste 
Mal wieder auf 0. Damit hast du den Aufwach-IRQ.

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.