Sleep Modus und Pin-Change Interrupt

Gast #3469990
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.
(Firma: matzetronics) #3470035
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.
Gast #3470058
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.
Gast #3470062
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
#3470099
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.
Gast #3470102
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...
#3470118
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.
Gast #3470119
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!
#3470133
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.