Wenn ich den Button zum ersten Mal drück, so geht er gleich in die 2te IF rein

Beitragsinhalte aufgrund von Vandalismus des Autors teilweise verloren

Wenn ich den Button zum ersten Mal drück, so geht er gleich in die 2te IF rein, die variable a hat also den Wert 2. Das kann jedoch nicht sein da ich den Button ja zum ersten Mal gedrückt hab. Wenn ich ihn ein 2tes Mal drück dann geht er in die 3te IF. Ich drücke ein 3tes Mal und er fängt wieder in der 2ten IF an usw. Warum ??

Wenn ich den Button zum ersten Mal drück, so geht er gleich in die 2te IF rein, die variable a hat also den Wert 2. Das kann jedoch nicht sein da ich den Button ja zum ersten Mal gedrückt hab. Wenn ich ihn ein 2tes Mal drück dann geht er in die 3te IF. Ich drücke ein 3tes Mal und er fängt wieder in der 2ten IF an usw. Warum ??

Hast Du den Taster entprellt?

Grüße Uwe

Ich habe bisher gelernt, ein nicht entprellter Taster macht immer das was er will und nie was man logisch erwartet. :wink:

So wie ich die Interruptbehandlung beim ATmega verstanden haben wird ein Interrupt bei gesperrtem Interruptflag zwischengespeichert und dann bei wieder aktiven Interrupt abgearbeitet.
Du brauchst einen Hardwarentprellung.
Grüße Uwe

Würde es nicht wie folgt funktionieren können? (Ohne Entprellen)

ISR(INT0_vect) {

  GIMSK &= ~(1 << INT0); //disable int0 interrupt
  MCUCR &= ~(1 << SE); //disable sleep
  if (sleep) {
    sleep = 0;
    a++;
  }
}

Ardunaut:
Funktioniert auch nicht.

Das kann pro sleep a nur einmal incrementieren, was kann daran nicht funktionieren?

Wahrscheinlich ist diese auskommentierte Zeile nötig (unabhängig von der ISR)

    //GIFR |= (1 << INTF0); // clear int0 flag

Wahrscheinlich steht schon ein Interrupt an, wenn du ihn enablest,
deshalb ja mein Tip den vorher zurückzusetzen.
Mit meinem Code wird das Prellen der Taste sicher unterdrückt (ein count pro sleep).
Sleep solltest du besser mit 0 vorbelegen, vielleicht reicht sogar das allein schon aus,
um den anfänglichen Interrupt nicht zu zählen.