Forum: Mikrocontroller und Digitale Elektronik 3 Tasten an einem Pin


von henry (Gast)


Lesenswert?

Hi Leute,
zuerst ein sehr grosser Dank an alle Leute. Echt ein tolles Forum :-)

meine Frage Wäre.
Ich habe an einem Bord drei tasten, die über ein Spannungsteilerregler 
funktionieren.
z.B wenn ich eine taste drücke bekomme ich 2,3V, die andere, 1,7V, die 
andere 1,3V.
keine nix.
ich habe jetzt diese tasten an einem Pin eines Tiny45 geschlossen.
ich möchte jezt, wenn ich auf die erste Taste drücke, (initialisierung) 
an einem LCD bekommen
zweite(Messungen anfangen)
dritte(Messungen speichern)

die Frage ist muss ich jetzt mit einem ADC arbeiten und die Fälle 
einzeln definieren, oder gibts eine andre Lösung.

Ich wäre auch sehr dankbar, wenn ein Beispiel oder etwas ähnliches als 
ein C Code zur verfügung stände :-)

merci

von Falk B. (falk)


Lesenswert?

@  henry (Gast)

>die Frage ist muss ich jetzt mit einem ADC arbeiten und die Fälle

Ja.

>einzeln definieren, oder gibts eine andre Lösung.

Fällt mit spontan nix ein.

MfG
Falk

von henry (Gast)


Lesenswert?

danke für die Atnwort :-)
noch wäre ein Beispile von sehr grossem nutzen für mich, da ich Anfänger 
im Berecih bin. Hat jemand villeicht ein Beispiel was das selbe oder 
ähnlicheres beschreibt
vielen Dank

von Peter D. (peda)


Lesenswert?

Hier ein Beispiel für 12 Tasten:

Beitrag "Tastenmatrix auslesen über nur 2 Leitungen"


Peter

von Rick Dangerus (Gast)


Lesenswert?

>einzeln definieren, oder gibts eine andre Lösung.

Einen "poor man ADC":

Einen Kondensator an den Pin anschliessen, Pin auf high schalten, C 
laden lassen. Die Tasten mit unterschiedlich großen Widerständen auch an 
den Pin. Wenn der Pin auf low geht, dann ist eine Taste gedrückt. Dann 
schnell das C nochmal aufladen und die Zeit messen bis der Pin auf low 
geht.

Die Methode funktioniert nicht ganz sicher, da z.B. zu kurze oder 
mehrfache Tastendrücke Fehlmesssungen verursachen. Außerdem ist der 
Softwareaufwand u.U. nicht unerheblich.

Rick

von Terry (Gast)


Lesenswert?

Es müssen nur genügend kurze Wiederholungen gefahren werden, dann ist 
das auch sicher. Unterschiedliche Perioden zu checken, z.B. mit einem 
Speew. Ich fahre so eine 128 x 128 Schaltmatrix mit bis zu 32 x 32 
unterschiedlichen Zutsänden mit nur 256 FPGA Pins ab ( 4 "analoge" 
Zustände).

von henry (Gast)


Angehängte Dateien:

Lesenswert?

Nochmal bessten Dank für die wertvolle Hinweise und Ratschläge.
Hab die Tastennmatrix auch gesehen, die ist etwas komplizierter als das 
was ich habe, ich habe gerade eine kleine Zeichnung gemacht und die 
Tasten die ich verwendet habe zu beschreiben.
Nur wie gesagt habe ich paar probleme mit dem Programmierung.
wollte die drei Fälle (beim Drücken auf Taste) mittels ADC einzeln 
beschreiben.
Ich bedanke mich im Voraus bei euch Allen
Henry

von lkmiller (Gast)


Angehängte Dateien:

Lesenswert?

Das wird so ohne weiteres nicht gehen, der gemeinsame Widerstand muss an 
Masse und der Sternpunkt an den Analogeingang.

So wie im Bild oben hab ich es schon mal gemacht:
R1=6k8, R2=3k3, R3=2k2, R4=2k2

Damit kann ich dann auch mehrfach betätigte Tasten durch
einen einfachen Vergleich gegen definierte Grenzen im AD-Wert erkennen.
Mit 3 Tasten gibt es 8 Möglichkeiten -->  nötig sind 7 Grenzwerte.

keine Taste ->                0V
S1 -> 5V * R4/(   R2+R3+R4) = 1,42V
S2 -> 5V * R4/(R1+   R3+R4) = 0,98V
S3 -> 5V * R4/(R1+R2+   R4) = 0,89V
S1+S2 ->  5V * R4/(R3+R4)   = 2,5V
:
S1+S2+S3   ->                 5V

Ergibt 8 Sollwerte, die Grenzen müssen natürlich passend 
dazwischenliegen.

von henry (Gast)


Angehängte Dateien:

Lesenswert?

Da hast du völlig recht, ich hab nämlich die folgende schaltung in 
meinem Bord, und die tasten sind schon dran.
beim Drücken von Tasten bzw Schliessen von Schalter
1k --> 4,73V
10k --> 2,6V
33k --> 1,21V
beim Code habe ich immer probleme

ich habe eine ADwandlung definiert mit der Funktion (ADkanallesen) +

float DAC( float dac)
 {
   float u_ein = 0;
   u_ein =(dac*u_ref)/1024;
   return(u_ein);
 }

und ich will die Tasten dann einzeln definieren
z.B

void Tastenprüfung(){
 Taste = ADkanallesen(3);
U = DAC(Taste);
return(U);

und dann will ich mit einer if anweissung die tasten auseinderhalten.
aber weiss nicht wirklich wie.???
bin echt durcheinander
und sorry wenn meine Fragen etwas blöd sind :(

von Peter D. (peda)


Lesenswert?

henry wrote:

> und sorry wenn meine Fragen etwas blöd sind :(

Blöd ist nur, daß Du die Antwort wüßtest, wenn Du nur mal meinen Link 
angesehen hättest.

Auch ist es Unsinn, einen 10bit-Wert auf float aufzuplustern.
Man läßt besser das ganze float-Rechnen den Präprozessor machen und der 
trägt dann ganz profan die entsprechenden 16Bit-Werte in die 
Vergleichstabelle ein.
Sieht man auch in dem Link, wie das geht.


Peter

von lkmiller (Gast)


Lesenswert?

Ein uC ist ein binärer Sack.
Du machst dem das Leben einfacher, wenn du auch binär denkst.

Z.B. bekommst du vom AD-Wandler keine Spannung, sondern eine Zahl, die 
von 0..1023 geht. Es macht für die Tastenauswertung keinen Sinn, in 
einem Zwischenschritt die Spannung auszurechen und dann aus der Spannung 
die Taste.

Der uC kann auch kein float rechnen. Versuche deshalb immer soweit 
möglich in integer (also char, short und long) zu rechnen. Und auch 
nicht mit grösserer Breite, als unbedingt nötig. Wenn sich eine Variable 
also zwischen 0 und 200 bewegen kann, dann reicht ein unsigned char 
vollkommen aus.

Also binär denken:
1k  --> 4,73V --> 969
10k --> 2,6V  --> 532
33k --> 1,21V --> 248
10-Bit-Wandler bezogen auf Vref=5V
(könnte wie von Peter Danegger vorgeschlagen auch der Präproz erledigen)

Ich gehe mal davon aus, dass das AD-Werteinlesen mit der Funktion 
ADkanallesen(3) schon mal klappt. Dann gehts z.B. so weiter:
1
char Tastenabfrage(void){
2
   unsigned char taste;
3
   unsigned short adwert;
4
   adwert = ADkanallesen(3); // Annahme: 0..5V --> 0..1023
5
   taste  = 0;
6
   if      (adwert > 900) taste=1; 
7
   else if (adwert > 500) taste=10; 
8
   else if (adwert > 200) taste=33;
9
   return taste;
10
}
taste ist null, wenn nix gedrückt, sonst ungleich null. Aber Achtung 
wegen Fehlerkennung bei mehreren gleichzeitig gedrückten Tasten.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Angehängte Dateien:

Lesenswert?

>Aber Achtung wegen Fehlerkennung bei mehreren gleichzeitig gedrückten >Tasten.

Darum baut man die Schaltung auch wie im Anhang. Man kann gleiche 
Widerstandswerte nehmen und bei Mehrfachbedienung der Tasten gewinnt 
die, die dem Controller am nächsten ist. Zu einer Fehlerkennung einer 
gerade nicht gedrückten Taste kann es hier nicht kommen.

von Igor M. (bastel-wastel)


Lesenswert?

Sowas hab ich auch schon öfters verwendet. Bei mir waren es 14 Tasten an 
einem Pin. Hab die Idee vom C-Control II. Siehe hier:
http://www.spiketronics.com/downloads/G_MANUAL_BA003_APPLI_BUILDIN_A5.pdf
Seite 11

Durch die Anzahl von 14 Taster sind nur die oberen vier Bits der 
AD-Wandlung nötig. (0000 und 1111 ergeben keinen Tastenwert). Ansonsten 
kann man direkt das AD-Ergebnis mit einer Taste verknüpfen. Bei mir 
funktioniert das Ganze wunderbar. Mit ungenauen Widerständen und einer 
fliegenden Verdrahtung ist das Ganze dann aber nicht mehr so stabil ;-)

In deiner Anwendung musst du halt den Spannungsteiler entsprechend 
ausrechnen. Am besten nimmst du nen Teiler, so dass der erste Taster auf 
1,7V zieht, der zweite auf 3,4V und der Dritte auf 5V.
Dann reicht es, wenn du die oberen zwei Bits auswertest:
00 -> kein Taster
01 -> Taster 1
10 -> Taster 2
11 -> Taster 3

von henry (Gast)


Lesenswert?

:-) hee Leute vielen dank, jetzt geht mir mitllerweile ein licht an.

Das Link was mir Peter geschickt hat, ist richtig sehr gut programmiert 
und ich hab es mehrmal angeschaut, aber als Anfänger habe ehrlich gesagt 
nicht alles verstanden, manche Befehle sehe ich soger zum ersten mal.
aber ich bedanke mich ganz herzlich bei ihm und bei euch allen.
:-)

Henry

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.