Utilizzare una EEPROM 24WC16P con Arduino

niente non ci riesco a farlo andare provo a togliere l'alimentazione dalla e2prom e mi da sempre 255 non comunica. come si puo fare?

Stavo per provare il codice di garinus, ma vedo che già non è andato a te...

Devo pensare che abbiamo due Arduino con i pin 4 e 5 fuori uso?? :-/

no funzionano ho provato a leggere un valore analogico e vanno, ho provato anche con i pin digitali, ma niente sembra cha sia attaccata male la E2PROM... secondo me ha qualche cosa il pin 7 (WP)
:slight_smile:

ovvio è il write protection
deve avere uno stato da datasheet sennò non si scrive....

sulle 24C16 deve essere messo a gnd per R/W in queta non lo sò. Però io ho provato con due memorie già citate sopra e non funge con nessuna

Se non sbaglio, nel datasheet dice che va connesso a massa per abilitarne la scrittura...

e lettura

Dopo aver scoperto questo:
"On the Arduino Mega, SDA is digital pin 20 and SCL is 21"
e aver seguito alla lettera questa guida:
http://10kohms.com/arduino-external-eeprom-24lc256
ed aver ottenuto l'ennesimo maledetto 255.... RINUNCIO! >:(

In pratica, ho visto che, in fase di lettura, dopo il comando:

Wire.requestFrom(deviceaddress,1);

il successivo:

Wire.available()

è uguale a NULL!
Quindi le ipotesi sono due: o non scrive nulla (perchè non ha nessun byte da ricevere) o entrambe (ho provato anche con una SLA24C14D con la stessa piedinatura) le EEPROM non funzionano!

Scusate l'intrusione: ma mi è venuto il dubbio che l'indirizzo della eeprom non sia impostato correttamente, in quanto sul datasheet risulta che dovrebbe essere 1010 0xxx dove xxx dipende da come sono impostati i pin A0, A1, A2.
Nel vostro codice invece indicate:

--- (A2, A1, A0 to GND for 1010000 (0x50) address.)

invece di 0xA0 ... (B10100000)
Riporto qui il testo del datasheet:

The four most significant bits of the 8-bit slave address are fixed as 1010 for the CAT24WC01/02/04/08/16 (see Fig. 5). The next three significant bits (A2, A1, A0) are the device address bits and define which device or which part of the device the Master is accessing.

Che traducendolo sarebbe "l 4 bit più significativi dell'8-bit slave address sono fissati a 1010"...
Poi c'è comunque un dubbio se i 3 bit di indirizzo siano A2, A1, A0 oppure A3, A2, A1 (The next three significant bits) ... ma che nel caso siano tutti a 0 il problema non si pone :wink:

Ciao a Tutti
avete provato questo esempio?
http://www.arduino.cc/playground/Code/I2CEEPROM24C1024
dovrebbe funzionare mettendo il valore #define MAX_ADDRESS a 2048
la libreria é fatta per un eprom col indirizzo 0x50 che dovrebbe essere il 24WC16.
Io l' ho provato con un 24LC256 e mi funziona.
Ciao Uwe

Ciao uwefed,
ho provato con 2047 e mi ha dato 2047 errori!
La cosa strana è che una volta fatto l'upload del codice, cliccando su SerialMonitor una volta mi da:

E24C1024 Library Benchmark Sketch

--------------------------------
Write By Byte Test:

Writing data:.

bloccandosi così! Chiudendo e riaprendo lo stesso SerialMonitor, parte dando questo otput:

E24C1024 Library Benchmark Sketch

--------------------------------
Write By Byte Test:

Writing data:.DONE
Total Time (seconds): 0
Write operations per second: 4294967295
--------------------------------

--------------------------------
Read By Byte Test:

Reading data:.
Address: 1 Should be: 1 Read val: 0

Address: 2 Should be: 2 Read val: 0

Address: 3 Should be: 3 Read val: 0

Address: 4 Should be: 4 Read val: 0

Address: 5 Should be: 5 Read val: 0

Address: 6 Should be: 6 Read val: 0

Address: 7 Should be: 7 Read val: 0

Address: 8 Should be: 8 Read val: 0

Address: 9 Should be: 9 Read val: 0

Address: 10 Should be: 10 Read val: 0

Address: 11 Should be: 11 Read val: 0

Address: 12 Should be: 12 Read val: 0

Address: 13 Should be: 13 Read val: 0

Address: 14 Should be: 14 Read val: 0

Address: 15 Should be: 15 Read val: 0

Address: 16 Should be: 16 Read val: 0

Address: 17 Should be: 17 Read val: 0

Address: 18 Should be: 18 Read val: 0

Address: 19 Should be: 19 Read val: 0
DONE

Total Test Time (secs): 0
Read operations per second: 4294967295
Total errors: 19
--------------------------------

[test eseguito su MAX_ADDRESS=20]

La cosa strana è che la maggior parte delle volte si blocca su "Writing data:.", mentre riesce a completare la procedura solo una volta ogni 2/3 circa.

EDIT: Aumentando MAX_ADDRESS a 50, si blocca anche su valori casuali tipo 18 o 24... :o

EDIT2: Aprendo il SerialMonitor, subito dopo aver caricato il codice, alcune volte funziona, ritornando 0 errori in lettura e 0 errori in scrittura

Ho un sospetto che c'é un errore ci collegamento con l'arduino.

Quello che scrivi nel Replay 3
"Ho connesso la EEPROM secondo il seguente schema:
Pin 1 -> GND (Arduino)
Pin 2 -> GND (Arduino)
Pin 3 -> GND (Arduino)
Pin 4 -> GND (Arduino)
Pin 8 -> 5 V (Arduino)
Pin 7 -> GND (Arduino)
Pin 6 -> Analog Pin 5 (Arduino)
Pin 5 -> Analog Pin 4 (Arduino)"

È giusto.
Domanda cretina: hai contato bene i piedini, nel senso giusto?

Ciao Uwe

Ho controllato e ricontrollato, addirittura seguendo le "colonne" della breadboard con un dito, da contatto a contatto!

Comunque su una ventina di prove consecutive con SerialMonitor, in un paio ha completato i cicli di lettura e scrittura apparentemente senza errori, ma per pura (e apparente) casualità!

ancora io ripensando:
Il fatto che ognitanto funzione e altre no é strano.
Puoi fare una foto piú grande che comprende tutto L'arduino per vedere meglio i collegamenti?

Come collegamenti da quel poco che vedo non vedo errori.

Vedo che usi un Arduino Mega. Io per le prove ho usato un 2009. Non dovrebbe essere quello il problema.

Ciao Uwe

Ecco la stessa foto con i dettagli (si ingrandisce...):

(Al momento non posso farne delle altre...)

la EEPROM è quindi così collegata:

Pin 1 -> GND (Arduino)
Pin 2 -> GND (Arduino)
Pin 3 -> GND (Arduino)
Pin 4 -> GND (Arduino)
Pin 8 -> 5 V (Arduino)
Pin 7 -> GND (Arduino)
Pin 6 -> Digital Pin SDC 21 (Arduino)
Pin 5 -> Digital Pin SDA 20 (Arduino)

Ciao Ragazzi
forse non c'entra niente o forse si, ad ogni modo un comportamento analogo a quello citato nei vari interventi nel quale si diceva una volta legge e una volta no..cioè random è capitato anche a me con alcuni dispositivi sull'i2c..nel mio caso i2ckeypad.
Ho risolto con le pullup di 4,7k con altre resistenze il bus ogni tanto impazziva.
Ok ho detto la mia..trucidatemi :smiley:
ciao
Whole

ma quale "trucidatemi"?! Grazie mille per il consiglio! ;D

Ho provato anche con le resistenze di pull-up da 4.7 KOHM (in passato avevo già provato con delle 10K), ma purtroppo non va:
Una volta caricato il codice (con max_address = 50)
si blocca su:

E24C1024 Library Benchmark Sketch

--------------------------------
Write By Byte Test:

Writing data:.

oppure completa il tutto:

E24C1024 Library Benchmark Sketch

--------------------------------
Write By Byte Test:

Writing data:.DONE
Total Time (seconds): 0
Write operations per second: 4294967295
--------------------------------

--------------------------------
Read By Byte Test:

Reading data:.
Address: 1 Should be: 1 Read val: 0

Address: 2 Should be: 2 Read val: 0

Address: 3 Should be: 3 Read val: 0

Address: 4 Should be: 4 Read val: 0

Address: 5 Should be: 5 Read val: 0

Address: 6 Should be: 6 Read val: 0

Address: 7 Should be: 7 Read val: 0

Address: 8 Should be: 8 Read val: 0

Address: 9 Should be: 9 Read val: 0

Address: 10 Should be: 10 Read val: 0

Address: 11 Should be: 11 Read val: 0

Address: 12 Should be: 12 Read val: 0

Address: 13 Should be: 13 Read val: 0

Address: 14 Should be: 14 Read val: 0

Address: 16 Should be: 1 Read val: 0

Address: 17 Should be: 2 Read val: 0

Address: 18 Should be: 3 Read val: 0

Address: 19 Should be: 4 Read val: 0

Address: 20 Should be: 5 Read val: 0

Address: 21 Should be: 6 Read val: 0

Address: 22 Should be: 7 Read val: 0

Address: 23 Should be: 8 Read val: 0

Address: 24 Should be: 9 Read val: 0

Address: 25 Should be: 10 Read val: 0

Address: 26 Should be: 11 Read val: 0

Address: 27 Should be: 12 Read val: 0

Address: 28 Should be: 13 Read val: 0

Address: 29 Should be: 14 Read val: 0

Address: 31 Should be: 1 Read val: 0

Address: 32 Should be: 2 Read val: 0

Address: 33 Should be: 3 Read val: 0

Address: 34 Should be: 4 Read val: 0

Address: 35 Should be: 5 Read val: 0

Address: 36 Should be: 6 Read val: 0

Address: 37 Should be: 7 Read val: 0

Address: 38 Should be: 8 Read val: 0

Address: 39 Should be: 9 Read val: 0

Address: 40 Should be: 10 Read val: 0

Address: 41 Should be: 11 Read val: 0

Address: 42 Should be: 12 Read val: 0

Address: 43 Should be: 13 Read val: 0

Address: 44 Should be: 14 Read val: 0

Address: 46 Should be: 1 Read val: 0

Address: 47 Should be: 2 Read val: 0

Address: 48 Should be: 3 Read val: 0

Address: 49 Should be: 4 Read val: 0
DONE

Total Test Time (secs): 1
Read operations per second: 50
Total errors: 46
--------------------------------

restituendo 46 errori su 50, quando poi guardando l'output dovrebbero essere 50/50. Come mai?? :frowning:

Ho acquistato una 24C512 e funziona perfettamente.....

Capitolo chiuso! :slight_smile:

ciao 83darking83

Penso di aver capito il "trucco" (purtroppo solo adesso).

Il 24WC16 usa i pin di indirizzo A0, A1 e A2 non per avere 8 numeri diversi per identificare il dispositivo sul bus I2C, ma per indirizzare i blocchi di memoria. Per questo se vuoi usare tutti i 2048 Byte di memoria devi cambiare i livelli logici sui pin A0, A1 e A2. La libreria Wire non lo prevede ma indirizza la memoria attraverso dei comandi inviati sul bus.

Se vuoi fare una prova per verificare la mia teoria, fai un test eeprom della memoria da 0 a 255 dovrebbe non darti errori.

IL 25c512 ha solo 2 Bit per il numero identificativo che sono sui pin A0 e A1 (non chiedetemi il perché hanno risparmiato.), ma li usa come normalmente vengono usati sui dipositivi I2C.

Ecco la spiegazione: Il 24WC16 si comporta diversamente come altri EEprom e dispositivi I2C.

Ciao Uwe

Ciao uwefed,
purtroppo sembra che la tua teoria non sia esatta:
ho provato da 0 a 50 e da 0 a 150: con la 24WC16P e con la SLA24C14D danno il 100% di errori, mentre quando sostituisco (lasciando il circuito inalterato) una delle due con una EEPROM da 512Kb, il test termina con 0 errori!

Da questo ne deduco le due possibili ipotesi:

  • Entrambe le due EEPROM (da 14 e 16 Kb) sono guaste
  • Per EEPROM più piccole di 256 Kb tutte le librerie/esempi che si trovano in rete, per Arduino, sono errati