Forum: Mikrocontroller und Digitale Elektronik ATTiny: SLEEP_MODE_PWR_DOWN - wo geht es weiter?


von HildeK (Gast)


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?

von pompete (Gast)


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....

von Cyblord -. (cyblord)


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

von HildeK (Gast)


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.

von Anon Y. (avion23)


Lesenswert?

springen nach 0x00 != Reset

von HildeK (Gast)


Lesenswert?

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?

von Cyblord -. (cyblord)


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

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.