diff --git a/CommandLine.h b/CommandLine.h index ddac28a..3f4e97e 100644 --- a/CommandLine.h +++ b/CommandLine.h @@ -1,4 +1,5 @@ /***************************************************************************** + 2023-01-18 Tim Gopaul add command BusyFaultCount to report how many Busy interrupts were generated since last reboot 2023-01-11/12 Tim Gopaul Removed getHexLineFromSerialPort.. use the main parsing code get command 2023-01-11 Tim Gopaul added call to make commands case insensitive. 2023-01-08 Tim Gopaul - add load command to read in Hex format string and place in RAM memory @@ -95,7 +96,8 @@ #include // https://stackoverflow.com/questions/26080829/detecting-strtol-failure when strtol fails it returns zero and an errno #include // used to find LONG_MIN and LONG_MAX - +extern volatile unsigned int BusyFaultCount; +extern volatile unsigned int ShadowFaultCount; //Function Prototypes from .ino file void writeAddress(unsigned int address, byte dataByte); @@ -152,6 +154,9 @@ const char *gameReadCommandToken = "gameread"; // read address ignore const char *gameWriteCommandToken = "gamewrite"; // write address byte const char *gameDumpCommandToken = "gameDump"; // Dumps game memory from starting address with byte count +const char *BusyFaultCountToken = "busyfaultcount"; // displays the accumulative count of the busy interrupts +const char *ShadowFaultCountToken = "shadowfaultcount"; // displays the accumulative count of the busy interrupts + /************************************************************************************************************* getCommandLineFromSerialPort() Return the string of the next command. Commands are delimited by return" @@ -373,6 +378,13 @@ int gameDumpCommand() { return addrStart; } +void busyFaultCountCommand(){ + Serial.printf("> Cumlative fault count since last Atmega1284 reboot: %d\n", BusyFaultCount ); +} + +void shadowFaultCountCommand(){ + Serial.printf("> Cumlative fault count since last Atmega1284 reboot: %d\n", ShadowFaultCount ); +} // ***** testMemmory ***** int testMemoryCommand(){ @@ -527,6 +539,15 @@ DoMyCommand(char * commandLine) { else if (strcasecmp(ptrToCommandName, testMemoryCommandToken) == 0) { //Modify here result = testMemoryCommand(); } + + else if (strcasecmp(ptrToCommandName, BusyFaultCountToken) == 0) { //Modify here + busyFaultCountCommand(); + } + + else if (strcasecmp(ptrToCommandName, ShadowFaultCountToken) == 0) { //Modify here + shadowFaultCountCommand(); + } + else { nullCommand(ptrToCommandName); } diff --git a/PinBallMemoryPort20230205.ino b/PinBallMemoryPort20230205.ino index ad8f10b..5b4f01e 100644 --- a/PinBallMemoryPort20230205.ino +++ b/PinBallMemoryPort20230205.ino @@ -1,7 +1,12 @@ // Protospace is running code version PinBallMemoryPort20230201 // The next version of code starts dated 2023 02 05 // -// 2023-02-05 Tim Gopaul,, look into moving control pins to PC +// 2023-02-18 Tim Gopaul, trouble getting PCINT30 working. changed to interruptPin = PIN_PD2 which gives digitalPinToInterrupt(interruptPin) as 0 +// 2023-02-14 Tim Gopaul, attach an interrupt low edge to pin 20 PD6 PCINT30 +// connect interrupt to _BusyRight to indicate the Pinball live memory was issued a wait.. which likey corrupted game ram +// What to do. ..maybe save high score to portal then restart the pinball machine or issue a warning to the LCD screen +// +// 2023-02-05 Tim Gopaul,, look into moving control pins to PC done // // // 2023-01-29 Tim Gopaul troubleshoot bad first byte read @@ -85,7 +90,17 @@ int inputMode = 1; #define CEL2_OEL_HIGH PORTC |=B10010000 // ChipEnable with OutputEnable HIGH PORTDPIN_PC7 PIN_PC4 -const byte BUSY_ = PIN_PD7; // BUSY# input pull up +const byte BUSY_ = PIN_PD7; // BUSY# input pull up This is for the Atmega side Busy signals + +const byte BUSY_IRQPIN = PIN_PD2; //BUSY_FAULT will go low if the live game ram receives a Busy signal +volatile byte BusyStateIRQ = HIGH; +volatile unsigned int BusyFaultAddress; +volatile unsigned int BusyFaultCount = 0; // count the number of busy faults and report when given the BusyFaultCount command + +const byte SHADOW_IRQPIN = PIN_PD3; //BUSY_FAULT will go low if the live game ram receives a Busy signal +volatile byte ShadowStateIRQ = HIGH; +volatile unsigned int ShadowFaultAddress; +volatile unsigned int ShadowFaultCount = 0; // count the number of busy faults and report when given the BusyFaultCount command volatile byte ramBuffer[ramSize]; // This is an array to hold the contents of memory @@ -142,6 +157,13 @@ int helpText(){ Serial.println(">* Enter numbers as decimal or *"); Serial.println(">* 0xNN 0X55 for HEX *"); Serial.println(">* *"); + Serial.println(">* BusyFaultCount will give the *"); + Serial.println(">* count of Busy Interruptes *"); + Serial.println(">* *"); + Serial.println(">* ShadowFaultCount gives the *"); + Serial.println(">* count of Shadow Busy *"); + Serial.println(">* Interruptes *"); + Serial.println(">* *"); Serial.println(">**********************************"); Serial.println(); return(0); @@ -752,11 +774,27 @@ void testMemory(unsigned int addrStart, unsigned int addrCount, int testLoops) { } } +void BusyFaultWarning(){ + BusyStateIRQ = LOW; + ++BusyFaultCount; + BusyFaultAddress = (((PORTC & B0000111) << 8 ) + PORTA); + } +void ShadowFaultWarning(){ + ShadowStateIRQ = LOW; + ++ShadowFaultCount; + ShadowFaultAddress = (((PORTC & B0000111) << 8 ) + PORTA); + } // ***** setup ***** ----------------------------------------------- void setup() { + pinMode(BUSY_IRQPIN, INPUT_PULLUP); + attachInterrupt(digitalPinToInterrupt(BUSY_IRQPIN),BusyFaultWarning, FALLING); + + pinMode(SHADOW_IRQPIN, INPUT_PULLUP); + attachInterrupt(digitalPinToInterrupt(SHADOW_IRQPIN),ShadowFaultWarning, FALLING); + // seed the random mumber generator randomSeed(millis()); //initialize pseudo random number @@ -803,7 +841,20 @@ void setup() { // ***** loop ***** ---------------------------------------- void loop() { - bool received = getCommandLineFromSerialPort(CommandLine); //global CommandLine is defined in CommandLine.h + + if (BusyStateIRQ == LOW ) { + BusyStateIRQ = HIGH; + Serial.printf("\n> PIN_PD2 IRQ 0 Busy fault Live Game RAM issued a BUSY, Address: 0x%04X\n", BusyFaultAddress ); + Serial.printf("> Cumlative fault count since last Atmega1284 reboot: %d\n", BusyFaultCount ); + } + + if (ShadowStateIRQ == LOW ) { + ShadowStateIRQ = HIGH; + Serial.printf("\n> PIN_PD3 IRQ 1 Busy fault Shadow RAM issued a BUSY, Address: 0x%04X\n", ShadowFaultAddress ); + Serial.printf("> Cumlative Shadow fault count since last Atmega1284 reboot: %d\n", ShadowFaultCount ); + } + +bool received = getCommandLineFromSerialPort(CommandLine); //global CommandLine is defined in CommandLine.h if (received) { switch(inputMode){ case CommandMode: