Autor Tema: proteus 7 - i2c debuger - 24c256 - LCD 20x2 - pic simulator ide  (Leído 11667 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
proteus 7 - i2c debuger - 24c256 - LCD 20x2 - pic simulator ide
« en: 11 de Junio de 2008, 15:50:43 »
hola amigos,

tengo un programa con el pic 16f877A a 4mz, que graba datos en una memoria 24c256, un lcd que nos muestra , la direcion donde donde graba los datos y el dato a grabar, mediante el bus i2c, lo simulo en pic simulator ide y funciona un poco lento, creo que por lo tiempos, pero funciona.

Cuando lo meto el *.hex en proteus, el i2c debug se ve como graba los datos pero no muestra nada por el lcd.


pic simulator ide: (me gustaria poder añadirle el mumero de linea pero no se como se hace,)


'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de nrol RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de nrol E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTx  'el bit de nrol RW sera del puerto x(no se usa)
'Define LCD_RWBIT = x  'se usara el Rxn como RW (no se usa)
Define LCD_COMMANDUS = 100  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 30  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'===========================================================

'---------------------- variables ------------------------------
Dim addr As Word  'variable for storing EEPROM byte address
Dim data As Byte  'variable for storing EEPROM byte data
'--------------------- port I2C --------------------------------
Symbol sda = PORTC.4
Symbol scl = PORTC.3
'--------------------main --------------------------------------
Lcdinit 1' inicia cursor parpadeando
For addr = 0 To 100  'the first 32 bytes will be written
   data = 255 - addr  'set the data byte to be written
   I2CWrite sda, scl, 0xa0, addr, data  'perform I2C write operation to serial EEPROM
Gosub lcd_
Next addr
WaitMs 1  'small delay interval
End                                               
'--------------------subrutina lcd-------
lcd_:
Lcdcmdout LcdHome 'cursor primera lienea
Lcdout "direcion", ":", " ", #addr
Lcdcmdout LcdLine2Home 'cursor segunda linea
Lcdout "dato", ":", " ", #data
Return                                           

----------------------

en proteus: miren foto pantalla que adjunto.


que puede ocurrir, alguien se anima y me echa una manita.

un saludo

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: proteus 7 - i2c debuger - 24c256 - LCD 20x2 - pic simulator ide
« Respuesta #1 en: 12 de Junio de 2008, 06:27:30 »
hola

en proteus, realiza las conexiones al lcd a partir de D4 (RA0..D4 - RA3..D7) y conexiona D0..D3 junto con RW a GND

además tendrás que cambiar los tiempos de refresco del lcd, que están muy bajos y espero que con esto se solucione.

un saludo

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: proteus 7 - i2c debuger - 24c256 - LCD 20x2 - pic simulator ide
« Respuesta #2 en: 12 de Junio de 2008, 13:31:49 »
hola

en proteus cambie las salidas del pic, las entradas del LCD D0, D1, D2, D3 junto con RW las puse a tierra.

salida pic      LCD antes       LCD ahora
 RA0               D0                   D4
 RA1               D1                   D5
 RA2               D2                   D6
 RA3               D3                   D7

y funciono. se ve el LCD pero ha medias

en la primera linea deberia mostrar    direccion:(espacio)(valor de la variable direccion)
en la segunda linea deberia mostrar    dato:(espacio)(valor de la variable dato)

pero lo que muestra en linea 1 es  ireccion:(espacio)(direccion)  --> falta la "d" y se ve ha saltos los numeros, no correlativos
en la segunda linea no muestra nada.

mire las propiedades del lcd "clock frecuenci =250khz",
edite las propiedades y pone:

{MODDLL=LCDALPHA}
{PRIMITIVE=DIGITAL,LCD}
{NUMCOLS=20}
{NUMROWS=2}
{CLOCK=250kHz}
{ROW1=80-93}
{ROW2=C0-D3}
{PACKAGE=CONN-DIL14}
{TRACE=1}

como se cambia el refresco del lcd,

sera eso.?




por cierto tengo una duda en la programacion:

'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de nrol RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de nrol E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTx  'el bit de nrol RW sera del puerto x(no se usa)
'Define LCD_RWBIT = x  'se usara el Rxn como RW (no se usa)
...
..
.

segun programacion el bus es de 4 bit, el bus de datos es el PORTA del pic, el bus empieza en el menos significatico es decir el bit 0 si pusiera "4" empezaria en el bit 4 significa eso, verdad pero nosotros selecionamos la parte alta del lcd, lo del 0 o 4 se refiere al pic o al lcd.

puedes aclarar me esto.

gracias por tu ayuda...




« Última modificación: 12 de Junio de 2008, 13:53:49 por pajaro »

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: proteus 7 - i2c debuger - 24c256 - LCD 20x2 - pic simulator ide
« Respuesta #3 en: 12 de Junio de 2008, 16:43:58 »
hola

no he podido dar con el tema todavía y me tiene un tanto desorientado porque he probado con un par de cosas sencillas y la respuesta de proteus fue la misma. mas, o sorpresa, que haciéndolo en pbp si funciona sin problemas la configuración de 4bits. probé ocupando los 8bits del lcd y usando otro puerto del pic y entonces si funciona. creo que el problema se debe a una mala interrelación entre psi y proteus porque como has podido ver en el simulador del psi si funciona y estoy convencido que en la práctica también. si mañana tengo un momento lo pruebo y te digo algo.

por lo demás, si quieres buena y abundante información, en este mismo Foro: http://www.todopic.com.ar/foros/index.php?topic=14917.msg92082#msg92082 la hay (aunque doy por supuesto que ya conoces el enlace).

en la simulación con psi se le puede indicar que bus de datos usar para el lcd; 4 low, 4 high y 8bits. yo en proteus siempre conecté los 4 de mayor peso (D4..D7) y no recuerdo tener problemas, es tu caso la primera vez que trato de simular en proteus algo escrito en psi... y empezamos bien jaja

un saludo

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: proteus 7 - i2c debuger - 24c256 - LCD 20x2 - pic simulator ide
« Respuesta #4 en: 13 de Junio de 2008, 12:55:39 »
hola de nuevo.

veamos, la 'basura' en el lcd era tal como sospechaba de los tiempos de refresco del lcd, en pic basic los establecemos en estas tres líneas:

Define LCD_COMMANDUS = 100  'Tiempo de espera después de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 30  'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg.

estos tiempos han de ser bajos si no queremos que el simulador del pic simulator ide se quede dormido en el intento, pero estos valores son excesivamente bajos para proteus que si te fijas comienza a dar una multitud de advertencias indicando que el lcd ha recibido datos (y/o comandos) mientras estaba ocupado, de ahí la 'basura'.

los tiempos que vienen establecidos por defecto son:
Define LCD_COMMANDUS = 5000  'Tiempo de espera después de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 100  'Tiempo de espera después de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 100  'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg.
y con esto ya conseguimos que funcione en la práctica (lo he probado)... aunque por un motivo que se me escapa sigue sin mostrar la segunda línea en proteus.

esta es la imagen del circuito que he probado y que cambia con respecto al tuyo porque aproveché algo que ya tengo hecho:


y una última cosa al menos de momento es que si -no usando como no usas- RW, lo pongas a gnd de lo contrario proteus no muestra el primer carácter...

un saludo

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: proteus 7 - i2c debuger - 24c256 - LCD 20x2 - pic simulator ide
« Respuesta #5 en: 13 de Junio de 2008, 13:46:13 »
muchas gracias Xocas06 por tu gran aporte, me lo voy hacer asi,  :mrgreen:
Saludo  :P

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: proteus 7 - i2c debuger - 24c256 - LCD 20x2 - pic simulator ide
« Respuesta #6 en: 13 de Junio de 2008, 14:30:19 »
hola Rafael

la verdad no tengo la menor idea del porque pasa lo que pasa jaja. una vez que el ejemplo funcionaba en pic simulator ide pero no en proteus me hizo sospechar de algún defecto en la librería de pic pero hice un pequeño ejemplo en pic basic pro y funcionó sin problemas. usando el conexionado que acostumbro usar para 4bits la cosa empezó a dar señales de vida aunque con bastante basura por lo cual aumenté los tiempos en el programa. además proteus daba bastantes advertencias de que se le estaban mandando datos y comando al lcd mientras estaba ocupado.

finalmente funciona con un ejemplo básico de dos líneas de texto pero... la segunda tampoco la muestra  :?

jartito del proteus me decido a ponerlo en práctica con un pequeño entrenador que tengo por aquí y ajustando un poco los tiempos funcionó sin problemas.

si alguien de los que de verdad saben de proteus nos dan una guía mejor que mejor sinó trataré de volver al tema en cualquier momento porque no salgo (o si) de mi asombro

saludos

pd: ya mismo estoy repasándome todo el tema del amigo dogflu66

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: proteus 7 - i2c debuger - 24c256 - LCD 20x2 - pic simulator ide
« Respuesta #7 en: 13 de Junio de 2008, 15:40:11 »
 :D :D y yo volviendome loco con CCS y no me sale tan claro  :D :D
pero aprendi muchos de tu ejemplo Gracias maestro  :P
Saludo

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: proteus 7 - i2c debuger - 24c256 - LCD 20x2 - pic simulator ide
« Respuesta #8 en: 16 de Junio de 2008, 17:14:56 »
hola,
Xocas06, pense en lo que me dijiste de lo del refresco del lcd, asi que en propiedades del lcd las edite, en donde pone 250khz le añadi al ultimo cero de detras 8 ceros mas, ya se que es una salvajada, pero parece que ahora se ve la letra "d" de dirección y se ve pasar de uno en  uno, asi  seguro que tiene que ver con los parametros de simulacion, de la pestaña de system.
despues de eso le aumente hasta 12 ceros y se quejo del Gmin.

tengo que mirar, los tutoriales de German tojeiro, creo que habia un video tutorial, que decia como configurar esa opcion.

la memoria tarda en escribirse 5ms creo segun el libro del pic16f84A.

voy ha seguir investigando.

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: proteus 7 - i2c debuger - 24c256 - LCD 20x2 - pic simulator ide
« Respuesta #9 en: 17 de Junio de 2008, 11:11:21 »
hola

'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTB  'el bus de datos sera el puerto B
Define LCD_DBIT = 0  'se usan los 4 bit menos significativos del puerto B

Define LCD_RSREG = PORTB  'RS estará en el puerto B
Define LCD_RSBIT = 4  'se usará RB4 para RS
Define LCD_EREG = PORTB  'E estará en el puerto B
Define LCD_EBIT = 5  'se usará el RB5 para E
Define LCD_RWREG = PORTB  'RW estará en el puerto B
Define LCD_RWBIT = 6  'se usará el RB6 para RW

Define LCD_COMMANDUS = 5000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 100  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 100  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.

'E (enable) habilita el lcd
'RS (register select) indica si es un comando o un carácter
'R/W (read/write) indica si es una lectura o escritura.
'la conexión R/W del LCD puede ir directamente a gnd, evitándonos su conexión al pic
'sin embargo su uso permite un mayor control sobre el lcd ya que podemos interrogarle acerca de su estado
'y saber cuando está listo para recibir un nuevo comando
'si R/W está conectado al pic y en PSI usamos la directiva Define LCD_READY_BUSY_FLAG = 1 los tiempos de espera
'serán ignorados por el compilador, ajustándose estos al estado de la 'bandera' (busy flag) del lcd

Define LCD_BITS = 4 / 8 'el bus de datos del lcd sera de 4 u 8 bits
'si es de 4 bits los datos se enviarán en el formato de primero nibble alto y después nibble bajo

Define LCD_DBIT = 0  'se usan los 4 bit menos significativos del puerto (RB0..RB3)
Define LCD_DBIT = 4  'se usan los 4 bit menos significativos del puerto (RB4..RB7)
'si el bus es de 8 bits este valor no se tiene en cuenta.

*************************

Para que los datos se muestren correctamente en proteus ( irección: -> dirección:) no es necesario cambiar las propiedades del lcd, es suficiente con poner R/W a gnd o conectarlo al pic.

El motivo por el cual no muestra la segunda línea en el modo de 4 bits (que si lo hace en una configuración de 8 bits) no lo se, pero tal como te decía anteriormente en la práctica funciona perfectamente a 4 bits.

En la web del amigo aitopes (www.uControl.com.ar) tienes ya tres números de su revista, y en dos de ellas sendos artículos sobre el lcd, cuya lectura te recomiendo

un saludo

pd: no tomes proteus como un referente final porque te llevarás bastantes sorpresas.


EDITO: no es Define LCD_READY_BUSY_FLAG = 1 ... sino LCD_READ_BUSY_FLAG = 1
« Última modificación: 19 de Junio de 2008, 06:13:44 por xocas06 »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: proteus 7 - i2c debuger - 24c256 - LCD 20x2 - pic simulator ide
« Respuesta #10 en: 14 de Julio de 2008, 14:38:12 »
hola Xocas06

El problema del LCD de Proteus persiste pero tengo avances, componentes en Proteus 7 sp6, PIC16F84A, 2 condensadores de 22p cerámicos, un cristal 1Mhz, LCD lm 2x20 alfanumérico.

barra menú proteus\sysmtem\set animation opcion:
frames por seg:1
timestep for frame:1
single step time:1
max. spice timestep:25m

Consigues ver el time en cada segundo creo, pero en el lcd no sale nada y de CPU entre 4 y 6% en uso dentro del isis.

el pic propiedades:
{PACKAGE=DIL18}
{PRIMITIVE=DIGITAL,1684}
{MODDLL=PIC16}
{MODDATA=64,255}
{ITFMOD=PIC}
{PROGRAM=text_LCD.hex}
{CLOCK=1MHz}
{CFGWORD=0x3FFB}
{DBG_RANDOM_PMEM=0}
{DBG_RANDOM_DMEM=0}
{DBG_STARTUP_DELAY=0}
{DBG_WAKEUP_DELAY=0}
{WDT_PERIOD=18m}
{EPR_WRITEDATA_DELAY=10m}
{PORTTDLH=0}
{PORTTDHL=0}
{TRACE_DEFAULT=1}

en pic simulator ide:
 este programa:

'------------------------------------------ASIGNACIONES------------------------------------------
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
AllDigital
'ADCON1 = 0x07  'Los pin PORTA como I/O
'ansel = %00000000  'los pin I/O digitales
'CMCON = 0x07  'comparador a off
'osccon = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
'TRISA = 0x00  'Puerto A como salidas
'TRISB = 0x00  'puerto B como salidas
'TRISC = 0x00
'TRISD = 0x00
'TRISE = 0x00
'TRISA.4 = 1  'como entrada (RA4, adc)
'TRISB.1 = 1  'como entrada (RA6, tecla S1)
'TRISB.2 = 1  'como entrada (RA5, tecla S2)
'PORTB.3 = 1  'luz lcd a on (RB3)
'PORTC.7 = 1  'led amarillo a off
'PORTB.0 = 1  'led verde a off
'**************************************Inicio Programa*********************************************
Lcdinit 1  'inicializa el lcd sin cursor
WaitMs 10  'espera 1Seg
'Lcdcmdout LcdHome

Lcdout "16f88LCD_RTC/I2C"  'escribe en el lcd
WaitMs 10
Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
WaitMs 10
Lcdout "Pruebas con I2C"  'escribe en el lcd
WaitMs 3000  'espera 3Seg
'Lcdcmdout LcdClear

configuración:
eeprom  write time: 4000us
A/D conversión time : 25 us
UART trasmit/receiver: 1000us
new value for for ultimate rate :10ms

los retardos del LCD
100
50
50
clock  pic 4Mhz
pic 16f84A

puerto datos port b
4 bit altos
rs port b,1
e port b.2
R/W no uso

en el PSI me va bien lo pongo en ultimate y lo hace enseguida.
pero en proteus si le pones lo de simular con puntos azules y rojos ves los estados de las lineas del bus que van hacia el lcd como cambian pero no ves nada por el display.


xocas06, bueno haber si alguien nos ayuda con esto.

un saludete



Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: proteus 7 - i2c debuger - 24c256 - LCD 20x2 - pic simulator ide
« Respuesta #11 en: 14 de Julio de 2008, 15:01:30 »
hola

buena parte de la respuesta te la he dejado aquí: http://www.todopic.com.ar/foros/index.php?topic=22236.msg175596#msg175596 donde encontrarás incluso un archivo .rar para su descarga y comprobación.

te vuelvo a decir que 'desmenuces' tu programa en partes más pequeñas y vayan solventando éstas antes de seguir con otras, es solo mi opinión

aquí tienes por lo que veo un 16f84a en proteus pero compilas... no se, hay tantos comentarios innecesarios que me pierdo...
en proteus tienes que poner un cristal oscilando a la frecuencia de trabajo adecuada, al igual que el pic que veo que lo tienes a 1Mhz y eso no es correcto.

hay otra opción que no he probado en proteus, y es que dispone de un lcd serial y se le podrían enviar los datos a un único pin... en fin, mira el ejemplo que te hice y ya dirás alguna cosa.

un saludo


 

anything