www.mikrocontroller.net

Forum: Compiler & IDEs Entprellen von 4 Taster


Autor: Toni (Gast)
Datum:

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

Autor: peter dannegger (Gast)
Datum:

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

Autor: Toni (Gast)
Datum:

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

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.