www.mikrocontroller.net

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


Autor: Christoph Borowski (cborowski)
Datum:

Bewertung
0 lesenswert
nicht 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:
int8_t getKeyInput() {
  // erste Phase zur Erkennung von 0, 2, 4, 6, 8, Cursor hoch (10) & Cursor runter (-2)
  // PD1 als Eingang schalten mit internem Pullup
  DDRD &= ~(1<<PD1);
  PORTD |= (1<<PD1);
  for (int8_t pin=1; pin<8; pin++) {
    // nacheinander die Eingänge PD1-PD7 überprüfen
    // falls low  => Taste gedrückt
    // falls high => Taste nicht gedrückt
    if (!(PIND & (1 << pin))) {
      return ((pin-2) * 2);
    }
  }
  // zweite Phase zur Erkennung von 1, 3, 5, 7, 9
  // PD1 als Ausgang ohne internen Pullup
  DDRD |= (1<<PD1);
  PORTD &= ~(1<<PD1);
  for (int8_t pin=2; pin<7; pin++) {
    // nacheinander die Eingänge PD2-PD6 überprüfen
    // falls low  => Taste gedrückt
    // falls high => Taste nicht gedrückt
    if (!(PIND & (1 << pin))) {
      return ((pin-2) * 2) + 1;
    }
  }
  // -1 als Rückgabewert gibt an, dass keine Taste gedrückt ist
  return -1;
}

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Christoph Borowski (cborowski)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph Borowski (cborowski)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Christoph Borowski (cborowski)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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...)

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dirk W. wrote:
> http://www.pollin.de/shop/downloads/D420403D.PDF

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

...

Autor: Christoph Borowski (cborowski)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph Borowski (cborowski)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
int16_t getKeyInput() {
  uint8_t i;
  uint16_t result;
 
  ADCSRA = (1<<ADEN) |   // ADC aktivieren
      (1<<ADPS2) |  // Frequenzvorteiler auf 128 setzen,
      (1<<ADPS1) |  // da der ATmega mit 14,7MHz läuft
      (1<<ADPS0);

  ADMUX = 0x00; // Kanal waehlen, hier ADC0
  ADMUX |= (1<<REFS0);    // AVcc als Referenzspannung nutzen 
 
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
  ADCSRA |= (1<<ADSC);    // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) {
     ;     // auf Abschluss der Konvertierung warten 
  }
  result = ADCW;  // ADCW muss einmal gelesen werden,
                  // sonst wird Ergebnis der nächsten Wandlung
                  // nicht übernommen.
 
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
  result = 0; 
  for( i=0; i<4; i++ )
  {
    ADCSRA |= (1<<ADSC);  // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ) {
      ;            // auf Abschluss der Konvertierung warten
    }
    result += ADCW;      // Wandlungsergebnisse aufaddieren
  }
  ADCSRA &= ~(1<<ADEN);    // ADC deaktivieren (2)
 
  result /= 4;        // Summe durch vier teilen = arithm. Mittelwert
 
  return result;
}

  

Autor: Christoph Borowski (cborowski)
Datum:

Bewertung
0 lesenswert
nicht 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)?!

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Christoph Borowski (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.