Guten Abend
Ich habe ein kleines Projekt am laufen und steh seit längerem auf der
Leitung.
Und zwar habe ich an meinem uC zwei Taster angeschlossen. Ich will nun
detektieren, ob einer der beiden oder beide zusammen gedrückt werden.
Dafür habe ich erst mal einen Flankendetektor geschrieben. Nur kann man
so nur einen Tastendruck detektieren.
Kann mir jemand sagen, wie ich das "eleganter" realisieren kann?
Hier mein Code:
Gecko schrieb:> Dafür habe ich erst mal einen Flankendetektor geschrieben. Nur kann man> so nur einen Tastendruck detektieren.
Das Problem ist reichlich knifflig. Denn als Mensch wirst du es niemals
schaffen, die beiden Tasten 100% exakt gleichzeitig zu drücken.
Was du aber tun kannst:
Wenn du einen Tastendruck feststellst, kannst du kurz einen Blick auf
den anderen Portpin werfen, ob dort die Taste gerade gedrückt ist. Wenn
ja, dann sind somit beide Tasten gedrückt.
Ok jetzt habe ich es geschaft. Scheint mir aber ziemlich aufwendig 3
Unterprogramme zu schreiben, um 3 Fälle zu überprüfen. Mir fällt
allerdings keine einfachere Alternative ein. Tipp? :)
Hast du das schon in einem Testprogramm verifiziert?
> Scheint mir aber ziemlich aufwendig 3 Unterprogramme zu schreiben
Na, ja.
Wenn du dir die Funktionen ansiehst, dann ist das immer die im Prinzip
gleiche Funktion, nur die Variablen sind andere. Genau dafür gibt es
Funktionsargumente, damit man einer Funktion Werte übergeben kann, mit
denen sie dann operiert.
Dein C-Buch weiß zu dem Thema näheres.
lutz h. schrieb:> Was soll Funktion zurückgeben: wenn kein Taster gedrückt 0> sonst 1?>> gibt es 4 Zustände: kein Taster, Taster 1, Taster 2 , Taster 1 und 2> gedrückt.
Ist das nicht schon die Antwort auf deine Frage?
M. H. schrieb:> So würde eine Flankenerkennung (fallen) für einen Gnazen Port gehen. Ist> zwar für PIC, dürfte sich aber leicht auf einen AVR übertragen lassen.>>
1
>PORTBnew=PORTB;
2
>flankeB=~PORTBnew;
3
>flankeB=flankeB&PORTBold;
4
>PORTBold=PORTBnew;
5
>
Sicher schön kurz, aber wenn er nur die zwei Taster auswerten will und
muss, den Rest des Ports noch braucht, dann muss er eh noch was
anhängen.
Der letze Code war doch schon recht kurz.
F. Fo schrieb:> Sicher schön kurz, aber wenn er nur die zwei Taster auswerten will
schlimmer.
Er hat 2 physikalische Taster, will aber 3 logische Taster.
Die Pins werden nur eingelesen und nicht beschreiben. Wenn man wie ich
nur 3 Tasten auswerten will werden die andern Bits der Variable flanke
einfach ignoriert.
M. H. schrieb:> Die Pins werden nur eingelesen und nicht beschreiben. Wenn man wie ich> nur 3 Tasten auswerten will
Nochmal.
Er hat keine 3 Taster.
Er hat nur 2 real vorhandene.
Er will aber im Programm 3 Tastenzustände unterscheiden:
A gedrückt
B gedrückt
A + B gedrückt.
Karl Heinz schrieb:> M. H. schrieb:>> Die Pins werden nur eingelesen und nicht beschreiben. Wenn man wie ich>> nur 3 Tasten auswerten will>> Nochmal.> Er hat keine 3 Taster.
Ich habe die 3 Tasten nur als Beispiel genommen weil ich das in meinem
Code so hatte.
Und um das mit den 2 gleichzeitigen Tasten zu erkennen muss man ein
längeres delay in die schleife einbauen und das 3. if so machen:
if(flankeB&(1<<1)&&flankeB&(1<<2))
Oder man merkt sich die Flanke für ein paar Schleifendurchläufe.
Karl Heinz schrieb:> M. H. schrieb:>> Die Pins werden nur eingelesen und nicht beschreiben. Wenn man wie ich>> nur 3 Tasten auswerten will>> Nochmal.> Er hat keine 3 Taster.> Er hat nur 2 real vorhandene.>> Er will aber im Programm 3 Tastenzustände unterscheiden:> A gedrückt> B gedrückt> A + B gedrückt.
Das geht nur, wie du schon angedeutet hast, wenn er die "menschliche
Komponente" mit einbezieht. Also muss er den Zeitrahmen vorgeben und
auch in der Abfrage erfassen, dazu noch ein Sicherheitsmechanismus, der
alle Abweichungen als ungültig erklärt.
Da ist die länge des Codes eher Nebensache.
Das wäre eine mögliche Lösung. Wenn man die schleife z.B. alle 10ms
ausführt dann kann man erkennen ob innerhalb von 200ms beide Tasten
gedrückt wurden. Ich persönlich würde den Code nicht als schleife
sondern in einem Timer Interrupt ausführen.
Die variable zaeler merkt sich 200ms lang ob eine Taste gedrückt wurde.
Wurden beide Tasten einmal in den letzten 200ms gedrückt ist die
Bedingung "zaeler1&&zaeler2" wahr.
Hi
Immer, wenn's etwas kompliziert erscheint, hilft eine Skizze. In diesem
Fall ein Signalbild. Ich denke, das sagt mehr als tausend Worte.
Gruß oldmax