Forum: Mikrocontroller und Digitale Elektronik Probleme mit Pollin-Tastatur SAMWELL 702772-8


von Christoph B. (cborowski)


Lesenswert?

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_t getKeyInput() {
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_t pin=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_t pin=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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Christoph B. (cborowski)


Lesenswert?

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

von Christoph B. (cborowski)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Christoph B. (cborowski)


Lesenswert?

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

von Dirk W. (Gast)


Lesenswert?


von Hannes L. (hannes)


Lesenswert?

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...)

von Hannes L. (hannes)


Lesenswert?

Dirk W. wrote:
> http://www.pollin.de/shop/downloads/D420403D.PDF

Dieses Pseudo-Datenblatt ist uns bereits bekannt, trotzdem danke...

...

von Christoph B. (cborowski)


Lesenswert?

@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

von Christoph B. (cborowski)


Angehängte Dateien:

Lesenswert?

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_t getKeyInput() {
2
  uint8_t i;
3
  uint16_t result;
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
36
 
37
  return result;
38
}

  

von Christoph B. (cborowski)


Lesenswert?

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)?!

von Hannes L. (hannes)


Lesenswert?

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.

...

von Christoph Borowski (Gast)


Lesenswert?

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

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.