TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado 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:
-
Hola:
Tienes puestas las resistencias de pull-up en SDA y SCL?
-
hola:
si esta aclarado arriba en el post. (4,7k)
Gracias.
-
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.
-
Gracias por tu atencion :) :) :)
-
Hola:
Para la noche lo reviso cuando salga del trabajo. (Hora Ecuador GMT -5)
-
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.
-
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
-
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?
-
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
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
-
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
-
Parece que olvidaron que para el 24LC256, la direccion debe ser de 16 bits.
Hola:
Pequeño detalle que se me escapó :mrgreen:
-
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
-
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
-
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
-
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???
-
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
-
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
-
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
-
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.
-
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.
-
revisa esta parte en anterior post
WR COn %10100000
RW COn %10100001
-
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.