www.cavefischer.at/Sharp Pocket Computer


Datenübertragung vom Sharp PC-1401 mit der ROM-Funktion "Device-Select"


Dieses Programm überträgt ein Byte vom Sharp Pocket Computer PC-1401 unter Verwendung der ROM-Routine "Device-Select" (&A870) an einen Arduino UNO.
Auf diese Weise kann der Programmieraufwand beim Pocket Computer minimal gehalten werden.
Damit die Datenübertragung stabil läuft, ist es notwendig pull-down Widerstände (z.B. 10kOhm) von den Daten- und Steuerungsleitungen (Ausnahme Xout) auf GND zu schalten.
Das Arduino Programm ist eine etwas vereinfachte Version des Druckeremulators (Version für PC-1401, PC-1403, PC-E500) für den CE-126P.
Da in diesem Fall nur die während des "Device-Select" Vorganges (bei Xout=HIGH) übertragene Information (Dout) verwertbar ist,
wäre das Auslesen des Datenbytes (bei Xout=LOW) für dieses Arduino Programm nicht unbedingt notwendig.
Es wird aber trotzdem gemacht, um zu vermeiden, dass der Sharp PC in einem undefinierten Zustand hängen bleibt.


Steckbrett mit Arduino UNO:




BASIC Programm für Sharp PC-1401:


10:POKE &4100,2,0,120,&A8,&70,&EB,&38,55
20:INPUT "0-255:";X
30:POKE &4101,X
40:CALL &4100
50:GOTO 20
Assemblerdarstellung des Maschinenprogramms
&4100: 002 000   LIA 0       Inhalt der Adresse &4101 wird in das A-Register (Akku) übertragen
&4102: 120 &A8 &70    CALL &A870         Inhalt des A-Registers (Akku) wird mit der Funktion "Device-Select" an den Fo2-Port (Dout) übertragen
&4105: &EB &38   CAL &B38       Ports werden zurückgesetzt
&4107: 055     RTN         Rücksprung ins Basic



Arduino UNO Programm:

// Uebertragung von "Device-Select" und Datenbytes zum Arduino UNO

const int OUT_ACK9 = 4; // Pin D4, ACK,  pin 9 der 11-pol. Buchsenleiste
const int IN_Xout7 = 6; // Pin D6, Xout, pin 7 der 11-pol. Buchsenleiste
const int IN_Dout5 = 8; // Pin D8, Dout, pin 5 der 11-pol. Buchsenleiste
const int IN_Busy4 = 9; // Pin D9, Busy, pin 4 der 11-pol. Buchsenleiste
int DataBit;
int DataByte;
int i;

void setup() {
  Serial.begin(9600);
  pinMode(OUT_ACK9, OUTPUT);
  pinMode(IN_Xout7, INPUT);
  pinMode(IN_Dout5, INPUT);
  pinMode(IN_Busy4, INPUT);
  Serial.println();
  Serial.println("Bereit:");
  Serial.println();
}

void loop() {
  if (digitalRead(IN_Xout7)) { // Uebertragung von DeviceSelect
    i = 0;
    DataByte = 0;
    do {
      digitalWrite(OUT_ACK9, HIGH);
      while (!digitalRead(IN_Busy4));
      DataBit = digitalRead(IN_Dout5);
      digitalWrite(OUT_ACK9, LOW);
      while (digitalRead(IN_Busy4));
      DataByte = DataByte | (DataBit << i);
      i++;
    } while (i < 8);
    while (digitalRead(IN_Xout7));
    digitalWrite(OUT_ACK9, HIGH);
    delayMicroseconds(400);
    digitalWrite(OUT_ACK9, LOW);
    Serial.print("DeviceSelect:");
    Serial.println(DataByte);
  }

  if (digitalRead(IN_Busy4) && !digitalRead(IN_Xout7)) { // Uebertragung eines Datenbytes
    i = 0;
    DataByte = 0;
    do {
      while (!digitalRead(IN_Busy4));
      DataBit = digitalRead(IN_Dout5);
      digitalWrite(OUT_ACK9, HIGH);
      while (digitalRead(IN_Busy4));
      digitalWrite(OUT_ACK9, LOW);
      DataByte = DataByte | (DataBit << i);
      i++;
    } while (i < 8);
    Serial.println(DataByte);
  }
  
} // Ende loop


Pinbelegung Signalverlauf bei Übertragung des Wertes 15
Arduino UNO Pin Name Sharp PC 11-pol.
Schnittstelle
GND GND Pin 3
D9 (Input) Busy Pin 4
D8 (Input) Dout Pin 5
D6 (Input) Xout Pin 7
D4 (Output) ACK Pin 9


zum Seitenanfang

© 2022: Walter Fischer