Forum: Mikrocontroller und Digitale Elektronik power down ATMEGA664


von Alex (Gast)


Lesenswert?

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

von AVR (Gast)


Lesenswert?

Gibt es einen AVR664 ?

Such mal im Forum, steht hier schon alles lang und breit erklärt 
(Stichwort: INT-Flag).

von Alex (Gast)


Lesenswert?

ich suche...

sorry, meine 644

von Alex (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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...

von Alex (Gast)


Lesenswert?

der taster wird in button_check() entprellt, 50ms

von Johannes M. (johnny-m)


Lesenswert?

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!

von Alex (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.