Taster entprellen mit bestehender Software

#3815688
Lesenswert?

Moin,

Ich habe ein wenig code geschrieben um ein einstellbares Rechtecksignal 
an einem der Ausgangspins zu bekommen. Dafür habe ich unter Anderem auch 
Timer eingesetzt und eine ISR.

Jetzt möchte ich gerne die Frequenz in festen Schritten erhöhen, bzw 
veringern. Dazu verwende ich Taster. Das Programm funktioniert. Nur 
kommen natürlich pro Tastvorgang nicht die gewünschten 0.5Hz zu der 
Ausgangsfrequenz, sondern es springt in 1-5Hz Schritten. Das würde ich 
auf das Prellen der Taster schieben.
1
 if (!(PINB & (1<<PINB0)))

ist meine Tasterabfrage bisher. Für die Frequenzerzeugung habe ich wie 
gesagt Timer und ISR genutzt. In der ISR habe ich eine Variable "timer".
1
ISR (TIMER0_COMPA_vect)
2
{
3
timer++;
4
}

Soweit so einfach. Wenn ich jetzt den/die Taster entprellen möchte, kann 
ich da nicht einfach die "timer" Variable nutzen?

Hatte gedacht einfach:
1
 if ((!(PINB & (1<<PINB0))) && timer == 200)
sowas zu machen. 200 ist ein Wert, den die Variable in jedem Durchlauf 
auf jeden Fall erreicht. Gehen wir davon aus das meinetwegen 300 der 
maximale Wert von "timer" ist (wird bei erreichen wieder auf 0 gesetzt) 
und das diese 300 einer Frequenz von 100Hz entspricht. Somit würde sich 
doch eine Tasterabfrage alle 10ms ergeben, oder sehe ich das falsch?
Tatsache ist: Es klappt nicht! :D
Hat irgendjemand eine Ahnung, oder Idee wie ich die Taster am besten 
entprellen kann?

Wait-Funktionen kommen nicht in Frage, da sie den programmablauf 
blockieren würden...
(Firma: Vescomp) #3816357
Lesenswert?

Daniel V. schrieb:
> Wie immer:
> http://www.mikrocontroller.net/articles/Entprellung

 Und warum ?
 Soll dieser Artikel das Nonplusultra darstellen ?
 Niemand soll versuchen etwas eigenes zu schreiben ?

Lasse ... schrieb:
> ist meine Tasterabfrage bisher. Für die Frequenzerzeugung habe ich wie
> gesagt Timer und ISR genutzt. In der ISR habe ich eine Variable "timer".

 Viel mehr brauchst du auch nicht.
 Eine Variable, z.B. TasterOn, die in ISR gesetzt wird.
 Eine Extra Zählvariable für Taster, z.B. PrellCnt.
 Beim Eintritt in die ISR:
1
   timer++;  // Lass deinen timer ruhig weiterzählen
2

3
   if TasterOn == 1{   // Taster gedrückt, 50ms abwarten, Zustand nicht abfragen
4
     if PrellCnt > 0{
5
       PrellCnt--;
6
     }
7
     else{             // 50ms vorbei, Taster kann wieder abgefragt werden
8
       TasterOn = 0;
9
     }
10
   }
11

12
   else{ // Hier kann Taster abgefragt werden
13
      if (!(PINB & (1<<PINB0)))
14
      {
15
        TasterOn = 1;
16
        PrellCnt = 50;  // Falls dein Timer mit 1KHz lauft, 50ms fur Prellen
17
        //  **********************************
18
        // Und hier Flag setzen für Frequenz erhöhen oder verringern.
19
        // Wenn das getan ist (ausserhalb), Flag wieder zurücksetzen.
20
        //  **********************************
21
      }
22
   }

 Werte entsprechend deinem Timer und angenommener Prellzeit ändern.
 Prellen kann (meine Erfahrung) zwischen 2 und 50ms dauern. Beim
 loslassen kann es auch zu prellen kommen, ist aber eher unwahr-
 scheinlich.
 Und das war's auch schon.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren