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
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() {
}
//------------------------------------------------------