Scrivere su eeprom 24C256

emilio0

New Member
Vi sarei davvero grato se qualcuno potesse aiutarmi con il seguente problema
Non riesco leggere/scrivere su eeprom 24C256.

l'HW e composto da 08m2 collegato con 24C256 in I2C ai pin c.1 (SCL)e c.2 (SDA) e ai
corrispondenti pin eeprom con resistenza 4.7K verso il +.
I 3 pin di indirizzo e 1 pin di protezione dalla scrittura. Sono tutti a terra.
Ho sostituito il 08m2 con altro sicuramente funzionante.
La eeprom l'ho sostituita con altre ma non e cambiato nulla.


Il programma e' tratto da un demo trovato in internet (forse forum?) perche'
non avendo mai usato delle eeprom, volevo inserire da un programma che sto
montando, molti testi da inviare al display. (ogni record a 16 caratteri
da inviare a display)

Facendo andare il programma allegato in PE 6.2 legge e scrive su eeeprom
simulata senza nessun problema.

Dopo aver trasferito il programma su 08m2 non legge e non scrive.
Messa eeprom su programmatore (mod ch341 impostato su 24C256) risulta
completamente vuota.
invece da eeprom scritta trasferita su 08m2 non legge nulla.
Ho messo il modulo completo (tipo aliexpress)completo, ma nen e' cambiato nulla.

Il programma in questione mi sembra abbastanza semplice, ma evidentemente non
considero qualcosa di essenziale.
Perche'???

Ringrazio chiunque possa darmi una dritta

[ code]
;-----------------------------------------------------------
;Test code for EEPROM demo circuit PICAXE 08m2 and 24C256
;-----------------------------------------------------------
#picaxe 08m2

Symbol lcd_c.0 =c.0 ;Assign LCD to port
symbol contattore =b0 ;n. carattere
symbol lettura =b1 ;da eeprom

pause 500
hi2csetup i2cmaster, %10100000, i2cfast, i2cword
;----------------------------------------------------------
;Scrivi un campione al primo chip - nota che il buffer
;su un 24C256 puo contenere 64 byte
;----------------------------------------------------------
;azzera eprom
hi2cout 0,(" ") ;formato da indirizzo e testo da memorizzare
hi2cout 64,(" ")
pause 10

;scrive in eprom
hi2cout 0,("0123456789012345")
hi2cout 64,("abcdefgh")
pause 100 ;attesa termine scrittura
Serout lcd_c.0,N2400,(254,1) ;pulizia display
Pause 100
;----------------------------------------------------------
;Leggi indietro i campioni e inviali al terminale (lettura=0123456789012345abcdefgh [00]
;----------------------------------------------------------
hi2cin 0,(lettura)
Serout lcd_c.0,N2400,(254,128,lettura)
sertxd (lettura) ;Visualizza i dati sullo schermo
for contattore=0 to 14 ;poi gli altri
hi2cin (lettura)
Serout lcd_c.0,N2400,(lettura) ;Visualizza i dati su display
sertxd (lettura) ;Visualizza i dati sullo schermo
next
Serout lcd_c.0,N2400,(cr,lf)
sertxd (cr,lf)
;End
;---------------------------------------------------------
;seconda riga
hi2cin 64,(lettura)
Serout lcd_c.0,N2400,(254,192,lettura)
sertxd (lettura) ;Visualizza i dati sullo schermo
for contattore=0 to 14 ;poi gli altri
hi2cin (lettura)
Serout lcd_c.0,N2400,(lettura)
sertxd (lettura) ;Visualizza i dati sullo schermo
next
Serout lcd_c.0,N2400,(cr,lf)
sertxd (cr,lf)
End
[ /code]
 
Start smaller ... just write a program to send ONE BYTE to the EEPROM ... at a specified address ... then, READ that BYTE back and ensure you've got that functionality down before moving forward.
 
Grazie b-powell,
ridotto programma a queste poche righe ma il risultato e lo stesso, in editor va bene nel 08m2 non va bene.

symbol lettura=w4
symbol b_alto_LSB=b8
symbol b_basso_MSB=b9

hi2cout 0,("7")
pausa 100
hi2cin 0,(lettura)
Serout lcd_c.0,N2400,(254,128,lettura,#b_basso_MSB,#b_alto_LSB)

testato in pe6 va bene.
caricato in 08m2, inviato ascii "7" letto: carattere assurdo+0+161+ carattere assurdo.

Io mi aspetto di ricevere ascii 55 non 161 da eeprom fisica.
decisamente non mi raccapezzo piu.
 
Pin 7 (write protect) of the 24C256 should be left open circuit or tied to ground in order to write to the eeprom.

Suggest you check the values of your 4.7k resistors with a multimeter, and also check you haven't accidentally swapped the SCL and SDA lines between picaxe and eeprom.

Do you have any other devices or modules like a RTC connected to the SCL/SDA lines, if so you may have an additional device which also has 4.7k resistors built in. Therefore you may have too many resistors.

Don't forget to include the hi2setup command in your simplified code.

Suggest you upload a high quality photo of your breadboard if you still have problems.
 
Before you use 400kbits/s, get it to work at 100kbits/s. The following code snips are directly from my code for a working 24LC256.
Prima di usare 400 kbit/s, fallo funzionare a 100 kbit/s. I seguenti frammenti di codice provengono direttamente dal mio codice per un 24LC256 funzionante.
Rich (BB code):
Symbol i2cAddr24LC256= %10100000 '$A0: i2c upper nibble of 24LC256 EEPROM Chip address
Symbol EEPROMPtr     = w5  'b10,11  Pointer into 24LC256 i2c EEPROM Chip
Rich (BB code):
hi2cSetUp i2cMaster, i2cAddr24LC256, i2cslow, i2cword ' set 24LC256 slave address with word-sized addressing
Rich (BB code):
EEPROMPtr = 0
'hi2cOut [i2cAddr24LC256], EEPROMPtr, (15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)  'For 20X2, 28X2, 40X2
hi2cOut EEPROMPtr, (15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)   'For 08M2, 14M2, 18M2, 20M2
Edit: Add code for PICAXE M2 series
 
Last edited:
Vi ringrazio per interessamento!

Per Jack brucia:
-il pin 7 e 1,2,3,4 sono a massa.
-i valori delle resistenze controllate sono 4.68 e 4.67 Kohm
-le linee SCL e SDA sono collegate direttamente alla eeprom in modo diretto
-nel bus i2c e' collegato solo la EEprom
-il comando hi2setup e' presente
-il processore proviene da installazione funzionante demolita perche' sostituita

Secondo Ingleswoodpete:
al posto della 24LC256 uso 24C256, fa differenza?
istruzione: hi2cOut [i2cAddr24LC256], EEPROMPtr, (15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) dall'errore in PE6
ERRORE: hi2cOut [i2cAddr24LC256], EEPROMPtr, (15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) ;da errore
^
Errore di sintassi on line 13 a/prima della posizione 38
Errore: l'indirizzo slave del prefisso non è supportato da questo chip!

il programma funzione bene in PE6 ma non con 08m2
Ti allego i risultati ottenuti con pe6 e con 08m2 e programma installato.

[codice]
Simbolo lcd_c.0 =c.0 ;Assegna LCD alla porta
symbol contattore =b0 ;n. carattere

Symbol i2cAddr24LC256=%10100000 '$A0: I2C Upper Nibble di 24LC256 EEPROM CHIP Indirizzo
Simbolo EEPROMPtr =w5'B10,11 puntatore nel chip eeprom i2c 24lc256

hi2cSetUp i2cMaster, i2cAddr24LC256, i2cslow, i2cword ;Imposta l'indirizzo slave 24LC256 con indirizzamento delle dimensioni di parole
EEPROMPtr=0

;hi2cOut [i2cAddr24LC256], EEPROMPtr, (15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) ;da errore
hi2cOut EEPROMPtr, (15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) ;OK
pause 100 ;attesa termine scrittura

Serout lcd_c.0,N2400,(254,1) ;pulizia display
Pausa 100

hi2cin EEPROMPtr,(EEPROMPtr)
sertxd (EEPROMPtr) ;Visualizza i dati sullo schermo
EEPROMPtr=EEPROMPtr+48
Errore lcd_c.0,N2400,(254,128,EEPROMPtr)

for contattore=0 to 13 ;step 2;poi gli altri
hi2cin (EEPROMPtr)
sertxd (EEPROMPtr) ;Visualizza i dati sullo schermo
EEPROMPtr=EEPROMPtr+48
Serout lcd_c.0,N2400,(EEPROMPtr) ;Visualizza i dati su display
Prossimo
sertxd (cr,lf)
FINE
[ /codice] Display_PE6.jpegDisplay_del programma_08m2.jpeg
 
Secondo Ingleswoodpete:
al posto della 24LC256 uso 24C256, fa differenza?
istruzione: hi2cOut [i2cAddr24LC256], EEPROMPtr, (15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) dall'errore in PE6
ERRORE: hi2cOut [i2cAddr24LC256], EEPROMPtr, (15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) ;da errore
^
Errore di sintassi on line 13 a/prima della posizione 38
Errore: l'indirizzo slave del prefisso non è supportato da questo chip!

il programma funzione bene in PE6 ma non con 08m2
Ti allego i risultati ottenuti con pe6 e con 08m2 e programma installato.
I apologise - my code was for a 20X2. I had connected two i2c chips: an EEPROM (24LC256) and a Clock DS1307 for logging data.
Mi scuso, il mio codice era per un 20X2. Avevo collegato due chip i2c: una EEPROM (24LC256) e un Clock DS1307 per la registrazione dei dati.

It appears that the LCD is not being initialised correctly. Can you tell us which LCD model you are using?
Sembra che l'LCD non venga inizializzato correttamente. Puoi dirci quale modello di LCD stai utilizzando?

Also, try adding/replacing the following code:
Inoltre, prova ad aggiungere/sostituire il seguente codice:
Rich (BB code):
Symbol EEPROMData = b3

EEPROMPtr = 0
For contattore = 0 to 13               ;step 2;poi gli altri
   hi2cin EEPROMPtr, (EEPROMData)      ;Read contents of EEPROM Word address into the Byte variable
   SerOut lcd_c.0,N2400,(#EEPROMData)  ;# - converts binary byte to a decimal value before transmission
   Inc EEPROMPtr
Next contattore
 
Last edited:
Peringleswoodpete:

Ti ringrazio per interessamento!

Ho caricato il codice che mi hai dato, ma non riuscivo comunque ad avere i risultati sperati.
Dell'HW ho sostituito tutto, ma nulla.
Dopo 1 giorno di prove ho scoperto che cambiando display (difettoso?) la scrittura era corretta al 50%.
Questa mattina ho visto che togliendo i comandi "sertxd" disseminati nel programma, ottenevo il funzionamento corretto.

Allego il programma funzionante nel caso che qualcuno ne possa trarre beneficio.
La funzione principale e' scrivere e leggere stringhe di 16 caratteri (per display 16x2) usando EEPROM.
Il limite di stringhe memorizzabili e' in funzione della capacita' della EEPROM.
Il programma e' rudimentale e migliorabile, usa solamente 16 caratteri per pagina, questo e' voluto per l'uso che ne debbo fare.

Vi ringrazio tutti per l'aiuto che mi ha portato ad ottenere i risultati sperati, che altrimenti non ci sarei mai arrivato. (quasi un mese di mal di testa)

[codice]
#picaxe 08m2
Symbol lcd_c.0 =c.0 'Assign LCD to port

symbol lettura =b0
symbol indirizzo =w1

hi2csetup i2cmaster, %10100000, i2cfast, i2cword

;scrive in eprom
hi2cout 0,("0123456789012345",3)
pause 100
hi2cout 40,("abcdefgh ",3)
pause 100
hi2cout 80,("alba e tramonto ",3)
pause 100
hi2cout 120,(" ",3)
pause 100
Serout lcd_c.0,N2400,(254,1)
Pause 100

;leggere EEPROM
Serout lcd_c.0,N2400,(254,128)
indirizzo=0 ;inizio EEPROM
gosub leggere
pause 1000
Serout lcd_c.0,N2400,(254,192)
indirizzo=40 ;64 bit dopo
gosub leggere
pause 1000
Serout lcd_c.0,N2400,(254,128)
indirizzo=80 ;altri 64 bit dopo
gosub leggere
pause 1000
Serout lcd_c.0,N2400,(254,192)
indirizzo=120 ;altri 64 bit dopo
gosub leggere
end

leggere:
do
hi2cin indirizzo,(lettura)
inc indirizzo
if lettura=3 then
Serout lcd_c.0,N2400,(cr,lf)
exit
endif
Serout lcd_c.0,N2400,(lettura)
loop
return
[ /code]
 
Glad you now have it working.

You should be able to use both "sertxd" and the lcd by moving the lcd to a different output, for example C.1, C.2, C.4
 
Per Jack brucia:
Non sapevo che si potesse redirizionare il display su un'altra uscita.
Con il 08m2 che ha pochi pin usare altra uscita e' uno spreco. ma uso spesso il 18m2 e potrebbe risolvere parecchi problemi di debug.
Grazie ancora.
ciao.

 
Per Inglewoodpete:

Scusami ma ho fatto copia/incolla e non avevo fatto caso allo spazio incorporato nel tag di chiusura.

ciao...
 
For future reference, when posting code, edit the program so that [code] appears at the top and [/code] at the bottom of your code.
Per riferimento futuro, quando pubblichi il codice, modifica il codice del programma in modo che [code] appaia in alto e [/code] in basso.
 
Back
Top