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
@ 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
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
>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
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).
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
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.
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 :(
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
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.
>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.
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
:-) 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.