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
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
> 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 :-)
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
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.
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 :-)
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?
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.