16f628a y 24c256l ni lee ni escribe en picbasic

Hola compañeros!

estoy haciendo un ejercicio del libro micro controladores pic basic de Carlos A Reyes, concretamente 5.9.11. COMUNICACIÓN SERIAL SICRÓNICA I²C.

trata sobre las memorias eeprom. pues bien, en el ejercicio se utiliza una eeprom 24LC04B que simulada en proteus, funciona de maravilla, pero ahora viene mi problema.....

estoy montando el ciercuito en un protoboard y la memoria que tengo es una 24C256LI
montando el circuito en proteus (fm24c256) no funciona, cuando imprime en pantalla los datos leidos, salen cuadraditos negros, y montada en el protoboard salen dos lineas paralelas verticales.

He leido la eeprom en el winpic y no hay nada grabado.

luego he grabado unos datos en la eeprom con winpic y tampoco los lee en el proteus, asi, que no se que es lo que estoy haciendo mal.

este es el codigo que estoy utilizando:

Código:
Define osc 4
Define LCD_DREG PORTB  'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
Define LCD_DBIT 4  'DESDE EL BIT B.4 AL BIT B.7
Define LCD_RSREG PORTB  'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO B
Define LCD_RSBIT 1  'EN EL BIT B.1
Define LCD_EREG PORTB  'UTILIZAR EL ENABLE EN EL PUERTO B
Define LCD_EBIT 0  'EN EL BIT B.2
Define LCD_RWREG PORTB  'UTILIZAR EL ENABLE EN EL PUERTO B
Define LCD_RWBIT 2  'EN EL BIT B.2
Define LCD_BITS 4 ; tamaño del bus del lcd(4 bits)
Define LCD_LINES 2 ; número de líneas del lcd(2)
Define LCD_COMMANDUS 2000 ; retardo del comando en us.
Define LCD_DATAUS 50 ; retardo del tiempo de datos en us.


DEFINE I2C_SCLOUT 1 ;para que no necesite resistencia pull-up en SCL
contro CON %10100000 ;contro contiene valor constante %10100000
PinSCL VAR Porta.1 ;pin señal de reloj I2C
PinSDA VAR Porta.0 ;pin de datos I2C
dato VAR BYTE ;variable para almacenar dato leído
Inicio:
LCDOUT $fe,1," Grabando..." ;limpiar y sacar el texto en LCD
PAUSE 1000
I2CWRITE PinSDA,PinSCL,contro,0,["H"] ;guarda la H en posición 0
PAUSE 10 ;pause para la grabación
I2CWRITE PinSDA,PinSCL,contro,1,["0"] ;guarda la O en posición 1
PAUSE 10 ;pause para la grabación
I2CWRITE PinSDA,PinSCL,contro,2,["L"] ;guarda la L en posición 2
PAUSE 10 ;pause para la grabación
I2CWRITE PinSDA,PinSCL,contro,3,["A"] ;guarda la A en posición 3
PAUSE 10 ;pause para la grabación
I2CWRITE PinSDA,PinSCL,contro,4,["A"] ;guarda la A en posición 4
PAUSE 10 ;pause para la grabación
LCDOUT $fe,1,"Leer memoria" ;limpiar y sacar el texto en LCD
PAUSE 1000
LCDOUT $FE,1 ;limpiar pantalla del LCD
leer: ;programa para leer la memoria serial.
I2CREAD PinSDA,PinSCL,contro,0,[dato] ;leer la mem. 0 y guardar en dato
LCDOUT, dato ;mostrar dato en el LCD
PAUSE 1000 ;esperar 1 seg.
I2CREAD PinSDA,PinSCL,contro,1,[dato] ;leer la mem. 1 y guardar en dato
LCDOUT, dato ;mostrar dato en el LCD
PAUSE 1000 ;esperar 1 seg.
I2CREAD PinSDA,PinSCL,contro,2,[dato] ;leer la mem. 2 y guardar en dato
LCDOUT, dato ;mostrar dato en el LCD
PAUSE 1000 ;esperar 1 seg.
I2CREAD PinSDA,PinSCL,contro,3,[dato] ;leer la mem. 3 y guardar en dato
LCDOUT, dato ;mostrar dato en el LCD
PAUSE 1000 ;esperar 1 seg.
I2CREAD PinSDA,PinSCL,contro,4,[dato] ;leer la mem. 4 y guardar en dato
LCDOUT, dato ;mostrar dato en el LCD
END

ojala puedan ayudarme,

un saludo

por cierto, estoy utilizando el reloj interno del 16f628a a 4Mhz
 
Última edición por un moderador:
perdon D@rkbytes
ahora ya se como se envuelve el código.
No volverá a pasar!



puede ser un tema de los fuses????
tengo que configurar el puerto a (donde esta el data y clock) como salidas???

que perdido estoy!!!

:(
 
Última edición:
puede ser un tema de los fuses????
tengo que configurar el puerto a (donde esta el data y clock) como salidas???
Si es importante la configuración de los fuses, y configurar los puertos también.
Pero PICBasic se encarga de hacerlo en algunas funciones.
Para LCDOUT, I2CREAD e I2CWRITE, lo hace.

No he trabajado con memorias grandes en PICBasic, solo hasta la 2416.
Y no te confíes en la instrucción I2C_SCLOUT para no usar resistor en la línea SCL.
Coloca resistores de pull-up de 4.7k en las líneas SCL y SDA
Por lo regular los pines 1, 2, 3, y 7 de la memoria van conectados a tierra (VSS)

Si tienes una memoria de menor capacidad por ejemplo una 2402, prueba primero el programa con esa.
Ya que no estoy seguro si PBP pueda trabajar con memorias superiores a la 2416.

Para que hagas una prueba de funcionamiento adjunto un programa que funciona.

Suerte.
 

Adjuntos

  • I2C_SCH.gif
    I2C_SCH.gif
    19.2 KB · Visitas: 20
  • I²C EEPROM.rar
    17.8 KB · Visitas: 24
Última edición:
gracias D@rkbytes

He grabado en el 16f628a el hex que me enviaste y este ha sido el resultado

sigue sin escribir ni leer en la 24c256 :(

ahora no tengo otra memoria, pero vere a ver si puedo comprar una esta tarde y pruebo.

de todas formas..... para el programa que tengo que hacer, tengo que guardar mucha informacion, y necesitaria esta memoria.

seguiré informando!

gracias!
 
bueno.... ya funciona!!

Le he puesto una 24c16 y todo ok (salvo que mi protoboard parece que no hace bien algunas conexiones :( )

He encontrado por ahi, lo siguente.... "Parece que olvidaron que para el 24LC256, la direccion debe ser de 16 bits."

pero en el datasheet dice: The CAT24C256 is a 256 kb Serial CMOS EEPROM, internally
organized as 32,768 words of 8 bits each.

...????¿¿¿¿¿????¿¿¿¿
 
Última edición:
Està bien, son datos de 8 bits a los que se accede con direcciones de 16 bits, y la direccion de acceso a la memoria es de 16 bits... Bueno, deje hace buen tiempo del PicBasic pero trata de revisar que efectivamente el PIC envie 2 bytes seguidos sin bits de Stop o Start (Protocolo I2C) solo con ACK entre bytes a modo de 16bits para el acceso. De lo contrario ya es cosa del compilador ya que no recuerdo si esto es configurable para direcciones de 8 o 16 bits.

Un saludo
 
Saludos.
bueno.... ya funciona!!

Le he puesto una 24c16 y todo ok
OK. Es por que el programa es para memorias Standart, por eso con la 2416 funciona. :)
He encontrado por ahi, lo siguente....
Parece que olvidaron que para el 24LC256, la direccion debe ser de 16 bits.
Sip. Este tipo de memorias son Smart.
Ahora para eso lo que tienes que hacer, es declarar una variable del tipo Word
Por ejemplo...
Address VAR WORD
Dato VAR BYTE
Y para escribir sobre la memoria haces lo siguiente...
Address = 0
Dato = "X"
I2CWRITE SDA,SCL,$A0,Address,[Dato]
En vez de...
I2CWRITE SDA,SCL,$A0,0,[Dato]

Y Para leerla haces lo mismo.
Address = 0
I2CREAD SDA,SCL,$A0,Address,[Dato]

Nos cuentas si funciona.

Suerte.
 
Atrás
Arriba