//This is for an arduino nano to test 4116 ram ic. Please see video https://youtu.be/MVZYB54VD2g and blogpost //Cerated in november 2017. Code commented and posted march 2020. //Most of the code and design is from http://forum.defence-force.org/viewtopic.php?p=15035&sid=17bf402b9c2fd97c8779668b8dde2044 //by forum member "iss"" and modified to work with 4116 D ram by me Uffe Lund-Hansen, Frostbox Labs. //This is version 2 of the code. Version 1 had a very seroisl bug at approx. line 43 which meant it only checked ram address 0 //#include #define DI 7 // Arduino D7 > 4116 pin 2 #define DO 15 // Arduino A1 > 4116 pin 14 #define CAS 14 // Arduino A0 > 4116 pin 15 #define RAS 5 // Arduino D5 > 4116 pin 4 #define WE 6 // Arduino D6 > 4116 pin 3 #define XA0 4 // Arduino D4 > 4116 pin 5 #define XA1 2 // Arduino D2 > 4116 pin 7 #define XA2 3 // Arduino D3 > 4116 pin 6 #define XA3 17 // Arduino A3 > 4116 pin 12 #define XA4 18 // Arduino A4 > 4116 pin 11 #define XA5 19 // Arduino A5 > 4116 pin 10 #define XA6 16 // Arduino A2 > 4116 pin 13 #define R_LED 9 // Arduino D9 > Cathode on red LED. Anode connected through 470ohm resisor to +5VDC #define G_LED 8 // Arduino D8 > Cathode on green LED. Anode connected through 470ohm resisor to +5VDC //Power to the 4116 ic: -5VDC 0.2mA to pin 1 . +12VDC 35mA to pin 8. +5VDC to pin 9. GND to pin 16. //You can use an MC34063 ic to create the -5VDC and the +12VDC from the USB +5VDC rail. Please check the datasheet for the correct values //Use the reset button to start the test on solder an external momentary button between RST pin and GND pin on arduino. #define BUS_SIZE 7 volatile int bus_size; const unsigned int a_bus[BUS_SIZE] = { XA0, XA1, XA2, XA3, XA4, XA5, XA6 }; void setBus(unsigned int a) { int i; for (i = 0; i < BUS_SIZE; i++) { digitalWrite(a_bus[i], a & 1); a /= 2; } } void writeAddress(unsigned int r, unsigned int c, int v) { /* row */ setBus(r); digitalWrite(RAS, LOW); /* rw */ digitalWrite(WE, LOW); /* val */ digitalWrite(DI, (v & 1)? HIGH : LOW); /* col */ setBus(c); digitalWrite(CAS, LOW); digitalWrite(WE, HIGH); digitalWrite(CAS, HIGH); digitalWrite(RAS, HIGH); } int readAddress(unsigned int r, unsigned int c) { int ret = 0; /* row */ setBus(r); digitalWrite(RAS, LOW); /* col */ setBus(c); digitalWrite(CAS, LOW); /* get current value */ ret = digitalRead(DO); digitalWrite(CAS, HIGH); digitalWrite(RAS, HIGH); return ret; } void error(int r, int c) { unsigned long a = ((unsigned long)c << bus_size) + r; digitalWrite(R_LED, LOW); digitalWrite(G_LED, HIGH); interrupts(); Serial.print(" FAILED $"); Serial.println(a, HEX); Serial.flush(); while (1) ; } void ok(void) { digitalWrite(R_LED, HIGH); digitalWrite(G_LED, LOW); interrupts(); Serial.println(" OK!"); Serial.flush(); while (1) ; } void blink(void) { digitalWrite(G_LED, LOW); digitalWrite(R_LED, LOW); delay(1000); digitalWrite(R_LED, HIGH); digitalWrite(G_LED, HIGH); } void green(int v) { digitalWrite(G_LED, v); } void fill(int v) { int r, c, g = 0; v &= 1; for (c = 0; c < (1<