Forum: Mikrocontroller und Digitale Elektronik Taster richtig abfragen


von René S. (grassh0pper)


Lesenswert?

hallo,

ich bin seit ca. 3 monaten dabei erste erfahrungen mit der 
programmierung von AVRs zu machen.
Habe jetzt eine kleine verständnisfrage was die abfrage von Tastern 
angeht.
Ich habe einen Taster wie im kapitel "entprellung" beschrieben mit dem 
74HCT14 entprellt.
Ich programmiere mit avr-studio5 und dem gcc compiler.

wenn ich jetzt den code

"
while(1)
{
if(TASTER-PIN & (1<<TASTER1))
    {
      test++;
    }
}
"

eingebe und die variable "test" auf einem display ausgebe zählt sie mit 
annähernd dem systemtakt hoch sobalkd ich den taster drücke.
Momentan bin ich etwas verwirrt...
stimmt das jetzt oder nicht?
wie kann ich einen einmaligen tastendruck detektieren? Sprich: die 
Variable test soll sich bei jedem tastendruck um eins erhöhen... Brauche 
ich da eine positive flankenerkennung?

mfg Grassh0pper

von XXX (Gast)


Lesenswert?

Hallo

Solange dein Taster gedrückt ist, wird hochgezählt.
Denn deine if-Bedingung ist solange erfüllt, solange der Taster
gedrückt ist.

Gruß
Joachim

von Helfer (Gast)


Lesenswert?

Brauchst du nicht. Du musst warten bis die Taste wieder losgelassen 
wurde
1
while(1)
2
{
3
  if(TASTER-PIN & (1<<TASTER1))
4
    {
5
      test++;
6
      while(TASTER-PIN & (1<<TASTER1)) {} // warten solange gedrückt
7
    }
8
}

von Helfer (Gast)


Lesenswert?

Nachteil, der µC macht in der Zeit nix anderes als Warten. Wenn du 
möchtest, dass der µC auch bei gedrückter Taste arbeitet, musst du 
anders an die Sache rangehen (=> Artikel Entprellung)

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

Hi, also ich hab auch am Anfang alles über Entprellen etc. gelesen,

Resumee:
1) durch Tastenabfrage darf es nie zu einer Wartezeit kommen, also 
wait-Statements, Debounce oä ist irgendwie schwach programmiert

2) ein Timer ist Pflicht, konfigurier die Timerintervalle auf die 
höchste Freuqenz, die du brauchst - dann hast du einen perfekten 
Scheduler
10ms/100 Hertz - reichen für die Tastenabfrage
Dann zählst du mit, wie lange der Taster gedrückt war bzw. wie lange 
nicht, ab 3x an gilt er dann als fix gedrückt, ab 3x aus gilt er  als 
nicht mehr gedrückt

von René S. (grassh0pper)


Lesenswert?

wie gesagt:
habe den taster hardwaremäßig mit nem 74hct14 entprellt! Ich glaube, ich 
muss jetzt noch zusätzlich softwaremäßig die flanke auswerten. kenn ich 
von der awl-programmierung bei den spsen. da gabs den schönen befehl FP 
oder FN.
problem ist ja nicht das prellen des tasters, sondern dass der zustand 
"Taster ist gedrückt" von der if-bedingung bei jedem programmzyklus als 
wahr interpretiert wird.
ist das so, oder bin ich verkehrt?

von Volkmar D. (volkmar)


Lesenswert?

rené s. schrieb:
> sondern dass der zustand
> "Taster ist gedrückt" von der if-bedingung bei jedem programmzyklus als
> wahr interpretiert wird.

Genauso!

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

rené s. schrieb:
> wie gesagt:
> habe den taster hardwaremäßig mit nem 74hct14 entprellt! Ich glaube, ich
> muss jetzt noch zusätzlich softwaremäßig die flanke auswerten. kenn ich
> von der awl-programmierung bei den spsen. da gabs den schönen befehl FP
> oder FN.
> problem ist ja nicht das prellen des tasters, sondern dass der zustand
> "Taster ist gedrückt" von der if-bedingung bei jedem programmzyklus als
> wahr interpretiert wird.
> ist das so, oder bin ich verkehrt?

Geht genauso mit Timer

Timer erhöht xon wenn Taster gedrückt und zählt hoch bis max. 255 oder 
65535 (bei word-Variablen)
Timer setzt xon auf 0 wenn Taste losgelassen

Du prüfst im Hauptprogramm auf xon=1
Wenn ok, FP erfüllt, xon um 1 erhöhen (verhindert 2. Abfrage)

Nebeneffekt: du kannst auch längere Tastendrücke erkennen
z.B. wenn xon=200 (200x10ms=2 Sekunden)

von Rolf Magnus (Gast)


Lesenswert?

rené s. schrieb:
> wenn ich jetzt den code
>
> "
> while(1)
> {
> if(TASTER-PIN & (1<<TASTER1))
>     {
>       test++;
>     }
> }
> "
>
> eingebe und die variable "test" auf einem display ausgebe zählt sie mit
> annähernd dem systemtakt hoch sobalkd ich den taster drücke.
> Momentan bin ich etwas verwirrt...

Was hättest du denn erwartet und warum?
Du fragst in einer Schleife ständig, ob der Taster gerade gedrückt ist 
oder nicht, und wenn er gedrückt ist, erhöhst du deinen Zähler. Dann 
kommt sofort der nächste Schleifendurchlauf, der das auch wieder macht.

von Klaus (Gast)


Lesenswert?

Mach doch so:

Wenn Taster gedrückt und  Bit-Variable == 0
{
   Wenn Bit-variable == 0
   {
      setze Bit-Variable;
      Test++;
   }
else
   Wenn Taster nicht gedrückt
   ´{
      setze Bit-Variable zurück
    }
}

So mal als Vorschlag!

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.