Hallo zusammen,
ich versuche gerade die Tastatur SAMWELL 702772-8 von Pollin (Best.Nr.
420 403) am Port D des ATmega8 unter C zum Laufen zu kriegen. Das ganze
nach der Multiplex-Methode aus einem bereits bestehenden Thread
[Beitrag "Zehnertastatur an PIC"].
Der Anschluss an Port D sieht bei mir wie folgt aus:
PD0 = 1 (in Phase 1 Ausgang; in Phase 2 nicht benötigt)
PD1 = 2+12 (in Phase 1 Eingang; in Phase 2 Ausgang)
PD2 = 6 (immer Eingang)
PD3 = 7 (immer Eingang)
PD4 = 8 (immer Eingang)
PD5 = 9 (immer Eingang)
PD6 = 10 (immer Eingang)
PD7 = 11 (in Phase 1 Eingang; in Phase 2 nicht benötigt)
Meine Funktion zur Abfrage einer gedrückten Taste liefert für die Tasten
0-9 als int-Wert 0-9, für Cursor hoch 10, für Cursor runter -2 und für
keine gedrückte Taste -1. Und das ganze sieht in C wie folgt aus:
1
int8_tgetKeyInput(){
2
// erste Phase zur Erkennung von 0, 2, 4, 6, 8, Cursor hoch (10) & Cursor runter (-2)
3
// PD1 als Eingang schalten mit internem Pullup
4
DDRD&=~(1<<PD1);
5
PORTD|=(1<<PD1);
6
for(int8_tpin=1;pin<8;pin++){
7
// nacheinander die Eingänge PD1-PD7 überprüfen
8
// falls low => Taste gedrückt
9
// falls high => Taste nicht gedrückt
10
if(!(PIND&(1<<pin))){
11
return((pin-2)*2);
12
}
13
}
14
// zweite Phase zur Erkennung von 1, 3, 5, 7, 9
15
// PD1 als Ausgang ohne internen Pullup
16
DDRD|=(1<<PD1);
17
PORTD&=~(1<<PD1);
18
for(int8_tpin=2;pin<7;pin++){
19
// nacheinander die Eingänge PD2-PD6 überprüfen
20
// falls low => Taste gedrückt
21
// falls high => Taste nicht gedrückt
22
if(!(PIND&(1<<pin))){
23
return((pin-2)*2)+1;
24
}
25
}
26
// -1 als Rückgabewert gibt an, dass keine Taste gedrückt ist
27
return-1;
28
}
Das ganze wird nun jede Sekunde aus einer Endlosschleife aufgerufen und
das Ergebnis wird auf einem Display ausgegeben. Vorher wird einmalig der
Port D initialisiert (PD0 als Ausgang ohne internen Pullup; PD1-PD7 als
Eingänge mit internen Pullups). Es funktioniert... aber wenn keine Taste
gedrückt wird, so liefert die Funktion den Wert für Cursor runter (-2)?!
Zur Fehlereingrenzung habe ich mal den Code für Phase 1 bzw. Phase 2
auskommentiert. Dann werden halt nur die Zeichen erkannt, die in der
jeweiligen Phase ermittelt werden und es gibtkein Fehlverhalten.
Kann mir jemand bitte erklären, was bei Nutzung beider Phasen schief
läuft? Liegt es irgendwie daran, dass ich vor den Phasen PD1 einmal als
Eingang und einmal als Ausgang schalte? Hat das etwas mit Timing zu tun?
Im voraus schon mal Danke...
Gruss
Christoph
Für digitale Abfrage ist diese Tastatur reudig...
Ich benutze sie daher am ADC und brauche dazu nur einen ADC-Eingang (und
natürlich GND und AVcc). Als Referenz dient AVcc. Es sind auch nur zwei
verschiedene Widerstände im Verhältnis 1 zu 10 bis 1 zu 11 erforderlich,
und zwar 8 mal der kleine und einmal der große. Ich wählte (weil
reichlich vorhanden) 8 SMD-Widerstände von 910 Ohm und einen von 10
kiloOhm. Die Beschaltung ist:
Pin 1
10k
Pin 2
910
Pin 3 --- + AVcc
Pin 4 --- - GND
910
Pin 6
910
Pin 7
910
Pin 8
910
Pin 9
910
Pin 10
910
Pin 11
910
Pin 12 --- ADC In
Der ADC-Wert wird nur mit 5 Bit Auflösung gebraucht, was die
LookUp-Tabelle erträglich klein hält (32 Elemente). Die Zuordnung der
ADC-Werte zu den Tastenwerten ist:
keine Taste - 0
Taste 1 - 15
Taste 2 - 4
Taste 3 - 20
Taste 4 - 6
Taste 5 - 23
Taste 6 - 7
Taste 7 - 25
Taste 8 - 9
Taste 9 - 26
Taste 0 - 2
Taste C-dn - 11
Taste C-up - 10
Solange keine Taste gedrückt ist, fließt auch kein Querstrom durch den
Spannungsteiler, die Schaltung ist also recht stromsparend.
Gleichzeitiges Betätigen mehrerer Tasten ist nicht vorgesehen, ist aber
bei Zifferneingabe auch nicht erforderlich.
Ich habe die SMD-Widerstände auf ein Stück Lochraster-Platine
(Streifenleiterzüge) aufgelötet und diese dann auf die Kontaktstifte
aufgesteckt und verlötet. Somit war keinerlei Änderung an der Platine
der Tastatur erforderlich.
...
Hallo Hannes,
eine sehr interessante und vor allem Pin-sparende Variante der
Abfrage... gefällt mir sehr gut. Werde ich auf jeden Fall ausprobieren.
Erst einmal Danke für deine Antwort.
Gruss
Christph
Hallo zusammen,
bei den zwei unterschiedlichen Ansätzen diese Tastatur, die hier im
Forum nun angegeben wurden (einmal digitale Abfrage, einmal per
AD-Wandler) kam mir eben die Frage in den Sinn, ob jemand einen
Schaltplan dieser Tastatur hat? Entweder aus dem Netzt oder weil er die
Tastatur auseinander genommen hat...
Gruss
Christoph
Christoph Borowski wrote:
> Hallo zusammen,>> ...oder weil er die> Tastatur auseinander genommen hat...
Ich hatte eine zerlegt, finde aber mit Sicherheit den Schmierzettel
nicht wieder...
Es ist eine einfache Matrix 2 x 7, braucht also für normale
Matrixabfrage 9 Portpins.
Pin 1 und 2 sind die Spalten, Pin 6 bis 12 sind die Zeilen. Dass die
Pins 6 bis 12 mit den Pins 19 bis 13 verbunden sind, sieht man ja schon
von außen.
Welche Taste welche Verbindung herstellt, listet das Pollin-Datenblatt
auf.
Die Pins 3 und 4 (22, 21) haben keine Funktion, weshalb ich sie
kurzerhand als Lötstützpunkte für GND und AVCC missbraucht habe.
...
Hallo Hannes,
die Information (Matrixtastatur, 2x7) reicht mir vollkommen aus. Noch
eine Idee... wenn man die Tastatur auseinender nehmen kann, dann müßte
es möglich sein die Leiterbahnen durchzutrennen und aus dem ganzen eine
'vernünftige' 3x4 Matrixtastatur zu machen, die man dann auch vernünftig
über einen Port digital abfragen kann.
Gruss
Christoph
Christoph Borowski wrote:
> Hallo Hannes,>> die Information (Matrixtastatur, 2x7) reicht mir vollkommen aus. Noch> eine Idee... wenn man die Tastatur auseinender nehmen kann, dann müßte> es möglich sein die Leiterbahnen durchzutrennen und aus dem ganzen eine> 'vernünftige' 3x4 Matrixtastatur zu machen, die man dann auch vernünftig> über einen Port digital abfragen kann.
Deshalb hatte ich sie ja geöffnet. Es ist aber mehr Arbeit, als ich
zuerst dachte, die Leiterzüge liegen recht ungünstig. Auch bekommt man
die Tastatur nur durch Verkleben wieder zusammen, das ist mir dann doch
zuviel des Guten.
Daher habe ich mir dann diesen einfachen, aber gut funktionierenden
Spannungsteiler für den ADC ausgedacht, der erst dann Strom fließen
lässt, wenn eine Taste betätigt wird und nur einen ADC-Pin braucht.
Notfalls geht dazu auch Software-ADC über den Analog-Comparator
ADC-loser AVR-Typen. Das sind dann zwei belegte Pins und etwas
Hühnerfutter (R, C), aber immer noch besser als 7 oder gar 9 Pins einer
Matrix...
>> Gruss> Christoph
Gruß,
Hannes
(oder einfach "...", was dasselbe bedeutet...)
@Hannes
Deiner Argumentation läßt sich nichts mehr hinzufügen... keine Arbeit
mit Öffnen, keine alten Leiterbahnen durchtrennen, keine neuen ziehen,
kein Zusammenkleben und keine 7 bzw. 9 Pins verschwenden. Ich bin kurz
mal ein paar Widerstände kaufen... ;)
Und außerdem kann ich mich zum ersten mal aus gutem Grund mit dem
AD-Wandler des ATmega beschäftigen.
Ok, nochmal Danke
Gruss
Christoph
So, jetzt habe ich den Spannungsteiler für diese Tastatur gelötet, das
ganze an den ATmega8 (ADC0) gehängt und lasse mir die vom AD-Wandler
(10Bit Auflösung) ermittelten Werte ausgeben. Was mich nun an der
Werwendbarkeit der Tastatur zweifeln läßt ist, dass je nachdem wie fest
ich eine Taste drücke, die vom AD-Wandler ermittelten Werte ziemlich
schwanken! Z. B. für die Taste 4 zwischen 540 (leicht gedrückt) und 597
(stark gedrückt). Das wäre ja noch nicht ein Problem. Das Problem ist
nur, dass einige Tasten sich damit mit dem ermittelten Wert überlappen.
Z. B. die Taste 3 & 6:
Taste 3: 615-674
Taste 6: 590-666
Mach ich etwas falsch? Ist der Spannungsteiler (siehe angehängtes Bild)
falsch aufgebaut? Oder ist diese Tastatur einfach nur der letzte Mist?
Wo kauft Ihr eigentlich solche Matrixtastaturen und was kosten diese?
Im voraus schon mal Danke für Eure Gedult & die Antworten...
Ach ja, hier der C-Sourcecode der Funktion, die den AD-Wert ausliest:
1
int16_tgetKeyInput(){
2
uint8_ti;
3
uint16_tresult;
4
5
ADCSRA=(1<<ADEN)|// ADC aktivieren
6
(1<<ADPS2)|// Frequenzvorteiler auf 128 setzen,
7
(1<<ADPS1)|// da der ATmega mit 14,7MHz läuft
8
(1<<ADPS0);
9
10
ADMUX=0x00;// Kanal waehlen, hier ADC0
11
ADMUX|=(1<<REFS0);// AVcc als Referenzspannung nutzen
12
13
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
14
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
15
ADCSRA|=(1<<ADSC);// eine ADC-Wandlung
16
while(ADCSRA&(1<<ADSC)){
17
;// auf Abschluss der Konvertierung warten
18
}
19
result=ADCW;// ADCW muss einmal gelesen werden,
20
// sonst wird Ergebnis der nächsten Wandlung
21
// nicht übernommen.
22
23
/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
24
result=0;
25
for(i=0;i<4;i++)
26
{
27
ADCSRA|=(1<<ADSC);// eine Wandlung "single conversion"
28
while(ADCSRA&(1<<ADSC)){
29
;// auf Abschluss der Konvertierung warten
30
}
31
result+=ADCW;// Wandlungsergebnisse aufaddieren
32
}
33
ADCSRA&=~(1<<ADEN);// ADC deaktivieren (2)
34
35
result/=4;// Summe durch vier teilen = arithm. Mittelwert
Anmerkung zu meinem vorherigen Posting... ich habe jetzt die Tastatur am
Spannungsteiler simuliert, indem ich die Kontaktpunkte mit einer
Drahtbrücke verbunden habe & so jeden Tastendruck nacheinander simuliert
habe. So sind die vom AD-Wandler ausgegebenen Werte alle ziemlich
konstant (schwanken höchstens um +/-1). Und vor allem haben alle Tasten
unterschiedliche Werte.
Taste 0: 329-330
Taste 1: 510-511
Taste 2: 499
Taste 3: 682
Taste 4: 602
Taste 5: 767-768
Taste 6: 671
Taste 7: 819
Taste 8: 721
Taste 9: 852-853
Taste up: 758-759
Taste down: 787-788
So ließe sich das ganze auswerten... aber mit der angesteckten Tastatur
(siehe oben)?!
Sorry, meine bisher verarbeiteten Pollin-Tastaturen sind Ok. Vielleicht
hast Du wirklich ein schlechtes Exemplar erwischt? Es sind immerhin
Restposten. Alle dort gekauften Drehgeber funktionieren tadellos, bis
auf einen, der gab einfach keinen sauberen Kontakt. Er wurde dann eben
entsorgt.
Die Schaltung entspricht der von mir verwendeten.
...
Hallo,
um diesen Thread abzuschließen möchte ich hier noch den Grund
nachtragen, wieso der Anschluss der SAMWELL-Tastatur per AD-Wandler
nicht geklappt hat.
Anstelle des benötigten 10kOhm Widerstands wurde mir im Geschäft ein
1kOhm Widerstand (Farbcode für 3'ten Ring von links ist orange statt
rot) verkauft. Und ich habe leider nicht nachgemessen.
Somit werden per Spannungsteiler die Spannungen und damit die
ermittelten AD-Werte der beiden Tastengruppen [0, 2, 4, 6, 8, Cursor
hoch & Cursor runter] und [1, 3, 5, 7, 9] in den gleichen Bereich
abgebildet und lassen sich auch aufgrund der Bauweise der Tastatur und
des resultierenden Verhaltens (leicht bzw. fest drücken) kaum
voneinander unterscheiden.
Leider habe ich die Tastatur inzwischen zu einer 3x4 Tastatur umgebaut,
so dass ich den AD-Anschluss mit richtigem 10kOhm Widerstand nicht mehr
testen kann. Schätze aber, dass es funktioniert.
Gruss
Christoph