long addresa = 0;
byte towrite = 0;
byte rdval = 0;
byte mode = 0;
unsigned int velkost = 32768;
void setup() {
digitalWrite(5, HIGH);
digitalWrite(A0, HIGH);
pinMode(2, OUTPUT); // srclk
pinMode(3, OUTPUT); // serial data
pinMode(4, OUTPUT); // ltclk
pinMode(5, OUTPUT); // WEb (write enable (act low))
pinMode(6, OUTPUT); // D0
pinMode(7, OUTPUT); // D1
pinMode(8, OUTPUT); // D2
pinMode(9, OUTPUT); // D3
pinMode(10, OUTPUT); // D4
pinMode(11, OUTPUT); // D5
pinMode(12, OUTPUT); // D6
pinMode(13, OUTPUT); // D7
pinMode(A0, OUTPUT); // OEb (output enable (act low))
Serial.begin(115200);
delay(500);
Serial.println(" ");
delay(500);
}
void shift(unsigned int adres) {
digitalWrite(4, LOW);
byte addres1 = adres >> 8;
unsigned int addresint = adres << 8;
byte addres2 = addresint >> 8;
shiftOut(3, 2, MSBFIRST, addres1);
shiftOut(3, 2, MSBFIRST, addres2);
digitalWrite(4, HIGH);
}
void dataWR(byte datta) {
// writes data to the 8 last free digital pins
digitalWrite(A0, HIGH);
pinMode(6, OUTPUT); // D0
pinMode(7, OUTPUT); // D1
pinMode(8, OUTPUT); // D2
pinMode(9, OUTPUT); // D3
pinMode(10, OUTPUT); // D4
pinMode(11, OUTPUT); // D5
pinMode(12, OUTPUT); // D6
pinMode(13, OUTPUT); // D7
byte bit0 = datta & 1;
byte bit1 = datta & 2;
byte bit2 = datta & 4;
byte bit3 = datta & 8;
byte bit4 = datta & 16;
byte bit5 = datta & 32;
byte bit6 = datta & 64;
byte bit7 = datta & 128;
digitalWrite(6, bit0);
digitalWrite(7, bit1);
digitalWrite(8, bit2);
digitalWrite(9, bit3);
digitalWrite(10, bit4);
digitalWrite(11, bit5);
digitalWrite(12, bit6);
digitalWrite(13, bit7);
}
byte dataRD(unsigned int addr) {
byte daata = 0;
digitalWrite(A0, LOW);
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);
pinMode(13, INPUT_PULLUP);
daata = (128 * digitalRead(13)) + (64 * digitalRead(12)) + (32 * digitalRead(11)) + (16 * digitalRead(10)) + (8 * digitalRead(9)) + (4 * digitalRead(8)) + (2 * digitalRead(7)) + (1 * digitalRead(6));
return daata;
}
byte MEMread(unsigned int addrs) {
// reads a byte at an address, also takes amount of bits (both values are mandatory)
byte udaj = 0;
shift(addrs);
udaj = dataRD(addrs);
return udaj;
}
void MEMwrite(unsigned int adrs, byte bajt) {
dataWR(bajt);
shift(adrs);
delayMicroseconds(10);
digitalWrite(5, LOW); // pulses WE low to write
delayMicroseconds(500); // assumes you use RC high pass filter with time constant <1000ns
digitalWrite(5, HIGH);
}
void MEMdump(unsigned int maxaddr) {
for (unsigned long y = 0; y < maxaddr; y = y + 16) {
byte udaje[16];
for (byte z = 0; z <= 15; z = z + 1) {
unsigned long offset = z + y;
udaje[z] = MEMread(offset);
delayMicroseconds(5);
}
char buf[120];
sprintf(buf, "%05x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
y, udaje[0], udaje[1], udaje[2], udaje[3], udaje[4], udaje[5], udaje[6], udaje[7], udaje[8],
udaje[9], udaje[10], udaje[11], udaje[12], udaje[13], udaje[14], udaje[15]);
Serial.println(buf);
}
}
void MEMerase() {
for(long w = 0; w < velkost; w = w + 1) {
MEMwrite(w, 255);
delayMicroseconds(5);
}
}
void MEMprogbulk() {
addresa = 0;
while (addresa < velkost) {
if(Serial.available()) {
towrite = Serial.parseInt();
Serial.print("Writing ");
Serial.print(towrite);
Serial.print(" address: ");
Serial.print(addresa);
MEMwrite(addresa, towrite);
Serial.print(" Wrote ");
Serial.print(towrite);
Serial.print(" address: ");
Serial.println(addresa);
addresa = addresa + 1;
while(Serial.available()) {Serial.read();}
}
}
}
void loop() {
if (Serial.available()) {
mode = Serial.parseInt();
if (mode == 0) { // if mode is read
addresa = Serial.parseInt();
rdval = MEMread(addresa);
Serial.print("Read data: ");
Serial.print(rdval);
Serial.print(" From address: ");
Serial.println(addresa);
}
if (mode == 1) { // if mode is write
addresa = Serial.parseInt();
towrite = Serial.parseInt();
MEMwrite(addresa, towrite);
Serial.print("Written data: ");
Serial.print(towrite);
Serial.print(" To address: ");
Serial.println(addresa);
}
if(mode == 2) {
unsigned int maxadr = Serial.parseInt();
Serial.println("Dumping Memory...");
MEMdump(maxadr);
Serial.println("Memory Dumped");
}
if(mode == 3) {
Serial.println("Erasing Memory...");
MEMerase();
Serial.println("Memory Erased");
}
if(mode == 4) {
MEMprogbulk();
}
while(Serial.available()) {
Serial.read();
}
}
}
/*
for(int i = 0; i <= 15; i = i + 1) {
sbit = valtosr & (0b1000000000000000 >> i);
if(sbit >= 1) {
digitalWrite(3, HIGH);
}
if(sbit == 0) {
digitalWrite(3, LOW);
}
*/
WE
OE
----. .----
7. 6. 5.. 4. 3. 2.. 1. 0
15. 14.. 13.. 12. 11.. 10.. 9. 8.. 7. 6. 5.. 4. 3. 2.. 1. 0
..........DATA
(MSB on leftmost)
ADDRESS (MSB on leftmost LED)
||
||
||
||
||
||