Forum: Mikrocontroller und Digitale Elektronik Aufwachen aus Powerdown mit INT0 falling und internen Pullup


von Michael K. (tschoeatsch)


Lesenswert?

Hallo Bastler,
ich hab' mal Fragen:
Mein Atmega8 soll aus dem Powerdown-modus durch einen INT0 aufgeweckt 
werden.
-führen interne, aktivierte pullups zu mehr Stromverbrauch im Powerdown?
  (ich vermute eher nicht, da sie mit Transistoren zugeschaltet werden,
  die im Powerdown abgeschaltet werden, stimmt das?)
-kann ich den µC mit eingeschalteten pullup und fallender Flanke am INT0 
wieder aufwecken (wo jetzt eigentlich der pullup abgeschaltet ist) oder 
ist es sicherer einen externen pulldown und eine steigende Flanke am 
INT0 zum Aufwecken zu verwenden?
Danke für Hinweise

von spess53 (Gast)


Lesenswert?

Hi

>kann ich den µC mit eingeschalteten pullup und fallender Flanke am INT0
>wieder aufwecken (wo jetzt eigentlich der pullup abgeschaltet ist) oder
>ist es sicherer einen externen pulldown und eine steigende Flanke am
>INT0 zum Aufwecken zu verwenden?

Mit keiner Flanke. Datenblatt sagt:

Only level interrupt INT1 and INT0

MfG Spess

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


Lesenswert?

Michael Kirch. schrieb:
> -führen interne, aktivierte pullups zu mehr Stromverbrauch im Powerdown?

Nur dann deutlich, wenn du sie extern gegen Masse ziehst. Die Eingänge 
des MC haben allerdings einen geringen Leckstrom, in den 'Electrical 
Characteristics' des Mega 8 wird dieser mit 1µA angegeben. In Verbindung 
mit einem Pullup fliesst dieser dann.

> -kann ich den µC mit eingeschalteten pullup und fallender Flanke am INT0
> wieder aufwecken (wo jetzt eigentlich der pullup abgeschaltet ist) oder
> ist es sicherer einen externen pulldown und eine steigende Flanke am
> INT0 zum Aufwecken zu verwenden?
Die Pullups sind statisch und bleiben auch im Powerdown aktiv. Es bleibt 
sich also ziemlich gleich, es sei denn du kannst mit einem recht grossen 
externen Pullup oder -down leben, im Bereich von 100k-1M um den 
Leckstrom (s.o.) weiter zu reduzieren.
Wie Spess schon schreibt, sind Flanken keine gültigen Wake-ups aus dem 
Powerdown - siehe DB Table 14 Fussnote 3.

: Bearbeitet durch User
von Michael K. (tschoeatsch)


Lesenswert?

Das heißt der Powerdown kann sicher beendet werden mit internen pullup 
und einem Lowlevel an INT0 durch einen Taster, der den INT0 nach Masse 
zieht, richtig?

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


Lesenswert?

Michael Kirch. schrieb:
> Das heißt der Powerdown kann sicher beendet werden mit internen pullup
> und einem Lowlevel an INT0 durch einen Taster, der den INT0 nach Masse
> zieht, richtig?

Jo. Allerdings solltest du die Prellerei beachten, die ein jeder Taster 
produziert. Wenn der Taster länger als die Wake-up Zeit INT auf Masse 
zieht, weckt er zuverlässig.Die Wake-Up Zeit wird aus zwei Quellen 
bestimmt, dies ist der Watchdog Takt und die in den Fuses gesetzte 
Startup Zeit. Es kann dazu kommen, das der MC zwar aufwacht, aber keine 
ISR ausführt, siehe den Abschnitt 'External Interrupts' (in meinem DB 
05/08) auf Seite 66.

von Michael K. (tschoeatsch)


Lesenswert?

Ich will mit der Taste den Powerdown beenden und in der INTSR ein flag 
setzen, das die Taste gedrückt wurde. Ein Prellen hätte doch hier nur 
den "Nachteil", dass der µC öffters in die INTSR springt und ein bischen 
Zeit verplempert. Während des weiteren Programmablaufes kann wieder die 
Taste gedrückt werden um das (zurückgesetzte) flag wieder zu setzen.

(Was macht der µC, wenn er aufwacht, aber keine Isr auslöst? Geht's 
einfach im Programm weiter, wo er eingeschlafen ist?)

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Ich will mit der Taste den Powerdown beenden und in der INTSR ein flag
>setzen, das die Taste gedrückt wurde. Ein Prellen hätte doch hier nur
>den "Nachteil", dass der µC öffters in die INTSR springt und ein bischen
>Zeit verplempert.

Nicht das Prellen erzeugt neue Interrupts:

Datenblatt:

When the external interrupt is enabled and is configured as level 
triggered,
the interrupt will trigger as long as the pin is held low.

MfG Spess

von Michael K. (tschoeatsch)


Lesenswert?

Ist jetzt hier ein Prellen schädlich oder nicht? Wird die INTSR erst 
abgearbeitet, wenn das Prellen vorbei ist?

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Michael Kirch. schrieb:
> Ist jetzt hier ein Prellen schädlich oder nicht?

Überlege dir ob es schädlich für dein Programm ist, wenn, nach dem 
aufwachen des Controllers, die entsprechende INT0 ISR immer wieder 
angesprungen wird. a.) solange der Taster gedrückt ist und b.) auch beim 
loslassen durchs prellen.

gruß cyblord

von Michael K. (tschoeatsch)


Lesenswert?

Also, wenn der INT0 auf low geht, springt der µC an den Anfang der ISR 
und wartet solange bis INT0 wieder high wird und arbeitet dann die 
Befehle der ISR ab?
Und wenn der Taster prellt, dann werden evtl. die ersten Befehle der ISR 
abgearbeitet bis der µC wieder an den Anfang der ISR springt weil INT0 
wieder im Prellen low geworden ist?

von spess53 (Gast)


Lesenswert?

Hi

>Also, wenn der INT0 auf low geht, springt der µC an den Anfang der ISR
>und wartet solange bis INT0 wieder high wird und arbeitet dann die
>Befehle der ISR ab?

Nein. Der wartet nicht, sondern arbeitet die ISR ab. Wenn danach der 
Eingang immer noch Low ist, wird der Interrupt erneut ausgelöst. Das 
Spiel geht solange der Pin wieder High ist.

MfG Spess

von Thomas E. (thomase)


Lesenswert?

Michael Kirch. schrieb:
> Also, wenn der INT0 auf low geht, springt der µC an den Anfang der ISR
> und wartet solange bis INT0 wieder high wird und arbeitet dann die
> Befehle der ISR ab?

Nein. Der durchläuft die ISR, stellt fest, daß INT0 immer noch 0 ist und 
führt die ISR nochmal aus. Das macht er solange bis INT0 eben nicht mehr 
0 ist.

> Und wenn der Taster prellt, dann werden evtl. die ersten Befehle der ISR
> abgearbeitet bis der µC wieder an den Anfang der ISR springt weil INT0
> wieder im Prellen low geworden ist?

Die gesamte ISR wird immer komplett abgearbeite. Die wird nicht 
"resetted".

Was hindert dich eigentlich daran, den INT0-Interrupt nach dem Auftreten 
abzuschalten?
1
...
2
GICR |= (1 << INT0);
3
sleep_cpu();
4
GICR &= ~(1 << INT0);

mfg.

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Michael Kirch. schrieb:
> Also, wenn der INT0 auf low geht, springt der µC an den Anfang der ISR
ja

> und wartet solange bis INT0 wieder high wird und arbeitet dann die
> Befehle der ISR ab?
Nein quatsch warum sollte er warten? Er arbeitet die ISR sofort ab.

> Und wenn der Taster prellt, dann werden evtl. die ersten Befehle der ISR
> abgearbeitet bis der µC wieder an den Anfang der ISR springt weil INT0
> wieder im Prellen low geworden ist?

Nein die ISR wird komplett abbearbeitet, aber wenn der INT0 auf Low 
bleibt, dann wird nach dem Ende der ISR sofort wieder in die ISR 
gesprungen. Der Interrupt wird ständig ausgelöst solange INT0 auf low 
ist. Prellen wird nicht drin Problem sein, aber wenn der Taster gedrückt 
gehalten wird, diesen Fall solltest du bedenken.

gruß cyblord

von Michael K. (tschoeatsch)


Lesenswert?

Dann bleibt der Programmablauf solange in der ISR hängen, bis die Taste 
wieder losgelassen wird. Wenn ich, in meinem Fall nur ein flag, setzen 
will, würde ein Prellen nicht stören, weil ich länger auf der Taste 
rumdrück als das Prellen dauert. Wenn ich eine Zähler erhöhen würde (in 
der ISR), würde der dann hochsausen.

von Michael K. (tschoeatsch)


Lesenswert?

Thomas Eckmann schrieb:
> Was hindert dich eigentlich daran, den INT0-Interrupt nach dem Auftreten
> abzuschalten?

Danke für den Code, aber ich mach's mit Bascom. Aber da kann man auch 
den Int ausschalten. Das werde ich berücksichtigen.

von Thomas E. (thomase)


Lesenswert?

Michael Kirch. schrieb:
> Thomas Eckmann schrieb:
>> Was hindert dich eigentlich daran, den INT0-Interrupt nach dem Auftreten
>> abzuschalten?
>
> Danke für den Code, aber ich mach's mit Bascom. Aber da kann man auch
> den Int ausschalten. Das werde ich berücksichtigen.

Du kannst den Interrupt auch in der ISR selbst abschalten. Aber nur den 
INT0 direkt. Ein Abschalten der globalen Interrupts bringt gar nichts, 
da diese nach Verlassen der ISR automatisch wieder eingeschaltet werden.

mfg.

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.