PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Probleme mit 4x4 Tastatur am ADC



TrainMen
13.05.2011, 18:19
Ich habe mir eine 4x4 Matrix Tastatur gebaut und nun einige Probleme.
Ich hatte vor dieser 4x4 Tastatur eine 1x5 Tastatur gebaut (die von der M32) und diese Erfolgreich eingebunden. Ich hatte einfach in den LIBs die Keyabfrage kopiert und an die entsprechenden Variablen und Funktionen die Buchstaben xyz zugefügt. Alles funktionierte. Ich hatte nun 5 zusätzlich Tasten.
Meine 4x4 Tastatur kann ich wunderbar über einen ADC einlesen und bekomme von jeder Taste einen Wert (208,221,233,246 die erste Reihe) diese 16 Werte habe ich nun in meiner vorigen (1x5) eingegeben (und natürlich ergänzt). Ich bekomme aber nur von der Taste einen Ausgabe, die den Wert (ADC) 920) hat. Auf die anderen Tasten wird bei der Ausgabe garnicht reagiert.
Ich weiss garnicht wie ich das alles in Worte fassen soll.
Ich hoffe ihr habt mich verstanden, sonst fragt nach.
mfG TrainMen

Dirk
13.05.2011, 22:14
Ich hoffe ihr habt mich verstanden, sonst fragt nach.
Eigentlich must DU dein Problem so beschreiben, dass es verständlich ist.
Bei deiner Beschreibung fehlt z.B. die Lesefunktion, die du für die 4x4 Tastatur geschrieben hast.

RolfD
14.05.2011, 00:43
"diese 16 Werte habe ich nun in meiner vorigen (1x5) eingegeben"

Die Werte sind ja Ergebnisse eines Spannungsteilers vermute ich mal.. und abhängig von den genauen Werten der Widerstände... mal abgesehn davon, das du Wertebereiche prüfen müsstest und keine genauen Zahlen versteh ich nicht was das mit der 1x5 Tatstatur zu tun hat. Die wird natürlich andere Werte erzeugen und 920 klingt nach sehr weit gegen + gezogen... oder nach nem Fehler beim zusammensetzen von 2 Byte zu einem 16-bit Int.

Sorry aber mit der Fehlerbeschreibung ist nichts anzufangen.
Mich würde daher auch der Schaltplan neben dem korrekt beschriebenen Fehler interessieren.

TrainMen
14.05.2011, 03:15
Ich ahnte das man das nicht versteht.
@Dirk
Es ist die selbe Lesefunktion der Keys die in der M32 Lib benutzt wird nur lese ich hier den ADC 7 ein und wenn die 1x5 Tastatur da dran hängt funktioniert ja auch alles. Zum Auswerten nehme ich dann auch die Keyabfrage aus dem M32 Beispiel.
@Rolf
Die Tastatur wird hier beschrieben.
https://www.roboternetz.de/phpBB2/viewtopic.php?t=20625
Natürlich erzeugt die 4x4 andere Werte wie die 1x5. Ich wollte damit nur sagen das die 1x5 funktioniert. Ich habe doch nichts anderes getan als die ersten 5 Werte aus der Funktion der Lib an die 4x4 Tastatur angepasst und dann noch 11 hinzugefügt. Wie ich ja schon beschrieben habe, bekomme ich ja auch für jede Taste einen Wert. Also gehe ich doch davon aus das mit der Tastatur alles in Ordnung ist. Nur mit der Auswertung klappt es eben nicht.
mfG TrainMen

RolfD
14.05.2011, 05:46
Ah.. so langsam kommts....
Du verwendest eine/die Funkton ähnlich/gleich wie void task_ADC(void) zum Auslesen der Werte?
Du fragst einen anderen ADC Port ab... ADC 7?
Du hast aber auch gesehen:


if(current_adc_channel == 7)
current_adc_channel = 0;
else
current_adc_channel++;
Liest du also die Keys deiner 4x4 und der 1x5 parallel ein?
Ich frage nicht umsonst nach der Verschaltung, weisst du...
Warum nutzt du keinen der vielen freien ADC Ports statt den ADC0 2 mal zu belegen? Zumindest für die Fehlersuche...

Die Auswertung... ist ja letztlich das :


if(adcKeypad < 830) pressedKeyNumber = 5;
if(adcKeypad < 790) pressedKeyNumber = 4;
if(adcKeypad < 700) pressedKeyNumber = 3;
if(adcKeypad < 580) pressedKeyNumber = 2;
if(adcKeypad < 50) pressedKeyNumber = 1;
Da hast du also deine Werte für die 16 keys eingegeben/erweitert?
Ich sagte schon mal... du darfst keine genauen Zahlen abfragen sondern Bereiche
Du gabst an: 208,221,233,246, ich würde also in der Abfrage auf jeder Zahl 5 oder 10 addieren... wird aber nicht das Problem sein...

Du sprachst von Wert (ADC) 920 .. das klingt mir immer noch als sehr hoch... bist du sicher das nicht eine der Tasten klebt?
Erzeugen alle Keys 920 ?
Und wie bist du an die Werte um 230 gekommen wenn die Tastatur nun 920 produziert?

hast du den Schaltplan mal darauf hin abgeklopft, ob evtl parasitäre Widerstände sich Gegenseituig beeinflussen? Bei dem Schaltplan aus dem tread liegt z.B. ein 3,3 K gegen GND, die anderen Widerstände dürften jedoch nicht wirken wenn keine Taste gedrückt ist...

Sorry... langsam verstehe ich was du willst aber es fehlen immer noch Massenweise infos.
Poste doch mal bitte wie Dirk sagte die komplette Funktion.

Achso.. und wenn du schon von Anfang an das Gefühl hast wir verstehen es nicht.. wärs gut nachzudenken wie man das verständlicher darstellen kann, oder? Support ist kein Ratespiel.

TrainMen
14.05.2011, 11:02
hier mal der code aus der m32 LIB nur eben mit meinen werten


// KeyLeiste:
uint8_t getPressedKeyNumberLeiste(void)
{
uint16_t keysLeiste;
keysLeiste = readADC(ADC_7);
if(keysLeiste < 1020) {
nop();
nop();
nop();
keysLeiste += readADC(ADC_7);
keysLeiste >>= 1;
}
// das ist der Teil der mit 1x5 Tastatur funktioniert
if(keysLeiste < 50) // gemessener Wert 0
return 1;
if(keysLeiste < 580) // gemessener Wert 510
return 2;
if(keysLeiste < 700) // gemessener Wert 682
return 3;
if(keysLeiste < 790) // gemessener Wert 767
return 4;
if(keysLeiste < 830) // gemessener Wert 818
return 5;
return 0;
// 1x5 Code ENDE



// Das ist der 4x4 Code, der nicht funktioniert
/*

if(keysLeiste < 210) // gemessener Wert 208
return 1;
if(keysLeiste < 223) // gemessener Wert 221
return 2;
if(keysLeiste < 235) // gemessener Wert 233
return 3;
if(keysLeiste < 248) // gemessener Wert 246
return 4;
if(keysLeiste < 262) // gemessener Wert 260
return 5;


if(keysLeiste < 283) // gemessener Wert 281
return 6;
if(keysLeiste < 304) // gemessener Wert 302
return 7;
if(keysLeiste < 325) // gemessener Wert 323
return 8;
if(keysLeiste < 361) // gemessener Wert 359
return 9;
if(keysLeiste < 402) // gemessener Wert 399
return 10;
if(keysLeiste < 444) // gemessener Wert 442
return 11;
if(keysLeiste < 492) // gemessener Wert 490
return 12;
if(keysLeiste < 550) // gemessener Wert 548
return 13;
if(keysLeiste < 647) // gemessener Wert 645
return 14;
if(keysLeiste < 768) // gemessener Wert 766
return 15;
if(keysLeiste < 922) // gemessener Wert 920
return 16;
*/
return 0;

}
//-----------------------------------------------------------------------
uint8_t checkPressedKeyEventLeiste(void)
{
static uint8_t pressed_keyLeiste = 0;
if(pressed_keyLeiste) {
if(!getPressedKeyNumberLeiste())
pressed_keyLeiste = 0;
}
else {
pressed_keyLeiste = getPressedKeyNumberLeiste();
if(pressed_keyLeiste)
return pressed_keyLeiste;
}
return 0;
}
//-----------------------------------------------------------------------
uint8_t checkReleasedKeyEventLeiste(void)
{
static uint8_t released_keyLeiste= 0;
if(released_keyLeiste) {
if(!getPressedKeyNumberLeiste()) {
uint8_t tmp = released_keyLeiste;
released_keyLeiste = 0;
return tmp;
}
}
else
released_keyLeiste = getPressedKeyNumberLeiste();
return 0;
}



hier die Programmfunktion, wo ich auf die Tasten reagiere




void tasterzwei(void)
{
uint8_t keyLeiste = getPressedKeyNumberLeiste();

if(keyLeiste) // If a key is pressed... (key != 0)
{

while(getPressedKeyNumberLeiste());
switch(keyLeiste)
{
case 1:
setLEDs(0b0001);
clearLCD();
showScreenLCD("Leiste", "Taste 1","","");

break;
case 2:
setLEDs(0b0010);
clearLCD();
showScreenLCD("Leiste", "Taste 2","","");

break;
case 3:
setLEDs(0b0100);
clearLCD();
showScreenLCD("Leiste", "Taste 3","","");


u.s.w




Liest du also die Keys deiner 4x4 und der 1x5 parallel ein?


Nein, entweder 4x4 oder 1x5


statt den ADC0 2 mal zu belegen?

zum lesen benutze ich den ADC 7 und nur dafür, sonst wird der Port nicht benutzt


Du sprachst von Wert (ADC) 920 .. das klingt mir immer noch als sehr hoch... bist du sicher das nicht eine der Tasten klebt?
Erzeugen alle Keys 920 ?
Und wie bist du an die Werte um 230 gekommen wenn die Tastatur nun 920 produziert?


also ich habe zuerst alle Tasten eingelesen. So kam ich auf 16 Werte so auch auf 233 und jeweils immer 2 dazu auf 235. Diese Werte habe ich dann in die LIB eingetragen. Das eine Taste klebt kann ich ausschliessen (gemessen)
Nein es ist nur eine Taste gewesen und ist jetzt auch nicht mehr nachvollziehbar, da die Tastatur mit der Abfrage garnicht mehr reagiert. Wenn ich als Test die ADC Werte abfrage bekomme ich genau wieder die Werte die ich zuerst bekommen habe.

mfG TrainMen

Dirk
14.05.2011, 11:54
@TrainMen:
Der Code sieht auf den ersten Blick beim groben Überfliegen gut aus.

Was ich checken würde:
1. Um auszuschließen, dass es an deinem Main-Programm liegt, würde ich das Beispiel RP6Control_Buttons.c nur soweit umschreiben, dass es im "switch(key)" Konstrukt auf 16 Tasten reagieren kann und natürlich mit deiner Funktionsbezeichnung (getPressedKeyNumberLeiste) klar kommt.
Wenn es damit funktioniert, muss es am Main Prog liegen.
Was noch möglich wäre:
2. Ich gehe davon aus, dass deine Hardware (neue 16-er Tastatur) in Ordnung ist. Prüfen würde ich da: Sind die Widerstände auch nicht zu hochohmig? Ein Längsstrom von ~1mA sollte es schon über jede Taste sein.
Prellen die Tasten evtl.? Da kann ein 10nF Kondensator am ADC7 helfen.
3. Du verwendest task_ADC() doch nicht gleichzeitig in deinem Main Prog? Das würde sich dann beissen!

TrainMen
14.05.2011, 16:36
@Dirk
zu 1
Also am Main-Programm kann es eigentlich nicht liegen da ja die andere Tastatur funktioniert. Es gibt im Programm nur 2 Funktionen. Tastatur 1x5 und Tastatur 4x4 und in der while schleife wird zum Testen mal die oder die aufgerufen mehr gibt es da nicht, also Identisch mit der RP6Control_Buttons.c. ohne das gepiepe. Es funktioniert nicht mit der 4x4.
zu 2
Also ich geh auch davon aus das meine Bastelei in Ordnung ist. Ich stütze eben meine Aussage darauf das ich ja beim Lesen von ADC7 bei jedem Tastendruck einen unterschiedlichen Wert bekomme.
Hmm Dein Längstrom macht mich Nervös. Ich habe leider gestern beim Messen die Sicherung vom Multimeter kaputt gemacht und habe keine da und flicken will ich da nichts. Aber als ich gestern gemessen habe hatte ich da irgendwas von 0,7? 0,5? 0,3? in Erinnerung ich kann aber beim besten willen nicht mehr sagen wie ich da gemessen habe. Ich hatte jedenfall beide Tastaturen gemessen und 1mA hatte ich nicht.
Prellen bedeutet ja nichts weiter wie anausanausan ? Wenn es denn so wäre müsste ich doch auch bei der Ausgabe vom ADC7 zum Bsp: 200 0 200 0 200 bekommen. Ich bekomme aber nur saubere Ausgaben. Aber das mit dem 10nF Kondensator kann man sich merken.
zu 3
Nein task_ADC() wird nicht benutzt.
mfG TrainMen

Dirk
14.05.2011, 16:56
@TrainMen:
zu 1)
Ok, das scheint es also nicht zu sein. In der Lib hast du also 2 Lesefunktionen, eine für 1x5 (die Original!) und eine für 4x4 (eine selbst geschriebene), die du beide benutzt ... und die 4x4 funktioniert nicht. Vielleicht testest du einmal mit den Original-Funktionen ALLEIN, aber geändert auf ADC_7 und mit deinen ADC-Werten für die Tasten 1..5 (ein etwas hilfloser Vorschlag, aber man hat schon "Pferde kotzen gesehen"!)
zu 2)
Nicht allzu ernst nehmen! Wenn du die Widerstandswerte von meinem Vorschlag (dein Link oben!) für eine ADC-Tastatur genommen hast, liegt der Längsstrom zwischen 0,6 und 1,4mA,- das ist ok.
zu 3)
Ok, wenn du mit der Lib V1.3beta unterwegs bist, dürfte es auch nicht task_RP6M32System() sein. Aber ich denke, du siehst das selbst.

TrainMen
14.05.2011, 17:11
@Dirk
zu 1
ja auf die Idee bin ich auch schon gekommen mit den Original Funktionen, aber das funktioniert nicht. Ich habe da schon alles ausprobiert. Die Originale, meine Funktion nur mit 5 Werten. Ich weiss nicht mehr weiter. Ich habe auch alles immer neu compiliert.Ich glaube ich habe an alles gedacht.
zu 2
ja genau sind die Werte aus Deinem Vorschlag.
zu 3
genau

mfG TrainMen

Dirk
14.05.2011, 17:47
@TrainMen:
Zu 1
Klingt so ...
Zu 2
Ok
Zu 3
---

Zwei ratlose Fragen/Anregungen:
1. Poste doch mal das Prog, mit dem du die 4x4 Tastatur auslesen kannst!
2. Welchen Wert liefert denn deine bisherige 4x4-Funktion bei den einzelnen Tasten (0? Oder abhängig von der Taste?) Definier doch mal eine globale Variable, der in getPressedKeyNumberLeiste() der Wert von keysLeiste zugewiesen wird. Den könnte man dann in Main anzeigen ...
3. Aufpassen mit der Zeile "return 0;"! Die muss immer am Ende nach allen If-Abfragen stehen. Aber, daran hast du auch sicher gedacht. Ich schreibe das nur, weil die Zeile oben in deiner Funktion 2x drin ist ...

TrainMen
14.05.2011, 18:15
zu 1
das sind nur ein paar Zeilen


writeString_P("\nADC7: ");
uint16_t adc7 = readADC(ADC_7);
writeInteger(adc7, DEC);
writeChar('\n');
mSleep(300);

zu 2
versteh ich jetzt nicht was du mit bisherige 4x4 meinst ? Wenn Die 1x5 dran ist bekomme ich beim auslesen 1023 und dann den entsprechenden Wert beim Drücken. Bei der 4x4 bekomme ich beim auslesen 0 und dann denn entsprechenden Wert beim Drücken. Das mit der Variablen habe ich glaube ich schon gemacht, da bekam ich einmal einen Wert von 920 bei Taste 16 und dann immer 0, bei wiederholungen blieb es dann bei 0, ich hab es dann gelassen.
zu 3
ja schon klar, das kommt daher das ich das immer auskommentiere entweder 1x5 oder 4x4
ist jetzt beim kopieren passiert, ist nur einmal drin
mfG TrainMen

Dirk
14.05.2011, 21:34
@TrainMen:
Da bin ich komplett ratlos, sorry.

Noch ein letzter Hinweis:
Da du ja wohl immer die Lib änderst, muss sie ja auch neu kompiliert werden. Klar.
Da habe ich mir schon mal nen Wolf gesucht, weil die Lib nicht neu kompiliert wurde, wenn die .lst und .o Dateien nicht gelöscht wurden.
Aber da fällst du ja wohl nicht drauf rein.

Also: Ich hab keine Ahnung, was da bei dir nicht klappt.
Trotzdem: Viel Erfolg!

TrainMen
15.05.2011, 01:22
@Dirk
Ich habs gelösst, meine Tastatur funktioniert. Wenn es nicht mitten in der Nacht wäre, käme jetzt ein Urschrei.

Die Abfrage in der LIB reicht hier nicht aus. Sie muss konkreter sein. Warum versteh ich zwar nicht aber egal.
Also nicht

if(keysLeiste < 208)

sondern so

if(keysLeiste > 205 && keysLeiste < 210)

Danke für die Hilfe und sorry für mein unvollkommendes Hilfeersuchen.

mfG TrainMen
jeeppie hei he

Dirk
15.05.2011, 02:48
@TrainMen:
Glückwunsch auch mitten in der Nacht!


Warum versteh ich zwar nicht aber egal.
Trotzdem ein Erklärungsversuch, der mir gerade wie Schuppen aus den Haaren fällt:
Der wesentliche Unterschied zwischen deiner 4x4 Matrix-Tastatur und der 1x5 Tastatur auf der M32 ist der ADC-Wert, wenn KEINE Taste gedrückt wird: Er beträgt bei der 4x4 Tastatur 0 (low) und bei der M32-Tastatur 1023 (high).

Das heisst:
Deine Lösung mit der Werteeingrenzung (von 205 bis 210) ist sicher eine perfekte Lösung.
Aber:
Man kann auch in der bisherigen einfacheren Programmlogik bleiben. Die müßte man dann nur so ändern, dass man die Testbedingungen auf GRÖSSER (>) anlegt und mit dem höchsten ADC-Wert anfängt.

So, jetzt gehe ich wieder schlafen.