Entprellen von 4 Taster

Gast #181334
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
  }
//---------------------------------------------------------------------- 
---
Gast #181336
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)



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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.