- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 4 von 4

Thema: Uralt Tastenfeld benutzen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.01.2012
    Beiträge
    75

    Uralt Tastenfeld benutzen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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)

    Code:
    #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


    Klicke auf die Grafik für eine größere Ansicht

Name:	Tastatur.jpg
Hits:	150
Größe:	69,5 KB
ID:	22944

  2. #2
    RN-Premium User Roboter Genie Avatar von 5Volt-Junkie
    Registriert seit
    05.03.2008
    Alter
    36
    Beiträge
    947
    Tolle und vor allem spannende Anleitung! Klingt fast wie aus einem Drehbuch kopiert. Reverse Engineering vom Feinsten

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    09.01.2012
    Beiträge
    75
    Vielen Dank für die gute Kritik =)

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    30
    Beiträge
    601
    Faszinierend
    Schön zu lesen auch, dass man (wie in dem Fall hier) nicht unbedingt auf ein DSO oder einen Logicanalyser angewiesen sein muss!

Ähnliche Themen

  1. c't uralt Einplatinenrechner SET 65
    Von chr-mt im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 09.12.2013, 18:17
  2. Was mit uralt chip anstellen ?
    Von Thalhammer im Forum Offtopic und Community Tratsch
    Antworten: 5
    Letzter Beitrag: 10.06.2012, 22:34
  3. Tastenfeld
    Von NonameXP im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 05.07.2007, 18:53
  4. Tastenfeld !?!
    Von kl_prinz im Forum Elektronik
    Antworten: 16
    Letzter Beitrag: 06.03.2006, 16:56
  5. uralt Quarz mit AVR
    Von linux_80 im Forum Elektronik
    Antworten: 8
    Letzter Beitrag: 02.07.2005, 14:14

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test