www.cavefischer.at/Sharp Pocket Computer


Empfang von mehreren Bytes (Rx) vom Sharp PC-1403 mit Arduino UNO
Übertragung des Displayspeichers



Das anschließende Arduino Programm empfängt an der seriellen Schnittstelle (UART) 124 Bytes, die vom Pocket Computer gesendet werden.
Dabei handelt es sich um die 120 Bytes (24 x 5) des Displayspeichers, sowie 4 Bytes der dazwischenliegenden Statusanzeigen, welche jedoch ignoriert werden.
Der Displayspeicher kann am Sharp Pocket Computer mit dem Basic Befehl PRINT beschrieben werden, oder direkt mit POKE.
Arduino-seitig wird zum Empfang die Funktion "Serial.read" verwendet; die Bitrate wird auf 9600 baud eingestellt.
Der Ausgang Fo3 (Pin 4) des Sharp Pocket Computers wird über einen NPN Tranistor (z.B. BC546, BC547, BC548, ...) in open-collector Schaltung mit RX0 vom Arduino verbunden.
Beim ersten Aufruf muß das Basic Programm im Sharp Pocket Computer mit RUN gestartet werden, um das Maschinenprogramm in den Speicher zu übertragen.
Dies dauert ca. 15 Sekunden.
Das eigentliche Programm zur Übertragung des Displayspeichers an den Arduino wird in der Folge mit DEF A gestartet.
Der Inhalt des Sharp Displays wird anschließend als Textgrafik am Serial Monitor der Arduino IDE ausgegeben.


Steckbrett mit Arduino UNO:



Programm für Arduino:


// Rx von Sharp PC-1403 Displayspeicher

const int RxBdRate = 9600;
byte FinalArray[120]; // Speicherbereich für 24-stelliges Display (5x7 Matrix), 24x5=120
int Konfiguration[] = {1,2,3,4,5,6,10,11,12,7,8,9,0,0,0,0,-24,-23,-22,-21,-20,-19,-15,-14,-13,-18,-17,-16};
unsigned int Col5Cnt = 0;
unsigned int indexRx = 0;
unsigned int indexKonf = 0;
unsigned int indexFinal;
byte incomingByte;
int Zuordnung;

void setup() {
  Serial.begin(RxBdRate,SERIAL_8N1);
  Serial.print("Rx mit ");
  Serial.print(RxBdRate);
  Serial.println(" Bd");
}

void loop() {
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    Zuordnung = Konfiguration[indexKonf];
    // 5 Bytes in aufsteigender Reihenfolge anfügen:
    if (Zuordnung > 0) {
      indexFinal = ((Zuordnung-1)*5) + Col5Cnt;
      AddFinalByte();
    }
    // 5 Bytes in absteigender Reihenfolge anfügen:
    if (Zuordnung < 0) {
      indexFinal = ((Zuordnung-1)*(-5)) - Col5Cnt - 6;
      AddFinalByte();
    }
    // Nicht Display-Byte überspringen:
    if (Zuordnung == 0) {
      indexKonf++;
    }
    indexRx++;
  }
  else {
    if (indexRx >= 124) {
      indexRx = 0;
      Col5Cnt = 0;
      indexKonf = 0;
      SerialTextGraphic();
    }
  }
}

void AddFinalByte() {
  FinalArray[indexFinal] = incomingByte;
  Col5Cnt++;
  if (Col5Cnt == 5) {
    Col5Cnt = 0;
    indexKonf++;
  }
}

void SerialTextGraphic() {
  Serial.println();
  for (int y=0; y<8; y++) {
    for (int x=0; x<120; x++) {        
      if ((FinalArray[x] & (1<<y)) > 0) {
        Serial.print("##");
      }
      else {
        Serial.print(char(32));
        Serial.print(char(32));
      }
      Col5Cnt++;
      if (Col5Cnt == 5) {
        Serial.print(char(32));
        Serial.print(char(32));
        Serial.print(char(32));
        Col5Cnt = 0;     
      }
    }
    Serial.println();
  }
  Serial.println();
}

BASIC Programm für Sharp PC-1403 (PC-1403H, EL-5500III):


10:RESTORE
20:FOR X=0 TO 135
30:READ D
40:POKE &F000+X,D
50:NEXT X
60:END
100:"A"
110:WAIT 0
120:PRINT "  HALLO Arduino Welt!   "
125:POKE &3000,85,42,85,42,85,0,0,8
127:POKE &3040,8,28,42,8,8
130:CALL &F000
140:END
200:DATA &85,2,&2F,219,&84,2,&FF,219,2,123,52,&83,4,85,120,&F0,&14,47,7,55
210:DATA 2,1,18,94,97,4,95,77,&83,198,18,94,56,3,96,0,95
220:DATA 2,2,97,4,&83,198,18,94,56,3,96,0,95
230:DATA 2,4,97,4,&83,198,18,94,56,3,96,0,95
240:DATA 2,8,97,4,&83,198,18,94,56,3,96,0,95
250:DATA 2,16,97,4,&83,198,18,94,56,3,96,0,95
260:DATA 2,32,97,4,&83,198,18,94,56,3,96,0,95
270:DATA 2,64,97,4,&83,198,18,94,56,3,96,0,95
280:DATA 2,128,97,4,&83,198,18,94,56,3,96,0,95,78,8,96,0,95,78,9,55

Assemblerdarstellung des Maschinenprogramms für PC-1403
&F000: &85     LP05               
&F001: 002 &2F   LIA &2F           &2FFF (12287) = Startadresse (-1) des 24 stelligen Displays in das X-Reg laden
&F003: 219     EXAM               
&F004: &84     LP04               
&F005: 002 &FF   LIA &FF             
&F007: 219     EXAM               
&F008: 002 123   LIA 123             
&F00A: 052     PUSH               
&F00B: &83     LP03   <       Adresse des B-Reg (03) in das P-Reg laden
&F00C: 004     IX           X-Reg inkrementieren und in DP-Reg laden
&F00D: 085     MVMD           Inhalt der Adresse, die im DP-Reg steht in die Adresse, die im P-Reg steht laden
&F00E: 120 &F0 &14 CALL &F014           
&F011: 047 007   LOOP 7         
&F013: 055     RTN               
&F014: 002 001   LIA 1             
&F016: 018 094   LIP 94             
&F018: 097 004   ORIM 4             
&F01A: 095     OUTF             4 an Port F senden, entspricht High an Fo3 (Pin 4) = Startbit
&F01B: 77     NOPT               
&F01C: &83     LP03               
&F01D: 198     TSMA               
&F01E: 018 094   LIP 94             
&F020: 056 003   JRZP 3         
&F022: 096 000   ANIM 0           
&F024: 095     OUTF   <       Bit 1 an Port F senden (Fo3)
&F025: 002 002   LIA 2             
&F027: 097 004   ORIM 4             
&F029: &83     LP03               
&F02A: 198     TSMA               
&F02B: 018 094   LIP 94             
&F02D: 056 003   JRZP 3         
&F02F: 096 000   ANIM 0           
&F031: 095     OUTF   <       Bit 2 an Port F senden (Fo3)
&F032: 002 004   LIA 4             
&F034: 097 004   ORIM 4             
&F036: &83     LP03               
&F037: 198     TSMA               
&F038: 018 094   LIP 94             
&F03A: 056 003   JRZP 3         
&F03C: 096 000   ANIM 0           
&F03E: 095     OUTF   <       Bit 3 an Port F senden (Fo3)
&F03F: 002 008   LIA 8             
&F041: 097 004   ORIM 4             
&F043: &83     LP03               
&F044: 198     TSMA               
&F045: 018 094   LIP 94             
&F047: 056 003   JRZP 3         
&F049: 096 000   ANIM 0           
&F04B: 095     OUTF   <       Bit 4 an Port F senden (Fo3)
&F04C: 002 016   LIA 16             
&F04E: 097 004   ORIM 4             
&F050: &83     LP03               
&F051: 198     TSMA               
&F052: 018 094   LIP 94             
&F054: 056 003   JRZP 3         
&F056: 096 000   ANIM 0           
&F058: 095     OUTF   <       Bit 5 an Port F senden (Fo3)
&F059: 002 032   LIA 32             
&F05B: 097 004   ORIM 4             
&F05D: &83     LP03               
&F05E: 198     TSMA               
&F05F: 018 094   LIP 94             
&F061: 056 003   JRZP 3         
&F063: 096 000   ANIM 0           
&F065: 095     OUTF   <       Bit 6 an Port F senden (Fo3)
&F066: 002 064   LIA 64             
&F068: 097 004   ORIM 4             
&F06A: &83     LP03               
&F06B: 198     TSMA               
&F06C: 018 094   LIP 94             
&F06E: 056 003   JRZP 3         
&F070: 096 000   ANIM 0           
&F072: 095     OUTF   <       Bit 7 an Port F senden (Fo3)
&F073: 002 128   LIA 128             
&F075: 097 004   ORIM 4             
&F077: &83     LP03               
&F078: 198     TSMA               
&F079: 018 094   LIP 94             
&F07B: 056 003   JRZP 3         
&F07D: 096 000   ANIM 0           
&F07F: 095     OUTF   <       Bit 8 an Port F senden (Fo3)
&F080: 078 008   WAIT 8             
&F082: 096 000   ANIM 0             
&F084: 095     OUTF             0 an Port F senden, entspricht Low an Fo3 (Pin 4) = Stoppbit
&F085: 078 009   WAIT 9             
&F087: 055     RTN               


Ausgabe am Serial Monitor:



Pinbelegung:

Arduino UNO Pin Name Sharp PC
11-pol. Schnittstelle
GND GND Pin 3
RX 0 (Input, über open-collector Transistorstufe) Port Fo 3 Pin 4


zum Seitenanfang

© 2025: Walter Fischer