// ROM Reader firmware // // 2012 Scott Lawrence yorgle@gmail.com // // V001: Basic functionality, dumps out 80 bytes // '393 control lines #define kPinClock 14 /* Analog 0 */ #define kPinClear 15 /* Analog 1 */ // EPROM control lines #define kPinEN 16 /* Analog 2 */ #define kPinCE 17 /* Analog 3 */ // LED output lines #define kLED_UV 10 // PWM #define kLED_1 11 // PWM? #define kLED_2 12 // Digital // Data input lines #define kPinData0 2 #define kPinData1 3 #define kPinData2 4 #define kPinData3 5 #define kPinData4 6 #define kPinData5 7 #define kPinData6 8 #define kPinData7 9 void setup() { // '393 control lines are outputs pinMode( kPinClock, OUTPUT ); pinMode( kPinClear, OUTPUT ); // EPROM control lines are outputs pinMode( kPinEN, OUTPUT ); pinMode( kPinCE, OUTPUT ); // LED output lines are outputs pinMode( kLED_1, OUTPUT ); pinMode( kLED_2, OUTPUT ); pinMode( kLED_UV, OUTPUT ); // Digital data lines are inputs for( int i=kPinData0 ; i < kPinData7 ; i++ ) { pinMode( i, INPUT ); digitalWrite( i, LOW ); } // turn off LED1 digitalWrite( kLED_1, LOW ); // turn on LED2 analogWrite( kLED_2, 255 ); // turn on the UV LEDs digitalWrite( kLED_UV, HIGH ); // ENABLE the eprom (ACTIVE LOW!!!) digitalWrite( kPinEN, LOW ); // and start up our serial connection Serial.begin(9600); while (false ) { //!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } } int x = 128; // clearRomCounter // clear all of he counters back to value 0x00 void clearRomCounter() { digitalWrite( kPinClear, HIGH ); delay( 10 ); digitalWrite( kPinClear, LOW ); delay( 10 ); } // pulseRomClock // pulse the A counter to advance one address value void pulseRomClock() { digitalWrite( kPinClock, HIGH ); delay( 1 ); digitalWrite( kPinClock, LOW ); } // readData // take the data from the data pins, and compose it into a proper int int readData() { int retval = 0; if( digitalRead( kPinData0 )) retval |= 0x01; if( digitalRead( kPinData1 )) retval |= 0x02; if( digitalRead( kPinData2 )) retval |= 0x04; if( digitalRead( kPinData3 )) retval |= 0x08; if( digitalRead( kPinData4 )) retval |= 0x10; if( digitalRead( kPinData5 )) retval |= 0x20; if( digitalRead( kPinData6 )) retval |= 0x40; if( digitalRead( kPinData7 )) retval |= 0x80; return retval; } #define kNBytes_27256 (256/8) #define kNBytes_27128 (128/8) #define kNBytes_2732 (32/8) #define kNBytes_Device kNBytes_27128 void loop() { // for our printout buffer char buf[64]; // reset the address to 0x0000 clearRomCounter(); // dump out the rom (only first 80 bytes for now) for( x=0 ; x<80 ; x++ ) { // read in a byte int v = readData(); // reformat it for sending out as serial text data sprintf( buf, "%02x", v ); Serial.print( buf ); // advance to the next address in the rom pulseRomClock(); } // after a dump, add a newline, and wait a second Serial.println( "" ); delay( 1000 ); }