www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik power down ATMEGA664


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es einen AVR664 ?

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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich suche...

sorry, meine 644

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der taster wird in button_check() entprellt, 50ms

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube ich weiß auch warum,. Weil dann das interrupt ereignis nicht 
mehr auftritt? ich glaube, ich habst verstanden. War 'ne lange Geburt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.