Taster richtig abfragen

OP #2355447
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
Gast #2355456
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
Gast #2355458
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
}
Gast #2355460
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)
(Firma: Manfred) #2355467
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
OP #2355501
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?
(Firma: Manfred) #2355541
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)
Gast #2355546
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.
Gast #2356083
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!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.