www.mikrocontroller.net

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


Autor: Alexander Niessen (Gast)
Datum:

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

Autor: Alexander Niessen (Gast)
Datum:

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

Autor: Quark (Gast)
Datum:

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

Autor: Quark (Gast)
Datum:

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

Autor: Alexander Niessen (Gast)
Datum:

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

Autor: Quark (Gast)
Datum:

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

Autor: Alexander Niessen (Gast)
Datum:

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

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.