Hallo,
ich habe eine Frage bezüglich Power Down, respektive Power Up:
Wenn ich mit folgendem Code:
button = button_check();
if(button == SHORT) {
button = NOT;
wait_ms(1000);
PCICR |= (1<<PCIE3); //pin change interrupt 3 enable
PCMSK3 |= (1<<PCINT27); //pin change interrupt 3 @ PD3 (wake up input)
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //set sleep mode
sleep_mode(); nighty night!!!
sleep_disable(); start here after wake up
wait_ms(1000);
}
ISR(PCINT3_vect) {
PCICR &= ~(1<<PCIE3); //pin change interrupt 3 disable
}
meine Controller schlafen lege, kann ich ihn nur einmal wieder wecken,
beim zweiten mal geht er zwar in den power down, aber er lässt sich
nicht wieder aufwecken. Kann jemand helfen?
an Port PD3 ist ein pulldown, mittels taster wir ein high Pegel erzeugt.
Gruß, Alex
mich wundert es ein bisschen, dass das so funktioniert hat beim
atmega32, nur mit dem ext int. Ich hab nochmal im manual gelesen, aber
nix gefunden. ich dachte, die entsprechenden flags wedrden beim
anspringen der isr gelöscht.
gruß, alex
Alex wrote:
> mich wundert es ein bisschen, dass das so funktioniert hat beim> atmega32, nur mit dem ext int. Ich hab nochmal im manual gelesen, aber> nix gefunden. ich dachte, die entsprechenden flags wedrden beim> anspringen der isr gelöscht.
Werden sie auch. Und da Dein Taster mit Sicherheit ein bisschen prellt,
wird das Flag nach Ansprung der ISR und dem automatischen Löschen gleich
wieder gesetzt. Da Du den Interrupt im Handler deaktivierst, bleibt das
Flag auch gesetzt. Wenn Du dann vor dem Schlafengehen den Interrupt
wieder freigibst, ohne das Flag vorher zu löschen, wird sofort in den
Handler gesprungen und der Interrupt wieder ausgeschaltet, bevor die
Zeile mit "sleep_mode()" erreicht wird. Dann geht der µC schlafen, aber
da Du den Interrupt abgeschaltet hast, gibt's kein Erwachen mehr...
Alex wrote:
> der taster wird in button_check() entprellt, 50ms
Bringt nur nix, weil die Pin Change Interrupts grundsätzlich auf beide
Flanken triggern, weshalb spätestens beim Loslassen des Tasters das Flag
wieder gesetzt wird. Das ist auch wahrscheinlich der Grund dafür, dass
es mit den "nortmalen" externen Interrupts beim Mega32 funktioniert,
hier aber trotz Entprellen nicht!
was ich gerade nicht verstehe ist: wenn ich den taster drücke, dann
prellt er - soweit klar. aber da ich den interrupt deaktiviere, sollte
das doch egal sein. Oder sehe ich gerade den Wald vor Bäumen nicht
Gruß, Alex
Alex wrote:
> was ich gerade nicht verstehe ist: wenn ich den taster drücke, dann> prellt er - soweit klar. aber da ich den interrupt deaktiviere, sollte> das doch egal sein. Oder sehe ich gerade den Wald vor Bäumen nicht
Interrupt Flags werden immer gesetzt, wenn das entsprechende
Hardware-Ereignis eintritt! Das Setzen des Interrupt Enable Bit gibt nur
die Interrupt-Bearbeitung des Flags frei. Sonst wäre eine Abfrage der
Flags per Polling nicht möglich.
so, ich habe jetzt PCIFR |= (1<<PCIF3); eingefügt vor dem schlafen
gehen, es funktioniert auch. Vielen Dank erstmal.
WAs auch funftioniert, ist, die Zeile PCMSK3 &= ~(1<<PCINT27); mit in
die ISR zu nehmen. Dann wird das PCIF3 auch nicht mehr gesetzt.
Gruß, ALex