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


von rfg (Gast)


Angehängte Dateien:

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

von Dieter (Gast)


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

von Stefan B. (stefan) Benutzerseite


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 :-)

von rfg (Gast)


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

von Stefan B. (stefan) Benutzerseite


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.

von Stefan B. (stefan) Benutzerseite


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 :-)

von rfg (Gast)


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?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Antwort und Frage haben sich überschnitten.

von rfg (Gast)


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?

von Stefan B. (stefan) Benutzerseite


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.

von rfg (Gast)


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.

von Stefan B. (stefan) Benutzerseite


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.

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.