Frage: SIO an ESP32 anbinden

Moderatoren: Sleeπ, andymanone

Antworten
Benutzeravatar
Liebelein01
Beiträge: 41
Registriert: 28.10.2024 10:12
Has thanked: 10 times
Been thanked: 36 times
Kontaktdaten:

Frage: SIO an ESP32 anbinden

Beitrag von Liebelein01 »

Hallo zusammen

Heute mal zum Jahresende an die Hardwarebastler und Softwarespezialisten :-)

Ich bin ja einer von denen, die im Kopf Ideen haben, aber meist beim Einstieg schon die Stolperfallen ihr Eigen nennen.
Grundsätzlich sollte es wegen dem recht einfach gehaltenem seriellen Protokoll einfach möglich sein, die beiden Geräte zu koppeln.
Meine Ideen, brauchen dann erstmal ein Stück Hardware. Lesen, lesen, lesen ist angebracht und wenn Verstehen noch dazu kommt, wäre es perfekt.

So auch in meinem folgenden Fall.

Ich habe mir auf meinem Steckbrett den unten stehen Plan gesteckt, die BAT41 habe ich nicht verwendet, und ESP sowie Atari eingeschaltet.
Vorher natürlich noch ein Stück Software auf den ESP um zumindest mal zu sehen, ob auf den Seriellen Port des ESP was ankommt.
Schalte ich das ganze ein, dann erhalte ich 5x die DEBUG Ausgabe: "Receiving Data from Atari..." allerdings immer mit Wert 0. (0xFF wenn ich als HEX ausgebe)
Sollte ich hier nicht zumindest die Anfragen des Atari's sehen können. Ich muss ja nicht drauf reagieren.

Was mir als erstes aufgefallen ist, wenn der ESP hinterm FujiNet steckt, dann hört man dieses Geräusch was man bei Einschalten.(Brumm, oder wie man es nennen mag)
Nach kurzer Zeit habe ich READY auf dem Bildschirm stehen.

FujiNet reagiert nicht. Meines Wissen, sollte das doch nur passieren, wenn hinterm Fuji ein Floppy oder so hängt.

Ich denke, dass der ESP sich irgendwie als Gerät am SIO anmelden muss. Geplant war als Device 0x66.
Aber ein ACK u.s.w. zu senden, geht ja nur, wenn ich auch die Anfrage nach Device 0x66 sehen würde.
Später möchte ich dann zum Beispiel mit Poke IRGENDWAS,WASANDERES simple Befehle zum ESP schicken.
Diesbezüglich habe ich von mega-hz (Danke!) seinen Code für die LED Steuerung aus dem Tastaturprojekt bekommen und etwas ausgedünnt, da LED aktuell nicht interessant.

Jetzt eigentlich meine Fragen, um die Basics bereitstellen zu können.

Ist eventuell am Schaltplan etwas verkehrt? Oder ist ist der richtig, aber der Arduino/ESP Code passt nicht dazu.

Ich wäre für alles Dankbar was mich voran bringt.

6.5 Stunden vorher, wünsche ich Euch allen einen guten Rutsch ins neue Jahr.

Gruß
Frank

Schaltplan1
Schaltplan1
SIO2ESP_Schematic_1.png (62.74 KiB) 745 mal betrachtet

Code: Alles auswählen

/*
SIO CMD structure:

Byte:
RxBuffer[0]  - SIO device number
RxBuffer[1] - COMMAND, #$57 for write in use
RxBuffer[2] - DAUX1, not used,
RxBuffer[3] - DAUX2, not used,
RxBuffer[4] - checksum.

SIO DATA structure:

RxBuffer[0] - LEDs mode,
RxBuffer[1] - data (depend on LEDs mode),

RxBuffer[RxDataSize] - data (depend on LEDs mode),
RxBuffer[RxDataSize+1]  - checksum.

*/
#define DEBUG 1

#define PIN_COMMAND 21  // ATARI SIO-COMMAND Pin
#define PIN_RX      22  // ATARI SIO-TX Pin
#define PIN_TX      23  // ATARI SIO-RX Pin

#define SIO Serial1

// -------------------------------------------------

/* Global define */

#define RxCmdSize (4)
#define RxDataSize (65 * 3)
#define siodevice 0x66
//#define siodevice 0x40

/* Global Variable */

uint8_t CmdLineStatus = 1;
uint8_t RxBuffer[(65 * 3 + 1)] = { 0 };

uint8_t RxSumData = 0;
uint8_t RxSumCmd = 0;

// ----------------------------------------

void setup()

{
  pinMode(PIN_COMMAND, INPUT);
  pinMode(PIN_RX, OUTPUT);
  pinMode(PIN_TX, INPUT);

  Serial.begin(115200);
  SIO.begin(19200, PIN_RX, PIN_TX);
}

// ----------------------------------------

void loop() {
  while (1) {

    CmdLineStatus = digitalRead(PIN_COMMAND);

    while (CmdLineStatus == HIGH) {
      CmdLineStatus = digitalRead(PIN_COMMAND);
      //Serial.println("Waiting for SIO Command from ATARI...");
    }

    RxSumCmd = ReceiveData(RxBuffer, RxCmdSize + 1);  // Receive command and calculate checksum
    CmdLineStatus = digitalRead(PIN_COMMAND);

    while (CmdLineStatus == LOW) {
      CmdLineStatus = digitalRead(PIN_COMMAND);
    }

    //check sio device
    if (RxBuffer[0] == siodevice) {

      // -------------------------------------
      // Check for Write Command
      if (RxBuffer[1] == 0x53) {
        // PIN_SIOCOMMAND im ORIGINAL 13 als Zahl
        pinMode(PIN_COMMAND, OUTPUT);
        digitalWrite(PIN_COMMAND, HIGH);
        delay(500);
        digitalWrite(PIN_COMMAND, LOW);
      }

      if (RxBuffer[1] == 0x57) {
        //verify CMD checksum
        if (RxSumCmd == RxBuffer[RxCmdSize]) {
          //Send ACK and continue receive data
          delayMicroseconds(1000);

          SIO.write('A');  //cmd ack
          SIO.flush();

          //Receive data
          RxSumData = ReceiveData(RxBuffer, RxDataSize + 1);  // Receive data and calculate checksum

          if (RxSumData == RxBuffer[RxDataSize]) {
            //Send ACK and COMPLETE
            delayMicroseconds(1000);
            SIO.write('A');  //
            SIO.flush();
#if DEBUG == 1
  Serial.println("Sending 'ACK' to Atari...");
#endif

            // Filter SIO Buffer
            switch (RxBuffer[0]) {
              case 0:
                {
                  break;
                }
              case 1:
                {
                  break;
                }
              case 2:
                {
                  break;
                }
              case 3:
                {
                  break;
                }
              case 100:
                {
                }
              case 101:
                {
                }
              case 102:
                {
                }
              case 103:
                {
                }
              case 253:
                {
                  break;
                }
              case 254:
                {
                  break;
                }
              case 255:
                {
                  if ((RxBuffer[1] == 0x55) && (RxBuffer[2] == 0xAA) && (RxBuffer[3] == 0x55))
                    save_eeprom();
                  break;
                }
            }
            //End transmission

            delayMicroseconds(250);
            SIO.write('C');  //
            SIO.flush();
#if DEBUG == 1
  Serial.println("Sending 'Complete' to Atari...");
#endif

          }  //RxSumData == RxBuffer
          else {
            delayMicroseconds(1000);
            SIO.write('N');  //
            SIO.flush();
#if DEBUG == 1
  Serial.println("Sending 'NAK' to Atari...");
#endif
            delayMicroseconds(250);
            SIO.write('E');  //
            SIO.flush();
#if DEBUG == 1
  Serial.println("Sending 'END' to Atari...");
#endif

          }  //verify checksum DATA NOK
        }    //check sio command end
      }      //check sio device end
      else {
        //Send NAK because wrong checksum
        delayMicroseconds(1000);
        SIO.write('N');  //
        SIO.flush();
#if DEBUG == 1
  Serial.println("Sending 'NAK' to Atari...");
#endif
      }

    }  //verify checksum CMD end
  }
}

//functions

uint8_t ReceiveData(uint8_t *buffer, uint8_t length) {

  uint8_t cnt = 0;
  int sum = 0;
  cnt = SIO.readBytes(buffer, length);

#if DEBUG == 1
  Serial.print("Receiving Data from Atari... : ");
  Serial.println(cnt, HEX);
#endif

  if (cnt == length) {
    for (cnt = 0; cnt < length - 1; cnt++) {
      sum = sum + buffer[cnt];
      if (sum >= 256) {
        sum = (sum - 256) + 1;  // add carry into sum
      }
    }
  }  // FIXME: return error if appeared!

  return sum;
}

//------------------------------------------------------

//------------------------------------------------------
void save_eeprom() {
}
//------------------------------------------------------


Benutzeravatar
mega-hz
Beiträge: 1410
Registriert: 03.11.2021 11:23
Has thanked: 410 times
Been thanked: 486 times

Re: Frage: SIO an ESP32 anbinden

Beitrag von mega-hz »

wie ich schon sagte... nimm erstmal einen Arduino Nano und wenn der dann läuft, nen ESP ohne Levelshifter.
Und 0x66 solltest Du nicht benutzen, da nix von Atari Seite diese Gerätekennung benutzt!
Probiers erstmal mit Drucker oder Floppy 0x31...

Edit Und R1 ist falsch! Sollte wohl ein Pullup sein? Ist es aber nicht.
Da kommt nix mehr an Signalen durch!
keine PN's mehr! Bitte per email kontaktieren! atari1450xld©mega-hz.de

Benutzeravatar
Liebelein01
Beiträge: 41
Registriert: 28.10.2024 10:12
Has thanked: 10 times
Been thanked: 36 times
Kontaktdaten:

Re: Frage: SIO an ESP32 anbinden

Beitrag von Liebelein01 »

Hi

Sollte ich das erst mit einem Nano machen, müsste ich später ja wieder anfangen das Ganze dann auf ESP zu bekommen.
Wenn Du sagst, das R1 falsch ist, hast Du zufällig auch die Lösung?
Nach meinem Verständnis, was wohl falsch ist, sollte der R1 wie die anderen auch als PullUp dienen.

EDIT:
Habe gerade gemerkt, dass ich die Schaltung auch falsch auf dem Brett nachgebaut habe.

Dann geht es nächstes Jahr erst weiter :-)

Benutzeravatar
mega-hz
Beiträge: 1410
Registriert: 03.11.2021 11:23
Has thanked: 410 times
Been thanked: 486 times

Re: Frage: SIO an ESP32 anbinden

Beitrag von mega-hz »

wenn es auf den Nano erstmal läuft, ist die Portierung zum esp kein Problem.
Das einzige worauf du achten musst, ein esp sollte in einer schleife IMMER ein yield() beinhalten!
sonst werden seine internen anderen Funktionen angehalten und er stürzt ab.
In diesem Fall sollte in die Command-Listening Schleife unbedingt ein yield() rein.
Aber mach es erstmal mit nem Arduino Nano/Uno.

Falls Du vor hast, mit dem ESP gleichzeitig WLAN laufen zu lassen, das wird dann wohl zu Aussetzern SIOmäßig führen.
Es ist so schon zeitkritisch die SIO Signale zeit-exakt "mitzuschneiden". Selbst wenn das nur 19200 Baud sind.

Und hab erstmal keine Bedenken wegen LevelShiftern!
Bestes Beispiel ist das A8 PicoCart!
Dort ist ein PiPico drin, der kann normalerweise auch nur 3.3V,, das Cart jedoch hat überhaupt keine Levelshifter und es ist noch kein Defekt bekanntgeworden!
Immer haben die Chips ja alle Schutzdioden die zu hohe Spannungen ableiten, entweder gegen VCC oder GND.

Wenn alles läuft, kannst Du ja später immernoch LevelShifter dazufügen!
keine PN's mehr! Bitte per email kontaktieren! atari1450xld©mega-hz.de

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast