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
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
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 | }
|
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)
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
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?
rené s. schrieb: > sondern dass der zustand > "Taster ist gedrückt" von der if-bedingung bei jedem programmzyklus als > wahr interpretiert wird. Genauso!
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)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.