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:
>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