Forum: Mikrocontroller und Digitale Elektronik avr tastenentprellung nach dannegger


von Tino K. (blumengiesser)


Lesenswert?

Moin!

Ich habe die Enprellung der Tasten nach P. Dannegger's Tutorial gemacht. 
Dies Funktioniert soweit auch aber es trotzdem seltsam in der 
Funktionsweise. Problem ist, daß ich für ein Display die 
Hinterdrundbeleuchtung ausschalte (timer) und diese sich bei einem 
Tastendruck wieder einschalten soll. Ich habe das in folgender Form 
versucht zu lösen:

volatile uint8_t powersave_state = 0; //1=powersave, 0=normal
.
.
.

powersave_state =1;

if ((get_key_press (1<<KEY0)) && (powersave_state ==1))
{
        powersave_time =0;
        Backlight_ON();
}


if ((get_key_press (1<<KEY0)) && (powersave_state==0))
{
       tu_etwas();
}

soweit so gut. Wird powersave_state=0; vor den if-Funktionen gesetzt 
passiert gar nix. tu_etwas() wird ignoriert.

a) warum?
b) wie kann man das umgehen?

Vielen Dank...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Das Problem liegt nicht im geposteten Code.

Tino Kühn schrieb:
> Wird powersave_state=0; vor den if-Funktionen gesetzt
> passiert gar nix.
Und was passiert, wenn der Wert powersave_state=1 ist?

von Tino K. (blumengiesser)


Lesenswert?

ja wie schon geschrieben, dann geht das display an...

von Uwe (Gast)


Lesenswert?

if ((get_key_press (1<<KEY0)) && (powersave_state ==1))
{
        powersave_time =0;
        powersave_state=0;
Backlight_ON();
}


if ((get_key_press (1<<KEY0)) && (powersave_state==0))
{
       tu_etwas();
}

von Uwe (de0508)


Lesenswert?

Hallo,


Tino Kühn schrieb:
> if ((get_key_press (1<<KEY0)) && (powersave_state==0))
> {
>        tu_etwas();
> }

Du kannst nur einmal get_key_press (1<<KEY0) aufrufen, danach wird der 
Zustand gelöscht. D.h. die zweiter Abfrage ist (fast) immer FALSE.

Fast deshalb, wenn Du es schaffst die Taste 2 mal innerhalb von ca. 50ms 
zu drücken und los zu lassen, dann - aber nur dann.

von Peter D. (peda)


Lesenswert?

get_key_press() liefert Dir genau ein Ereignis.

Wenn Du es an 2 Stellen für die gleiche Taste aufrufst, wird rein 
zufällig mal die eine und mal die andere Stelle das Ereignis lesen.
Und wenn eine Stelle das Ereignis wegwirft, ist es eben weg.


Peter

von IsdennheutschoWeihnachtn (Gast)


Lesenswert?

Probier mal:

if (get_key_press (1 << KEY0))
{
  if (powersave_state == 1)
  {
        powersave_time = 0;
        Backlight_ON();
  }
  else
    tu_etwas();
}

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.