TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: cdlopez en 01 de Octubre de 2006, 23:45:38

Título: Lectura y escritura de eeprom 24lc256
Publicado por: cdlopez en 01 de Octubre de 2006, 23:45:38
Hola Amigos:

Les posteo un codigo de PBP extraido de los ejemplos que trae el PBP, lo adapte para probarlo con un circuito que estoy realizando en el proteus, la rutina consiste en escribir las primeras 16 posiciones de la memoria y luego leerlas utilizando los comandos i2cwrite y i2cread, sucede que al simularlos no escribe y por lo tanto lee cualquier cosa. El micro es un 16f877 funcionando a 4 mhz, tanto el pin de datos como el de clock tiene una resistencia de 4,7k nu pudeo encontrar el error, el codigo es el siguiente:
   
    ' I2CREAD and I2WRITE Commands
'
' Write to the first 16 locations of an external serial EEPROM
' Read first 16 locations back and send to serial out repeatedly
' Note: for EEPROMS with byte-sized address

Include "modedefs.bas"          ' Include serial modes

             


DPIN    var     PORTD.6                 ' I2C data pin
CPIN    var     PORTD.7                 ' I2C clock pin
N0      var     byte
N1      var     byte
 

        For N0 = 0 To 15                ' Loop 16 times
                I2CWRITE DPIN,CPIN,$A0,N0,[N0]  ' Write each location's address to itself
                Pause 10                ' Delay 10ms after each write
        Next N0

loop:   For N0 = 0 To 15          ' Loop 8 times
                I2CREAD DPIN,CPIN,$A0,N0,[N1]        ' Read 2 locations in a row
                serout2 PORTB.2, 84,[N1]              ' Print 2 locations
        Next N0

        serout2 PORTB.2, 84,[13]            ' Print linefeed

        Goto loop


desde ya muchas gracias :lol:
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: LordLafebre en 01 de Octubre de 2006, 23:53:39
Hola:

Tienes puestas las resistencias de pull-up en SDA y SCL?
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: cdlopez en 02 de Octubre de 2006, 00:11:38
hola:

si esta aclarado arriba en el post. (4,7k)

Gracias.
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: LordLafebre en 02 de Octubre de 2006, 01:41:19
Hola:

Lo siento, no me di cuenta, una cosita mas, puedes pasarme el esquema para ver si puedo resolverte el problema?

el codigo parece estar bien, a ver si con el esquema me pongo a hacer un ejemplito sencillo.
Título: Ahi va el esquema a ver que te parece????
Publicado por: cdlopez en 02 de Octubre de 2006, 15:05:31
Gracias por tu atencion :) :) :)
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: LordLafebre en 02 de Octubre de 2006, 18:32:34
Hola:

Para la noche lo reviso cuando salga del trabajo. (Hora Ecuador GMT -5)
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: LordLafebre en 03 de Octubre de 2006, 12:10:35
Hola:

Pues no me va la simulación, no se a que se deba, no me funciona ni con serout2, ni seorut, ni en el lcd, intente a poner solamente un dato en una sola posicion de memoria, y leer ese dato y tampoco me funciono, lo curioso es que es algo sencillo y que en la realidad de seguro que funciona, no habia simulado antes una eeprom en proteus, si el culpable no soy yo (de que funcione) me temo que se debe a un error de Proteus  :D , o a algo que no sepa, pero como esta deberia funcionar.
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: cdlopez en 03 de Octubre de 2006, 20:29:58
Pues si es algo raro, te cuento que estuve intentando hacerlo y como proteus me permite parar la simulacion (pause) y poder ver los datos de la eeprom, observo que nada se graba, inclusive el log de la epprom me aparecen unos warnings que no los comprendo, no hay mucha informacion en la red voy a seguir insistiendo y voy a postear los resultados.

Muchas gracias
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: LordLafebre en 04 de Octubre de 2006, 00:11:10
Hola:

Ahora no me confio para nada en la simulacion de proteus, y ya no me sorprende cuando veo algo raro, no lo puedes armar para comprobar su funcionamiento en la realidad?
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: Y@el en 04 de Octubre de 2006, 01:52:03
Bueno Amigos, les comento que ami si me salio.

Parece que olvidaron que para el 24LC256, la direccion debe ser de 16 bits.

Aca esta mi codigo
Código: [Seleccionar]
DEFINE OSC 4
DEFINE I2C_SLOW 1
Include "modedefs.bas"          ' Include serial modes
             


DPIN    var     PORTD.6                 ' I2C data pin
CPIN    var     PORTD.7                 ' I2C clock pin
N0      var     WORD
N1      var     byte
 
        N1=0
        For N0 = 0 To 15                ' Loop 16 times}
                I2CWRITE DPIN,CPIN,$A0,N0,[N1]  ' Write each location's address to itself
                Pause 10                ' Delay 10ms after each write
                N1=N1+1
        Next N0

loop:   For N0 = 0 To 15          ' Loop 8 times
                I2CREAD DPIN,CPIN,$A0,N0,[N1]        ' Read 2 locations in a row
                serout2 PORTB.2, 84,[N1]              ' Print 2 locations
        Next N0

        serout2 PORTB.2, 84,[13]            ' Print linefeed

        Goto loop

Adjunto el Codigo Fuente y Simulacion en Proteus.

Saludos

Yoel Ocmin
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: cdlopez en 04 de Octubre de 2006, 09:00:56
Muy bien Sr. Yoel_Ocmin yo no lo hubiera resuelto tan facilmente, pero que bueno que entre todos podamos resolver estos pequeños grandes inconvenientes con la ayuda de los *maestros * como ud.

La verdad que le estoy muy agradecido.

Ahora tengo una duda en el manual de PBP dice que la instruccion DEFINE I2C_SLOW 1 solo debe usarse para circuitos que usen cristales de 8 MHZ o mas, supongo que es algo que esta mal en el mismo manual porque aqui lo usó y funciona perfectamente con  4 MHZ.

Otras cosa, es la primera vez que intento simular este tipo de dispositivos con proteus y entre cada simulacion se debe ejecutar en al menu debug el comando, *reset persistent model data* pues sino queda la memoria con los datos de la simulacion anterior, lo comento para que sirva de referencia para futuras consultas de otros colegas.

Saludos a todos

Muchas gracias
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: LordLafebre en 04 de Octubre de 2006, 10:56:49
Parece que olvidaron que para el 24LC256, la direccion debe ser de 16 bits.

Hola:

Pequeño detalle que se me escapó :mrgreen:
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: Y@el en 04 de Octubre de 2006, 17:36:19
Muy bien Sr. Yoel_Ocmin yo no lo hubiera resuelto tan facilmente, pero que bueno que entre todos podamos resolver estos pequeños grandes inconvenientes con la ayuda de los *maestros * como ud.

La verdad que le estoy muy agradecido.

Ahora tengo una duda en el manual de PBP dice que la instruccion DEFINE I2C_SLOW 1 solo debe usarse para circuitos que usen cristales de 8 MHZ o mas, supongo que es algo que esta mal en el mismo manual porque aqui lo usó y funciona perfectamente con  4 MHZ.

Otras cosa, es la primera vez que intento simular este tipo de dispositivos con proteus y entre cada simulacion se debe ejecutar en al menu debug el comando, *reset persistent model data* pues sino queda la memoria con los datos de la simulacion anterior, lo comento para que sirva de referencia para futuras consultas de otros colegas.

Saludos a todos

Muchas gracias

Bueno Amigos, no me digan maestro que me lo voy a creer  :mrgreen:

Solo observe ese detalle, y procedi a comentarlo. Eso no me hace maestro, sino solo alguien que sabia algo antes que ustedes.

Otro detalle.

En el ckto que puse, Solo he verificado que los datos se almacenen, viendo la memoria interna del 24LC256.

Pero al leer los datos para mostrarlos usando:

loop:   For N0 = 0 To 15          ' Loop 8 times
                I2CREAD DPIN,CPIN,$A0,N0,[N1]   'Leemos el dato No, y lo guardamos en N1
                serout2 PORTB.2, 84,[N1]              'Mostramos serialmente el dato leido.
        Next N0

Pero, no lo he podido conseguir, he cambiado algo del codigo, para poder almacenar los datos en la memoria. y tampoco los puedo apreciar.
En este momento no tengo los cambios ya que los hize por la noche... Espero estar equivocado, y por razones del sueño... haber errado en algo....

Saludos

Yoel Ocmin
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: cdlopez en 06 de Octubre de 2006, 00:06:21
Tampoco yo puedo leer en la pantalla de la terminal de proteus el dato leido, solo veo algunos simbolos extraños en la pantalla, supongo que estara el problema en la representacion de los datos en formto Hexa

voy a seguir probando.

Saludos
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: Y@el en 06 de Octubre de 2006, 10:53:14
Tal parece que es un fallo de Proteus.

Lo pude comprobar, con el ejemplo del libro Pic16f84A

http://personales.ya.com/cepalacios/Proteus.htm#Proteus_Capitulo_22

Pueden ver que no lee, o en todo caso siempre que lee lo hace con 0x7F

Veremos si se puede solucionar esto.

bytes.

Yoel
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: cdlopez en 10 de Octubre de 2006, 10:55:51
Hola continuando un poco con el tema:

Intente hacer un circuito que lea valores analogicos y los almacene en la eeprom, tomando siempre como base los ejemplos de PBP, si bien la compilacion no me da errores cunado voy a simular el proteus me arroja el siguiente error:

SIMULATION LOG
==============
Design:   C:\Documents and Settings\INTERNET\Escritorio\Prueba de adquisicion analogia y almacenamiento en memoria eeprom.DSN
Doc. no.: <NONE>
Revision: <NONE>
Author:   <NONE>
Created:  10/10/06
Modified: 10/10/06

Compiling source files...
Build completed OK.
Compiling netlist...
Linking netlist...
Partition analysis...

Simulating partition 1 [ED85F880]...
PROSPICE Release 6.9 SP4 (C) Labcenter Electronics 1993-2006.
SPICE Kernel Version 3f5. (C) Berkeley University ERL.

Reading netlist...
Reading SPICE models...
Building circuit...
Instantiating SPICE models...
[U1] PIC16 model release 6.9 SP0 simulating PIC16877 device.
[U2] I2CMEM model release 6.8 SP4 (IR1).
[U2] 0          [STOPPED    ]: Loaded 32768 bytes of persistent memory data.
[U1] Loaded 256 bytes of persistent EEPROM data.
[U1] Loading HEX file 'lectura de valor analogico y almacenamiento en eeprom.hex'.
[U1] Read total of 758 bytes from file 'lectura de valor analogico y almacenamiento en eeprom.hex'.
[U1] Loaded 377 program words and 0 data bytes.
[SPICE] DELMIN increased to 4.94066e-324 due to lack of time precision
PROSPICE -  Internal Exception: access violation in module 'SPICESIM.DLL'.
Totaliters=0, Totalsteps=1, Goodsteps=1, Badsteps=0

PROSPICE -  Internal Exception: access violation in module 'SPICESIM.DLL'.

Real Time Simulation FAILED.


se produce un fallo en la simulacion, con el modulo de spice, hay algo mal en el circuito???

Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: Marioguillote en 15 de Octubre de 2006, 20:34:01
Hola a todos !

Has probado de cambiar la memoria ?
Me ha pasado al trabajar con simulación en I2C que hay memorias que no me funcionan. Me dan ese tipo de errores.
Puedes probar con la FM24C256F a ver que pasa. Esas me han funcionado.
DPIN sería SDA y CPIN sería SCL.
No dejes de poner WP a GND.

Saludos
Mario
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: Necrobutcher en 19 de Octubre de 2006, 02:38:18
Colega, no creo q tengas malo el circuito, cuentame has simulado otros ejercicios con proteus? aparte de los samples que vienen con proteus.

Pues si es primera vez proteus, te recomiendo que busques un manual para su correcta configuracion con pbp, y asi solucionaras tu problema, si no tienes alguno me avisas y te lo mando encantado.

saludos
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: kime90 en 17 de Noviembre de 2010, 15:10:09
Amigos tngo el mismo problema pero yo necesito sacarlo en un LCD este es mi programa: Espero su ayuda


define OSC 4

DEFINE I2C_SDA PORTC,4 'Data pin for I2C (12-bit core only)
DEFINE I2C_SCL PORTC,3 'Clock pin for I2C (12-bit core only)
DEFINE I2C_SCLOUT 1 'Set serial clock to bipolar instead of open-collector

DEFINE LCD_DREG PORTB 'LCD data port
DEFINE LCD_DBIT 4 'LCD data starting bit 0 or 4
DEFINE LCD_RSREG PORTB 'LCD register select port
DEFINE LCD_RSBIT 0 'LCD register select bit
DEFINE LCD_EREG PORTB 'LCD enable port
DEFINE LCD_EBIT 2 'LCD enable bit
DEFINE LCD_RWREG PORTB 'LCD read/write port
DEFINE LCD_RWBIT 1 'LCD read/write bit
DEFINE LCD_BITS 4 'LCD bus size 4 or 8
DEFINE LCD_LINES 2 'Number lines on LCD
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us

  'portc3 = reloj
  'portc4 = Dato
 
WR COn %10100000
RW COn %10100001
SCL VAR PORTC.3 
SDA VAR PORTC.4
dato var byte 


TRISC = 0
TRISB = 0
TRISA = 0
ADCON1 = 6


Esperar:

If porta.0 = 1 then inicio

goto esperar

Inicio:
  LCDOUT $FE,1,"  GRABANDO"
  LCDOUT $FE, $c0,"    EN MEMORIA"
  pause 1000
  LCDOUT $FE,1
 
       
i2cwrite sda,SCL,WR,0,["H"]
pause 10
i2cwrite sda,SCL,WR,1,["O"]
PAUSE 10
i2cwrite sda, SCL , WR,2, ["L"]
PAUSE 10
i2cwrite sda, SCL , WR,3, ["A"]
PAUSE 10


 LEER:
 
 
 LCDOUT $FE,1," LEYENDO ESPERE"     
 LCDOUT $FE, $c0,"  UN MOMENTO"
  pause 1000
   LCDOUT $FE,1
 
 
 
i2CREAD sda ,SCL, WR,0,[dato]
LCDOUT,  dato
pause 1000
i2CREAD sda ,SCL, WR,1,[DATO]
LCDOUT , dato
PAUSE 1000
i2CREAD sda ,SCL , WR,2, [dato]
LCDOUT , dato
PAUSE 1000
i2CREAD sda, SCL , WR,3, [dato]
LCDOUT , dato
PAUSE 1000
 
goto ESPERAR

 end
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: ASTROCAR en 24 de Noviembre de 2010, 07:02:19
Amigos tngo el mismo problema pero yo necesito sacarlo en un LCD este es mi programa: Espero su ayuda


define OSC 4

DEFINE I2C_SDA PORTC,4 'Data pin for I2C (12-bit core only)
DEFINE I2C_SCL PORTC,3 'Clock pin for I2C (12-bit core only)
DEFINE I2C_SCLOUT 1 'Set serial clock to bipolar instead of open-collector

DEFINE LCD_DREG PORTB 'LCD data port
DEFINE LCD_DBIT 4 'LCD data starting bit 0 or 4
DEFINE LCD_RSREG PORTB 'LCD register select port
DEFINE LCD_RSBIT 0 'LCD register select bit
DEFINE LCD_EREG PORTB 'LCD enable port
DEFINE LCD_EBIT 2 'LCD enable bit
DEFINE LCD_RWREG PORTB 'LCD read/write port
DEFINE LCD_RWBIT 1 'LCD read/write bit
DEFINE LCD_BITS 4 'LCD bus size 4 or 8
DEFINE LCD_LINES 2 'Number lines on LCD
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us

  'portc3 = reloj
  'portc4 = Dato
 
WR COn %10100000
RW COn %10100001
SCL VAR PORTC.3 
SDA VAR PORTC.4
dato var byte 


TRISC = 0
TRISB = 0
TRISA = 0
ADCON1 = 6


Esperar:

If porta.0 = 1 then inicio

goto esperar

Inicio:
  LCDOUT $FE,1,"  GRABANDO"
  LCDOUT $FE, $c0,"    EN MEMORIA"
  pause 1000
  LCDOUT $FE,1
 
       
i2cwrite sda,SCL,WR,0,["H"]
pause 10
i2cwrite sda,SCL,WR,1,["O"]
PAUSE 10
i2cwrite sda, SCL , WR,2, ["L"]
PAUSE 10
i2cwrite sda, SCL , WR,3, ["A"]
PAUSE 10


 LEER:
 
 
 LCDOUT $FE,1," LEYENDO ESPERE"     
 LCDOUT $FE, $c0,"  UN MOMENTO"
  pause 1000
   LCDOUT $FE,1
 
 
 
i2CREAD sda ,SCL, WR,0,[dato]
LCDOUT,  dato
pause 1000
i2CREAD sda ,SCL, WR,1,[DATO]
LCDOUT , dato
PAUSE 1000
i2CREAD sda ,SCL , WR,2, [dato]
LCDOUT , dato
PAUSE 1000
i2CREAD sda, SCL , WR,3, [dato]
LCDOUT , dato
PAUSE 1000
 
goto ESPERAR

 end

Hola colega estas usando pic basic, si es asi, te recomiendo que agregues este sector en tu codigo Include "modedefs.bas"          ' Include serial modes.

Saludos y espero tus comentarios.
Atten.
Alexander santana.
Venezuela-Barcelona.
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: kime90 en 27 de Noviembre de 2010, 15:08:00

define OSC 4

DEFINE I2C_SDA PORTC,4 'Data pin for I2C (12-bit core only)
DEFINE I2C_SCL PORTC,3 'Clock pin for I2C (12-bit core only)
DEFINE I2C_SCLOUT 1 'Set serial clock to bipolar instead of open-collector
DEFINE I2C_SLOW 1

DEFINE LCD_DREG PORTB 'LCD data port
DEFINE LCD_DBIT 4 'LCD data starting bit 0 or 4
DEFINE LCD_RSREG PORTB 'LCD register select port
DEFINE LCD_RSBIT 0 'LCD register select bit
DEFINE LCD_EREG PORTB 'LCD enable port
DEFINE LCD_EBIT 2 'LCD enable bit
DEFINE LCD_RWREG PORTB 'LCD read/write port
DEFINE LCD_RWBIT 1 'LCD read/write bit
DEFINE LCD_BITS 4 'LCD bus size 4 or 8
DEFINE LCD_LINES 2 'Number lines on LCD
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us

  'portc3 = reloj
  'portc4 = Dato
 
WR COn %10100000
dir var word
SCL VAR PORTC.3 
SDA VAR PORTC.4
dato var byte
cont VAR BYTE
 


TRISC = 0
TRISB = 0
TRISA = 0
ADCON1 = 6
dir = 0



Esperar:

If porta.0 = 1 then Grabar
IF PORTA.1 = 1 THEN LEER
LCDOUT $FE,1, "  UNIVERSIDAD "
LCDOUT $FE, $c0,"         MODELO"
PAUSE 2000
LCDOUT $FE,1, "    PROYECTO    "
LCDOUT $FE, $c0,"GRABADOR DE VOZ"
PAUSE 2000
goto esperar

Grabar:
  LCDOUT $FE,1,"  GRABANDO"
  LCDOUT $FE, $c0,"    EN MEMORIA"
  pause 1000
  LCDOUT $FE,1

   FOR DIR = 0 TO 3
 
PAUSEUS 5
i2cwrite sda, SCL, WR, DIR,["H"]
i2cwrite sda, SCL, WR, DIR,["O"]
i2cwrite sda, SCL, wr, DIR,["L"]
i2cwrite sda, SCL, wr, DIR,["A"]
 
NEXT DIR 

loop:

if porta.1 = 1 then leer
LCDOUT $FE,1,"LEER 24CL256"
LCDOUT $FE, $c0,"PRESIONE BOTON 2"
 PAUSE 500                                 


goto loop
 LEER:
   
  LCDOUT $FE,1," LEYENDO ESPERE"     
  LCDOUT $FE, $c0,"  UN MOMENTO"
  pause 1000
  LCDOUT $FE,1
 
    FOR DIR = 0 TO 3
 
i2CREAD sda ,SCL, WR, DIR,[dato]
LCDOUT,  dato
pause 1000

nEXT DIR


 end



No utilizo el "modedefs.bas" porque no utilizo el puerto RX y TX del pic 16f877A.. yo lo k kiero es mostra lo grabado en mi eeprom "24LC256" a un LCD
Este es mi codigo corregido en proteus anda de maravilla me graba la palabra "HOLA" y la muestra pero en mi circuito real me graba toda sino solo la letra H.
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: Chrisbaf en 27 de Noviembre de 2010, 22:40:44
revisa esta parte en anterior post

WR COn %10100000
RW COn %10100001
Título: Re: Lectura y escritura de eeprom 24lc256
Publicado por: kime90 en 30 de Noviembre de 2010, 14:32:01
Ya lo revise Chrisbaf.. (:
t digo q aora el codigo funciona (correctamente este ultimo q puse)
solo que en mi circuito real no funciona si no solo imprime en el LCD la letra H aunque en el
proteus si me aparece la palaba Hola. Ya he echo que me grabe numeros por medio de un contador
y ese si me andubo de maravilla en proteus como en mi circuito real.
Todo esto es solo para que aprenda el manejo del 24lc25,
que mi proyecto final es hacer un grabador de voz, Mi idea es en vez de almacenar letras i numeros
es dirigir estos datos en mi puerto A ya que el dato sera analogico sacarlo del PIC pasarlo por un DAC para convertir la señal digital
en analoga y se pueda reproducir la voz.
Si tuvieran por alla un codigo o idea del grabador de voz seria bien recibida.. SALUDOS.