Forum: Mikrocontroller und Digitale Elektronik Frage: AT90S2313 und Sleep-Mode


von Alexander Niessen (Gast)


Lesenswert?

Hallo allerseits,
folgendes Problem beschäftigt mich seit gestern Abend:
In AVR-Studio (4.09) funktioniert das Programm wie gewünscht.
Wird es auf den uC übertragen, fällt dieser sofort in den Sleep-Mode
und lässt sich über INT0 nicht mehr aufwecken.
Woran könnte das liegen ?

-----------------<< CODEANFANG >>-----------------
;******************************************************************
;*                                                                *
;* Beschreibung:                                                  *
;*                                                                *
;* Programm zur Demonstration des 'Power-Down'-Modus              *
;*                                                                *
;* Direkt nach dem Power-On-Reset fällt der 2313 in den Sleep-Mode*
;* Betätigen von T1 bewirkt ein 'aufwachen'                       *
;* Betätigen von T2 -> wieder in Sleep-Mode fallen                *
;*                                                                *
;* Hardware:                                                      *
;*                                                                *
;* T1  - PD2 (INT0), aufwachen                                   *
;* T2  - PD3 (INT1), schlafen                                    *
;* Die Taster werden über Pull-Down-Widerstände (5k) angeschlossen*
;*                                                                *
;* AT90S2313 @ 4MHz an 5V                                         *
;* Die Stromaufnahme wird mit Hilfe eines Multimeters kontrolliert*
;*                                                                *
;* Keine sonstige Hardware ist angeschlossen (Programmer, LEDs, ..*
;*                                                                *
;******************************************************************
;*                                                                *
;* Autor:   Alexander Nießen                                      *
;* Datum:   18.06.2004                                            *
;*                                                                *
;******************************************************************
;
.include "2313def.inc"

.def temp1 = r16

;------------------------------------------------------------------
.cseg
            ; Resetvektoren initialisieren
            rjmp reset
            rjmp ext_int0
            rjmp ext_int1
;------------------------------------------------------------------
ext_int0:   ldi temp1, 0b00001111       ; SM nicht zugelassen
            out MCUCR, temp1
            reti
;------------------------------------------------------------------
ext_int1:   ldi temp1, 0b00111111       ; SM zulassen
            out MCUCR, temp1
            reti
;------------------------------------------------------------------
reset:
            ldi temp1, LOW(RAMEND)      ; Stackpointer init.
            out SPL, temp1

            ; beide Ports als Ausgang definieren
            ldi temp1, 0b11111111
            out DDRB, temp1
            out DDRD, temp1

            ldi temp1, 0b11000000
            out GIMSK, temp1            ; INT0 und INT1 Enable

            ldi temp1, 0b00111111       ; SE, SMode, ISC
            out MCUCR, temp1

            sei                         ; IRQs freigeben

loop:       sleep                       ; schlafen gehen ?!
            rjmp loop
;------------------------------------------------------------------
------------------<< CODEENDE >>------------------

Grüße,
Alex

von Alexander Niessen (Gast)


Lesenswert?

Hat keiner eine Idee woran das liegen koennte ?

Egal - Ich habe mir beholfen, indem ich den Controller über den Reset
wieder ins Leben zurückrufe.

Grüße,
Alex

von Quark (Gast)


Lesenswert?

Hallo Alex,
mal scauen was ich hier lernen kann.
Verstehe ich das richtig? Schaltest Du beide Ports auf Ausgang, obwohl
Du INT0 (PD2) und INT1 (PD3) als Eingänge brauchst?

Gruß
Quark

von Quark (Gast)


Lesenswert?

Hallo Alex,
nochmal eine (hofentlich nicht zu Dumme) Frage.
Im 2313 Manual auf Seite 25 steht doch, das die INT-Eingänge Low Aktiv
sind, habe jetzt nicht Deine MCUCR Einstellungen nachgeschaut, ob Du
auf Flanke "Interruptst".
Da wären die Taster mit Pull-Down Rs doch fehl am Platze, oder?
Gruß
Quark

P.S. "mal scauen was ich hier lernen kann." und "nochmal eine
(hofentlich nicht zu Dumme) Frage."
könnten Dir und anderen ironisch oder so vorkommen, dem ist aber nicht
so, bin selber Anfänger und weiß es auch noch nicht so richtig. Morgen
teste ich es mal.

von Alexander Niessen (Gast)


Lesenswert?

Hallo Quark.
Die Interrupts sind auf Rising Edge eingestellt.
Das funktioniert ganz gut so, obwohl beide Datenrichtungsregister auf
Ausgang stehen.
... und weil ich nicht verstehe wieso der MC nicht aufwacht habe ich in
der Interrupt Service Routine für INT0 mal zum 'debuggen' eine LED
eingeschaltet und mit INT1 ausgeschaltet (Natürlich ohne Sleep Mode.
Wollte nur sehen, ob die Interrupts richtig funktionieren.)
Das ging ...
Nur das mit dem aufwecken über INT funktioniert nicht.
Naja - war eh' nur, um den Stromverbrauch im normalen Modus und im
Sleep Modus zu verifizieren.
In der Schaltung, die ich gerade für meine Frau bastel, wird der MC
über einen normalen Reset aus dem Tiefschlaf geholt. Ist halt
Batteriebetrieben. Da kam ich um den SM diesmal net drumherum ;)

Grüße,
Alex

von Quark (Gast)


Lesenswert?

--- interessiert das überhaupt noch jemanden?? --- g

Hallo Alex,

wollte es ja "Morgen" testen, hatte aber leider keine Zeit.
Es ist wohl so, das es zwei Sleep-Modes gibt. Aus dem
"Power-Down"-Mode kann nur ein Level-Interrupt die mcu aufwecken
(MCUCR = 0b00111100).
Wenn man den "Idle"-Mode nimmt (Bit4 = 0, im MCUCR),
geht es auch mit dem "edge"-interrupt (MCUCR = 0b00101111)
(Seite 25-27) .
Habe dazu mit hilfe Timer0 ein LED blinken lassen, und den
Timer int. zugelassen wenn kein "Sleep enabled" war, und
gesperrt wenn "Sleep enabeld" war.

Danke für Deine Frage, habe durch das Testen was gelernt!

Gruß
Quark

von Alexander Niessen (Gast)


Lesenswert?

Sicher interessiert das noch g

Ich hab' auch nochwas hinzugelernt:
Keinen 7805 in Batteriebetriebenen Geräten einzusetzen. Dieser
verursacht einen dauernden Strom von knapp 3mA :-O

Grüße,
Alex

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.