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
Gibt es einen AVR664 ? Such mal im Forum, steht hier schon alles lang und breit erklärt (Stichwort: INT-Flag).
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
ich glaube ich weiß auch warum,. Weil dann das interrupt ereignis nicht mehr auftritt? ich glaube, ich habst verstanden. War 'ne lange Geburt.
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.