Forum: Mikrocontroller und Digitale Elektronik Sleep Modus und Pin-Change Interrupt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von M. H. (bambel2)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe folgendes Problem:

Ich setze einen Atmega88 in den Power-Down Modus. Im Datenblatt steht, 
dass er aus diesem mit einem Pin Change Interrupt aufwachen kann. das 
funktioniert leider nicht. Den Interrupt hab ich getestet. Der 
funktioniert.

Nachdem es im Powerdown nicht funktioniert hat, dachte ich mir ich machs 
mal mit dem Idle Modus. Selbes Problem. Der Atmega wacht nicht auf.

Das ist die Initialisierung des Sleepmodus
1
;ldi r16, (1<<SM1)
2
ldi r16, 0
3
out SMCR, r16
Und so aktiviere ich den Sleepmodus:
1
lds r16, SMCR
2
ori r16, (1<<SE)
3
out SMCR, r16
4
sleep

Ich hab da noch ne Frage:
Ich habe in diesem Code anstatt out zuerst sts verwendet und es hat 
nicht funktioniert. Warum funktioniert sts bei diesem Register nicht?


M.H.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Bewertung
0 lesenswert
nicht lesenswert
M. H. schrieb:
> Im Datenblatt steht,
> dass er aus diesem mit einem Pin Change Interrupt aufwachen kann.

Nein, das steht da nicht. Wen  du dir Fussnote 3 durchliest, geht 
Aufwachen bis auf Idle nur mit INT0 und INT1 mit Level Interrupt.
PinChange-Wakeup geht nur, wenn die I/O Clock aktiv ist - und das ist 
sie nur im Idle. Im Powerdown, PowerSave und ADC Noise Redu. Modus ist 
diese Clock inaktiv, deswegen gehen keine flankengetriggerten 
Interrupts.
SMCR befindet sich auf Adresse 0x33 und wird deswegen mit OUT 
angesprochen.

Wenn es in Idle auch nicht geht, ist vermutlich der Interrupt irgendwo 
nicht freigegeben. PCMSKn, PCIE und globale Freigabe müssen alle 
beschrieben werden.

: Bearbeitet durch User
von M. H. (bambel2)


Bewertung
0 lesenswert
nicht lesenswert
Er ist freigegeben. Wenn ich den Sleep Befehl rausnehme springt er in 
die ISR. Der Interrupt funktioniert

von adenin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Matthias Sch. schrieb:
>SMCR befindet sich auf Adresse 0x33 und wird deswegen mit OUT
>angesprochen.

M. H. schrieb:
>lds r16, SMCR

SMCR sollte hier mit IN angesprochen werden.

Nunja, lds und sts gehen immmer (auch für Register :) ), aber die 
Adressierung ist anders und das sollte nicht durcheinander gewürfelt 
werden.

von M. H. (bambel2)


Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist ja, dass sts nicht funktioniert. Wenn ich sts benutze, 
geht der chip nicht in den Sleepmodus. Sobald ich aber sts mit out 
tausche geht alles bis auf das aufwachen

: Bearbeitet durch User
von M. H. (bambel2)


Bewertung
0 lesenswert
nicht lesenswert
Sorry das mit sts und out hat sich geklärt. ich muss da ja noch die $20 
draufaddieren.

Es bleibt aber das Problem, dass der uC nicht aufwacht.

: Bearbeitet durch User
von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
Matthias Sch. schrieb:
> M. H. schrieb:
>> Im Datenblatt steht,
>> dass er aus diesem mit einem Pin Change Interrupt aufwachen kann.
>
> Nein, das steht da nicht. Wen  du dir Fussnote 3 durchliest, geht
> Aufwachen bis auf Idle nur mit INT0 und INT1 mit Level Interrupt.
> PinChange-Wakeup geht nur, wenn die I/O Clock aktiv ist - und das ist
> sie nur im Idle. Im Powerdown, PowerSave und ADC Noise Redu. Modus ist
> diese Clock inaktiv, deswegen gehen keine flankengetriggerten
> Interrupts.
> SMCR befindet sich auf Adresse 0x33 und wird deswegen mit OUT
> angesprochen.
>
> Wenn es in Idle auch nicht geht, ist vermutlich der Interrupt irgendwo
> nicht freigegeben. PCMSKn, PCIE und globale Freigabe müssen alle
> beschrieben werden.

Kompletter Unsinn. Pinchange weckt den Controller aus jedem Sleepmode 
auf. Und das steht auch genau so im Datenblatt.

mfg.

von M. H. (bambel2)


Bewertung
0 lesenswert
nicht lesenswert
Thomas Eckmann schrieb:
> Kompletter Unsinn. Pinchange weckt den Controller aus jedem Sleepmode
> auf. Und das steht auch genau so im Datenblatt.

Richtig. Habe gerade das angehängte Programm getestet. Es funktioniert 
mit Power Down Mode und Pin change interrupt. Nur in meinem anderen 
Programm wacht er nicht auf...

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
M. H. schrieb:
> Thomas Eckmann schrieb:
>> Kompletter Unsinn. Pinchange weckt den Controller aus jedem Sleepmode
>> auf. Und das steht auch genau so im Datenblatt.
>
> Richtig. Habe gerade das angehängte Programm getestet. Es funktioniert
> mit Power Down Mode und Pin change interrupt. Nur in meinem anderen
> Programm wacht er nicht auf...

Was macht denn dein anderes Programm?
Ist der Pin richtig konfiguriert? Maske, Pullup usw.
Ist die richtige ISR vorhanden?
Sind die Interrupts global freigegeben?

mfg.

von M. H. (bambel2)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe das Problem gefunden. Ich habe einen Befehl falsch verwendet.


Ich danke aber allen für die Hilfe.

Also ist jetzt auch geklärt, ob der Power-down Modus mit dem Pin-Change 
funktioniert: JA!

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
M. H. schrieb:
> Ich habe das Problem gefunden. Ich habe einen Befehl falsch verwendet.
>
>
> Ich danke aber allen für die Hilfe.
>
> Also ist jetzt auch geklärt, ob der Power-down Modus mit dem Pin-Change
> funktioniert: JA!

das ist geklärt seit es Pinchange gibt.

mfg.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Bewertung
0 lesenswert
nicht lesenswert
Thomas Eckmann schrieb:
> Kompletter Unsinn. Pinchange weckt den Controller aus jedem Sleepmode
> auf. Und das steht auch genau so im Datenblatt.

Jaja, jetzt habe ich die Stelle auch gefunden. Ich frage mich nur, warum 
Atmel diese verwirrende Fussnote drin hat, die Einschränkung gilt also 
wirklich nur für INT0 und INT1 flankengetriggert.

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
Matthias Sch. schrieb:
> Thomas Eckmann schrieb:
>> Kompletter Unsinn. Pinchange weckt den Controller aus jedem Sleepmode
>> auf. Und das steht auch genau so im Datenblatt.
>
> Jaja, jetzt habe ich die Stelle auch gefunden. Ich frage mich nur, warum
> Atmel diese verwirrende Fussnote drin hat, die Einschränkung gilt also
> wirklich nur für INT0 und INT1 flankengetriggert.

So verwirrend ist das auch nicht.
>> 3. For INT1 and INT0, only level interrupt.

Du hast nur falsch verstanden:
>> 3. Only for INT1 and INT0, only level interrupt.

Shit happens.

mfg.

: Bearbeitet durch User

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]
  • [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.