PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Uralt Tastenfeld benutzen



pete1612
02.08.2012, 17:42
Hallo,
hier eine kleine Anleitung an alle die, die in die gleiche, glückliche Lage kommen wie ich und einen kleinen Schatz im E-Schrott entdecken.
Ich frage mich immer, wie so eine wundervoll verarbeitete Tastatur in den Schrott gelangt.... :(

Es handelt sich um ein Tastenfeld aus der Industrie zur Eingabe von Messwerten in ein Qualitätssicherungsprogramm...(?)
Böhme&Weihs hat mir ersteinmal nichts gesagt, aber die Verarbeitung spricht für sich. Zeit sich das gute Stück einmal näher anzusehen.

Die abgerissene Anschlussleitung hat fünf Adern...das kann man ja leicht von außen sehen.
Nach einer Grundreinigung und Auseinanderschrauben des Geräts versteckt sich unter dem Tastenfeld ein alter Motorola-Controller.
Schnell klar ist, dass zwei der fünf Adern auf jeden Fall Versorgungsspannung führen müssen. Da auf der Platine keinerlei Bauteile zur
Spannungsregelung zu finden sind und im Datenblatt des Controllers wie zu erwarten 5V erwünscht sind, soll er die haben.
Die betreffenden Leitungen für die Versorgungsspannung zu finden ist am einfachsten und schnell erledigt.
Aber wozu die anderen Leitungen???

Mit dem Multimeter gegen Masse gemessen führten zwei von drei Drähten +5V und der letzte Draht hatte kein festes Potential. Dazu später mehr....

Bei den Anschlüssen mit dem festen Potential musste es sich also um die Datenleitungen handeln. Takt- und Datenleitung war zu vermuten.

Also einen ATMEGA8 genommen und schnell ein Programm geschrieben mit einem einfachen Zähler, der Impulsflanken zählt.
grüner Draht: bei jedem Tastendruck (Zahlen) die gleiche Anzahl von Flanken = Taktleitung
brauner Draht: nicht bei jeder Taste (Zahlen) die gleiche Anzahl von Impulsen = Datenleitung

Bei den Pfeiltasten und den Ja/Nein Tasten + Entf. Taste gab es auf der Taktleitung mehr Impulse als bei den Zahlen und F-Tasten. Okay..(?)

Nach Erweiterung des Programms stellte ich fest, dass bei jedem Tastendruck ein Byte gesendet wird und bei dem Loslassen einer Taste zwei Bytes gesendet werden. Bei den Pfeiltasten sogar zwei beim Drücken und drei beim Loslassen.

Nach etwas Tüfteln und Überlegen hatte ich folgendes Protokoll "geknackt":
Bit 1: Start-Bit
Bit 2-9: Daten-Bits
Bit 10: Parity-Bit
Bit 11: Stop-Bit

Et voila...das sieht doch einem PS/2 - Protokoll sehr ähnlich. Ich hab mich allerdings noch nicht damit befasst, ob die Scancodes auch identisch sind mit einer PC-Tastatur....

Beim Betätigen einer Taste (Zahl) werden also bei 12 Taktflanken diese 11 Bits auf der Datenleitung übertragen. (Datenbyte = Tastencode)
Beim Loslassen der Taste werden bei 24 Taktflanken 22 Bits übertragen. (Datenbyte1 = bei allen Tasten gleiches Bytemuster, Datenbyte2 = Tastencode)

Beim Betätigen einer Pfeiltaste läuft das ähnlich, nur das beim Betätigen und Loslassen ein Byte mehr gesendet wird.
Dieses Byte ist wieder eingepackt in ein Start, Stop und Parity-Bit und ist dem Datenbyte vorangestellt. Es enthält immer den Wert 31 im Datenbyte.
So lässt sich also erkennen, dass es sich bei der gedrückten Taste um keine Zahleneingabe sondern um ein Funktionszeichen handelt.

Hier ein kleiner Programmausschnitt (nicht ideal gemacht, vorallendingen hätte man einen Interrupt-Eingang nehmen können für die Daten- und Taktleitung, aber bei 8.000 MHz kann man das auch gut auf dem Wege machen)



#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "peter_avr.h"
#include "LCD_display_peter.h"

#define takt (PINC&(1<<5))
#define data (PINC&(1<<3))
#define check (PINC&(1<<4))

struct{
unsigned char x0:1;
unsigned char x1:1;
unsigned char x2:1;
unsigned char x3:1;
unsigned char x4:1;
unsigned char x5:1;
unsigned char x6:1;
unsigned char x7:1;
}M0;


int main(void)
{
DDRD|=(1<<2);DDRC&=~(1<<5)|(1<<4)|(1<<3);
TIMSK |=(1<<TOIE0);
TCCR0 |=(1<<CS01);

char text[9]={0,0,0,0,0,0,0,0,0},text1[5]={0,0,0,0,0},sign[2]={0,0};
unsigned char ccnt=0;
int x=0,y=0;
sei();

lcd_init();
lcd_send(COMMAND,LCD_CLEAR);
lcd_write("Byte-Muster:");
lcd_set_cursor(2,0);

while(1){

ccnt>9 ? (PORTD|=(1<<2)) : (PORTD&=~(1<<2));

if(ccnt>9&&x!=31){ccnt=0;int_to_str(x,&text1);lcd_write(text);
lcd_set_cursor(2,12);lcd_write(text1);
lcd_set_cursor(1,14);lcd_write(sign);
_delay_ms(1000);x=0;y=0;lcd_send(COMMAND,LCD_CLEAR );
lcd_set_cursor(1,0);lcd_write("Byte-Muster:");lcd_set_cursor(2,0);}

if(!takt){M0.x0=1;} if(takt&&M0.x0==1){ccnt++;M0.x0=0;}

if(ccnt>=1&&ccnt<=8){
if(!data){x|=(1<<ccnt-1);} else{x&=~(1<<ccnt-1);}}

if(ccnt>9&&x!=31){
switch(x){
case 182: sign[0]=',';break;
case 186: sign[0]='0';break;
case 214: sign[0]=' ';break; /*Leerzeichen*/
case 233: sign[0]='1';break;
case 225: sign[0]='2';break;
case 217: sign[0]='3';break;
case 218: sign[0]='4';break;
case 209: sign[0]='5';break;
case 201: sign[0]='6';break;
case 194: sign[0]='7';break;
case 193: sign[0]='8';break;
case 185: sign[0]='9';break;
case 134: sign[0]='+';break;
case 132: sign[0]='-';break;
case 165: sign[0]='R';break; /*Eingabe*/
case 137: sign[0]='E';break; /*Escape*/
case 250: sign[0]='A';break; /*F1*/
case 249: sign[0]='B';break;
case 251: sign[0]='C';break;
case 243: sign[0]='D';break;
case 252: sign[0]='E';break;
case 244: sign[0]='F';break; /*F6*/
case 196: sign[0]='J';break; /*JA*/
case 206: sign[0]='N';break; /*NEIN*/
case 153: sign[0]='L';break; /*Backspace*/
}}

if(ccnt>12&&x==31){
if(!data){y|=(1<<ccnt-13);} else{y&=~(1<<ccnt-13);}
ccnt>21 ? (x=y):(x=x);

switch(x){
case 70: sign[0]='d';break; /*Pfeil runter*/
case 197: sign[0]='u';break; /*hoch*/
case 202: sign[0]='l';break; /*links*/
case 69: sign[0]='r';break; /*rechts*/
case 71: sign[0] ='e';break; /*Entf.*/
}
}

}return(0);
}

Überigens ist der Draht ohne festes Potential der Masseanschluss für einen Piezo-Signalgeber im Gehäuse. Die Masse kommt über die Datenleitung und gibt dem Piepmatz Feuer zum Krachmachen. Erfrischend simpel gemacht. Wird halt überall nur mit Wasser gekocht.

Wer also mal iwann so ein Tastenfeld findet, der hat es jetzt leichter als ich mit dem Beitrag hier.

Ich werde bei Zeiten iwann einen kleinen ATtiny an das Tastenfeld hängen, der als Eingabepuffer arbeitet und aus dem sich dann ein größerer µC bei Zeiten eine eingegebene Zeichenkette abholen kann....

Gruß
Pete:cool:


22944

5Volt-Junkie
03.08.2012, 17:22
Tolle und vor allem spannende Anleitung! Klingt fast wie aus einem Drehbuch kopiert. Reverse Engineering vom Feinsten :)

pete1612
03.08.2012, 17:29
Vielen Dank für die gute Kritik =)

ikarus_177
17.08.2012, 08:59
Faszinierend :p
Schön zu lesen auch, dass man (wie in dem Fall hier) nicht unbedingt auf ein DSO oder einen Logicanalyser angewiesen sein muss!