Aufwachen aus Powerdown mit INT0 falling und internen Pullup

OP #3398371
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
Gast #3398377
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
(Firma: matzetronics) #3398380
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.
(Firma: matzetronics) #3398392
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.
OP #3398409
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?)
Gast #3398427
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
OP #3398695
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?
Gast #3398712
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
#3398715
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.
#3398716
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
OP #3398719
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.
#3398734
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.

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