Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Tastaturersatz für PC1715 » Themenansicht

Autor Thread - Seiten: -1-
000
05.04.2024, 17:53 Uhr
DL
Default Group and Edit


Analog zum Ersatz für die MC80.3x-Tastatur hier ein Vorschlag für den Betrieb einer PS/2-Tastatur als Ersatz am PC1715 unter Verwendung eines Arduino Nano.
Gibt ja immer wieder Ärger damit oder fehlt ganz...

Hinweis zu den 5V am Port, die scheinen nirgendwo abgesichert zu sein, da können schon mal ein paar Ampere fließen also etwas Vorsicht walten lassen !





Quellcode:

//----------------------------------------------------------------------------------------------------------------
//Emulation Tastatur PC1715 mit PS/2 Tastatur + Arduino Nano und Paul Carpenter's PS2KeyMap+PS2KeyAdvanced library
//----------------------------------------------------------------------------------------------------------------
#include <PS2KeyAdvanced.h>
#include <PS2KeyMap.h>
//#include <Arduino.h> //nur bei VSC
#define DATAPIN 4 //PS/2 DATA
#define IRQPIN  3 //PS/2 CLK
#define PCdata  6 //PC1715 DATAPIN
#define PCclk   5 //PC1715 CLKPIN
//Variablen
uint16_t c,d,rdat;
uint8_t S,x,idx;
//von KeyMap library nicht erzeugte bzw. umdefininierte Key Codes: ,{Taste,Code}
uint16_t Map[][ 2 ] = {
  {PS2_KEY_F1,0xd1},{PS2_KEY_F2,0xd2},{PS2_KEY_F3,0xd3},{PS2_KEY_F4,0xd4},{PS2_KEY_F5,0xcf},{PS2_KEY_F6,0xa0},//F1-6
  {PS2_KEY_F7,0xa1},{PS2_KEY_F8,0xa2},{PS2_KEY_F9,0xa3},{PS2_KEY_F10,0x83},{PS2_KEY_F11,0xc1},{PS2_KEY_F12,0xc2},//F7-12
  {PS2_ALT+PS2_KEY_F1,0xc2},{PS2_ALT+PS2_KEY_F2,0xcd},{PS2_ALT+PS2_KEY_F3,0x8e},//F13-15 Alt+F1-3
  {PS2_KEY_L_ARROW,0x88},{PS2_KEY_R_ARROW,0x86},{PS2_KEY_UP_ARROW,0x8b},{PS2_KEY_DN_ARROW,0x83},//Cursor
  {PS2_KEY_HOME,0x8c},{PS2_KEY_END,0xdd},{PS2_KEY_ENTER,0x9e},{PS2_SHIFT+PS2_KEY_ENTER,0x9d},//Home,S,Enter,NL
  {PS2_SHIFT+PS2_KEY_3,0x00},{PS2_KEY_DIV,0x2d},{PS2_SHIFT+PS2_KEY_DIV,0x5f},//..Minus,Unterstrich
  {PS2_SHIFT+PS2_KEY_F1,0xff}//S0/S1 Umschaltung Shift+F1
  };

//classes
PS2KeyAdvanced keyboard;
PS2KeyMap keymap;

void setup( )
{
//Serial.begin(9600); //Debug
keyboard.begin( DATAPIN, IRQPIN );
keyboard.typematic( 11, 1);
keyboard.setNoRepeat(1);
keyboard.setNoBreak(1);
keymap.selectMap( (char *)"DE" );
pinMode(PCdata, OUTPUT);
pinMode(PCclk, OUTPUT);
}

void loop( )
{
if( keyboard.available() )
  {
  c = keyboard.read( );
  if( c > 0 )
    {
    //Statusbyte setzen  
    x = 0xE0;                           //Status default E0
    if(c & PS2_SHIFT)bitSet(x,1);       //Status für Shift E2
    else if (c & PS2_CAPS)bitSet(x,3);  //Status für Caps E8
    else if (c & PS2_CTRL)bitSet(x,0);  //Status für CTRL E1
    if (S==1)bitSet(x,2);               //Status für S0/S1 E4
    d=keymap.remapKey(c );
    //die aus dem Remap fehlenden Tasten (s.0. codes) einfügen bzw redefinieren
    for( idx = 0; idx < sizeof(Map)/sizeof(Map[0]); idx ++ )
    if( rdat == Map[idx][0]  )          //Taste nachschlagen
     {
     rdat = Map[idx][1]; d &= ~0xFF; d |= rdat; //Code zuweisen                    
     break;
     }
    if(d==0xff)S=!S;                    //S0/S1 Umschaltung
    //Ausgabe  
    if((d>0)&&((d & 0xff)<=0xDD))
     {
      Serialto_pc( x);                  //Statusbyte ausgeben
      Serialto_pc(d & 0xff);            //Tastencode ausgeben    
     }    
    }
  }
}

void Serialto_pc(uint8_t i)    //zum PC1715 übertragen
  {
   //Serial.print((i),HEX); //Debug
   uint8_t z;            //Bitzähler
   //bith();            // original 2x sync?
   //bith();            // geht auch ohne
   bitl();                 //Startbit
   for(z=0;z<8;z++){(i & (1 << z))? bith():bitl();} //Einzelbits auswerten
   bith();                //Stoppbit
   bith();                //Stoppbit
    }

void bith (void)
  //Ausgabe 1-Bit
  {
   digitalWrite(PCdata, LOW);             // Datenbit löschen (weil Daten negiert übertragen)
     digitalWrite(PCclk, HIGH);          //Taktbit setzen
     _delay_us(20);
     digitalWrite(PCclk, LOW);            // Taktbit löschen
  }

void bitl (void)
//1 Ausgabe 0-Bit
  {
     digitalWrite(PCdata, HIGH);         // Datenbit setzen (weil Daten negiert übertragen)
   digitalWrite(PCclk, HIGH);             // Taktbit setzen
   _delay_us(20);
     digitalWrite(PCclk, LOW);             // Taktbit löschen
  }



Es sind noch nicht alle (Sonder-)Tasten verteilt, hier die Tastencodes, die können ja im Programm noch ergänzt werden.


Edit:
- Code ergänzt, irgendwie wird in der PS2KeyMap library das Minuszeichen und der Unterstrich nicht auf DE-Tastatur umgesetzt...
- Zeichensatzumschaltung eingefügt
- Datenarray auf 2D umgestellt, dürfte sich besser handhaben lassen zum ergänzen/ändern der Sonderzeichen

Dieser Beitrag wurde am 11.04.2024 um 14:12 Uhr von DL editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
05.04.2024, 21:09 Uhr
Rolly2



Hallo DL,
sehr interessant. Probiere ich morgen mal aus. Von dem Nano V3 habe ich noch einige liegen.

VG, Andreas
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
06.04.2024, 18:31 Uhr
jochen_LE



Ah, schön!
Ja, das mit den Sondertasten ist etwas nervig, da die wohl nicht einheitlich definiert waren.
Das ist bei der PS2Keyboard.h leider das Gleiche.
Man muss das wohl auf seine vorhandene Tastatur abstimmen, also schauen, was die für Codes raus schickt, da das wohl leider unterschiedlich war (meist aber dann doch gleich).

Schöne Sache, die die Tastaturen haben meist auch nicht das ewige Leben...
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek