ATTiny: SLEEP_MODE_PWR_DOWN - wo geht es weiter?

Gast #2565893
Lesenswert?

Wenn ich einen ATtiny (hier Tiny25) in den Power-Down Mode schicke und 
ihn z.B. über den INT0 wieder aufwecke, dann geht es wohl direkt nach 
dem Sleep-Statement wieder weiter. Soweit OK.
Anfangs hatte ich vergessen, die ISR für INT0 zu installieren und dann 
wird wohl eine Reset durchführt, also wieder vorne angefangen.

Meine Frage: ist dies zufällig so und eigentlich ein Seiteneffekt oder 
kann/darf man das auch gezielt nutzen?
Gast #2565905
Lesenswert?

HildeK schrieb:
> hatte ich vergessen, die ISR für INT0 zu installieren und dann
> wird wohl eine Reset durchführt, also wieder vorne angefangen.

....überleg einfach mal wo er dann hinspringt ;-)

der "reset" kann je nach dem auch kein reset, sondern auch andere 
seltsame verhaltensweisen annehmen....
#2565944
Lesenswert?

HildeK schrieb:
> Wenn ich einen ATtiny (hier Tiny25) in den Power-Down Mode schicke und
> ihn z.B. über den INT0 wieder aufwecke, dann geht es wohl direkt nach
> dem Sleep-Statement wieder weiter. Soweit OK.
> Anfangs hatte ich vergessen, die ISR für INT0 zu installieren und dann
> wird wohl eine Reset durchführt, also wieder vorne angefangen.
>
> Meine Frage: ist dies zufällig so und eigentlich ein Seiteneffekt oder
> kann/darf man das auch gezielt nutzen?

Wenn du einen Interrupt auslöst, dann springt der Controller zum 
entsprechenden Interruptvektor. Ob du eine ISR hast oder nicht. Ganz 
einfach.
Und jetzt schau mal wo der Interruptvektor liegt und dann überleg mal 
was passiert wenn du keine ISR hast.

Ein Reset an sich wird da nicht ausgelöst, lediglich die 
Programmausfürung beginnt wieder von vorne. Aber ein Reset setzt ja alle 
Register in einen bestimmten Zustand und das passiert hier NICHT.

gruß cyblord
Gast #2565995
Lesenswert?

Vielen Dank euch beiden.

cyblord ---- schrieb:
> Und jetzt schau mal wo der Interruptvektor liegt und dann überleg mal
> was passiert wenn du keine ISR hast.

Ja, habe ich getan und im Disassemblerlisting vom AVR-Studio gefunden:
- der INT0 hat die ADR 0x0001 (Datenblatt).
- dort steht (bei fehlender ISR) RJMP PC+0x14, also ein Sprung nach 
PC=0x0015
- da findet man RJMP PC-0x0015, also einen Sprung nach Adresse 0x0000. 
Das ist aber der Resetvektor.

Daraus schließe ich, dass dies, zumindest mit dem AVR GCC, funktioniert 
und der Tiny einen astreinen Reset ausführt.

cyblord ---- schrieb:
> Aber ein Reset setzt ja alle
> Register in einen bestimmten Zustand und das passiert hier NICHT.
Das wäre demnach aber nicht so.
Oder ich habe noch immer eine Verständnislücke.
#2566066
Lesenswert?

HildeK schrieb:
> Anon Ymous schrieb:
>> springen nach 0x00 != Reset
>
> Für ein paar Hinweise, in welche Richtung die Unterschiede gehen, wäre
> ich dir schon dankbar.
> Worin liegen die Unterschiede, wenn ich den Reset-Pin bediene oder die
> SW auf den Resetvektor springt?

Habe ich doch geschrieben. Ein RESET setzt alle Register im Controller 
auf einen definierten Wert. Ein Sprung nach 0x00 tut dies nicht. Was ist 
daran denn nicht verständlich?

> Daraus schließe ich, dass dies, zumindest mit dem AVR GCC, funktioniert
> und der Tiny einen astreinen Reset ausführt.
Diese Schlussfolgerung ist astrein falsch. Mir ist nicht klar wie man 
auf sowas kommt.

Wenn du im Programm nach 0x00 springen willst, dann nimm einfach goto.

gruß cyblord

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren