Forum: Mikrocontroller und Digitale Elektronik Taster entprellen mit bestehender Software


von Lasse .. (lassem)


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...

von Daniel V. (danvet)


Lesenswert?


von Marc V. (Firma: Vescomp) (logarithmus)


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.

: Bearbeitet durch User
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.