Forum: Compiler & IDEs Entprellen von 4 Taster


von Toni (Gast)


Lesenswert?

Hallo

Komme nicht weiter, nachdem die unten angehängte Entprell-Routine gute
Dienste leistet.

Da ich 4 Taster habe, habe ich sie im Moment 4-mal in meinem Listing.

Ich suche eine Möglichkeit, diesselbe Routine für jeder der vier Tasten
zu benützen, und trotzdem dieselben "Tastereigenen"-Bit-Variablen zu
behalten. (Jeweils Bit.tastex und Bit.tastex_status x=0,1,2,3)

Vielen Dank für die Ideen

Toni

//-------Entprell-Routine für Taste 0 >>set AL --------------------
if  ( bit_is_clear(PIND,PIND0) )                //Taste 0 gedrückt
  {
  if (Bit.taste0)//war Pin-Pegel zuvor 1?==>also nicht gedrückt !
    {
    nCounter0=0;   //<<<das erste mal ausgeführt>>>
    Bit.taste0=0;  //gedrückt
    Bit.taste0_status=1;    //Status als noch nicht gedrückt
    }
  else if ( Bit.taste0_status)
          {
          if (++nCounter0 > DELAY_LOOPS)
                          {
        Bit.taste0_status=0;
        }  //jetzt als gedrückt
          }
  }
else
  {
  Bit.taste0=1;           //Pegel 1, nicht gedrückt
  }
//---------------------------------------------------------------------- 
---

von peter dannegger (Gast)


Lesenswert?

Wärs nicht einfacher, nur eine Routine zu verwenden, die bis zu 8 Tasten
kann ?

Z.B.:

http://www.mikrocontroller.net/forum/read-4-49709.html#new


Peter

von Toni (Gast)


Lesenswert?

Hallo

Peter, was denkst Du über diese Routine ?

Ich denke sie ist so schlank, dass ich sie 4-mal einbinden kann?!
Leider weiss ich nicht, wie ich schauen kann, wieviele Takte sie
'verbraucht'.

Toni
----------------------------------------------------------------------

***************************************************************

uint16_t status;

void entprell(void)
{
status = ((status<<1) | (!bit_is_clear(PIND,PIND0)) | 0xe000);
if (status==0xf000)  Bit.taste0_status=0;
else Bit.taste0_status=1;
}

***************************************************************

Funktion kann im Hauptloop stehen, oder per Interrupt regelmässig
aufgerufern werden.

Taste gedrückt entspricht Pegel "0".
In 'status' wird eine '1' von rechts nach links geschoben, die die
letze Flanke '1->0' darstellt.
Falls Taste nicht prellt, folgen nur noch'0'.
Im gesamten werden hier 12 Umgänge geprüft, kann mit Maske/Typ für/von
'status' geändert werden !

Also zu Beginn:status      :1110 0000 0000 0000  (Maske 0xe00)
Wärend prellen, z.B        :1110 0010 0100 1001
Entpellt (12 cycles)       :1111 0000 0000 0000  (status==0xf000)



----------------------------------------------------------------------

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.