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
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
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
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?
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.
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
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
Ist jetzt hier ein Prellen schädlich oder nicht? Wird die INTSR erst abgearbeitet, wenn das Prellen vorbei ist?
:
Bearbeitet durch User
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
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?
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
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
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.