Per chiarezza allego lo schema del circuito.
Questo sotto è il codice usato:
/* TEST DI CONNESSIONE AD 1 CHIP DI RAM DA 8 KB
TRAMITE 2 SHIFT REGISTER 595 PER LA GESTIONE DELL'INDIRIZZO,
1 SHIFT REG. 595 PER LA GESTIONE DEI DATI IN SCRITTURA SU RAM
ED 1 SHIFT REG. 165 PER I DATI IN LETTURA DALLA RAM
*/
#include <EEPROM.h>
// CONNESSIONI DEI PIN
//1° e 2° chip 595
#define data1pin 0 //pin DS
#define latch1pin 1 //pin ST_CP
#define clock1pin 2 //pin SH_CP
//3° chip 595
#define data2pin 8 //pin DS
#define latch2pin 9 //pin ST_CP
#define clock2pin 10 //pin SH_CP
//comune a tutti e 3 i chip 595
#define master_reset 3 //pin MR/ dei 3 chip
//Chip RAM
#define ram_we 4 //pin WE/
#define ram_ce2 5 //pin CE2
#define ram_oe 6 //pin OE/
#define ram_ce1 7 //pin CE1/
//chip 165
#define clock3pin 11 //pin CP
#define set_load 12 //pin PL/
#define load_data 13 //pin Q7
//pin LED
#define pinLed 0
/* FUNZIONAMENTO DELLA RAM
PER SCRIVERE:
CE1/ -> LOW
WE/ -> LOW
CE2 -> HIGH
PER LEGGERE:
WE/ -> HIGH
CE1/ -> LOW
OE/ -> LOW
CE2 -> HIGH
*/
#define LETTURA 2 //stato della RAM: prepara per la lettura
#define SCRITTURA 1 //stato della RAM: prepara per la scrittura
#define DISATTIVA 0 //stato della RAM: disattiva
void clear_shift_registers() {
//routine per ripulire i contenuti dei registri interni
//degli shift register, evitando così che possano inviare
//dati vecchi
digitalWrite(master_reset, LOW);
delay(50);
digitalWrite(master_reset, HIGH);
}
void set_ram(byte stato) {
switch (stato) {
case DISATTIVA:
digitalWrite(ram_ce1, HIGH);
digitalWrite(ram_oe, HIGH);
digitalWrite(ram_ce2, LOW);
digitalWrite(ram_we, HIGH);
break;
case SCRITTURA:
digitalWrite(ram_ce1, LOW);
digitalWrite(ram_ce2, HIGH);
digitalWrite(ram_we, LOW);
digitalWrite(ram_oe, LOW);
break;
case LETTURA:
digitalWrite(ram_ce1, LOW);
digitalWrite(ram_ce2, HIGH);
digitalWrite(ram_oe, LOW);
digitalWrite(ram_we, HIGH);
break;
}
}
void setup() {
//impostazione iniziale dei pin
//
pinMode(master_reset, OUTPUT);
//pin degli shift register 1, 2 e 3 tutti su OUTPUT
pinMode(latch1pin, OUTPUT);
pinMode(clock1pin, OUTPUT);
pinMode(data1pin, OUTPUT);
pinMode(data2pin, OUTPUT);
pinMode(clock2pin, OUTPUT);
pinMode(latch2pin, OUTPUT);
//pin della RAM tutti su OUTPUT
pinMode(ram_we, OUTPUT);
pinMode(ram_ce1, OUTPUT);
pinMode(ram_ce2, OUTPUT);
pinMode(ram_oe, OUTPUT);
//pin dello shift reg. 165
pinMode(clock3pin, OUTPUT);
pinMode(set_load, OUTPUT);
pinMode(load_data, INPUT);
//LED off
analogWrite(pinLed, 0);
//inizializza i dispositivi
clear_shift_registers();
}
void loop() {
unsigned int indirizzo;
byte valore = 0;
int eeprom_pointer = 0;
// azzera 10 locazioni di memoria nella RAM e ci scrive una sequenza di 0-1
for (indirizzo = 0; indirizzo <10; indirizzo++) {
scrivi_ram(indirizzo,valore);
valore += 3;
EEPROM.write(eeprom_pointer, valore);
eeprom_pointer++;
delay(10);
}
delay(1000);
//legge i 10 byte e li scrive in EEPROM
for (indirizzo = 10; indirizzo < 20; indirizzo++) {
valore = leggi_ram(indirizzo);
EEPROM.write(eeprom_pointer, valore);
delay(10);
}
delay(5000);
//ricomincia
}
void scrivi_ram(unsigned int indirizzo, byte valore) {
byte hbyte, lbyte;
//scrive l'indirizzo negli shift reg. n°1 e 2
//prepara l'indirizzo
clear_shift_registers();
digitalWrite(latch1pin, LOW);
digitalWrite(latch2pin, LOW);
hbyte = highByte(indirizzo);
lbyte = lowByte(indirizzo);
shiftOut(data1pin, clock1pin, MSBFIRST, hbyte);
shiftOut(data1pin, clock1pin, MSBFIRST, lbyte);
//prepara il valore
shiftOut(data2pin, clock2pin, MSBFIRST, valore);
//scrive nella RAM
set_ram(SCRITTURA);
digitalWrite(latch1pin, HIGH);
digitalWrite(latch2pin, HIGH);
delay(10);
//disattiva tutto
set_ram(DISATTIVA);
digitalWrite(latch1pin, LOW);
digitalWrite(latch2pin, LOW);
}
byte leggi_ram(unsigned int indirizzo) {
byte valore, hbyte, lbyte;
//legge il contenuto della cella "indirizzo"
//prepara l'indirizzo
clear_shift_registers();
digitalWrite(latch1pin, LOW);
digitalWrite(latch2pin, LOW);
hbyte = highByte(indirizzo);
lbyte = lowByte(indirizzo);
shiftOut(data1pin, clock1pin, MSBFIRST, hbyte);
shiftOut(data1pin, clock1pin, MSBFIRST, lbyte);
//prepara la RAM
digitalWrite(latch1pin, HIGH);
digitalWrite(latch2pin, HIGH);
set_ram(LETTURA);
digitalWrite(clock3pin, HIGH);
digitalWrite(set_load, LOW);
delayMicroseconds(5);
digitalWrite(set_load, HIGH);
set_ram(DISATTIVA);
shiftIn(load_data, clock3pin, valore);
digitalWrite(latch1pin, LOW);
digitalWrite(latch2pin, LOW);
return valore;
}