Autor Tema: LCD en BUS I2C  (Leído 2712 veces)

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

Desconectado Picavid

  • PIC12
  • **
  • Mensajes: 89
    • www.seguridomo.es
LCD en BUS I2C
« en: 19 de Febrero de 2006, 22:36:00 »
Hola a todos,

 Alguien sabe como controlar un modulo LCD (funcionando a 4 bits) en un BUS con un PCF8574? Estoy haciendo el programa con un PIC16F84a y no hay manera. Lo unico que llega a hacer es quedarse medio sombreada la primera linea. He probado el protocolo de inicializacion de todas formas y no va.
 
Tengo una duda que no encuentro en ningun lado, cuando mandas un comando, que hay que hacer con el pin Enable? He probado de darle un impulso despues de mandar cada 4 y/o cada 8 bits, pero nada. Me falta informacion!.
 
Tampoco se si hay que poner todos los bits a 0 entre comando y comando, entre cada grupo de 4 bits, ..................... Estoy perdido!.Sonrisa

  Gracias de antemano.

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: LCD en BUS I2C
« Respuesta #1 en: 20 de Febrero de 2006, 07:32:00 »
Hola si la primera linea se queda sombreada es que es un fallo de inicialización del lcd... no se como la harás porque por lo que dices creo que usas ensamblador. en c es muy facil.

Por otra parte yo estoy curiosamente desarrollando un lcd mediante el bus i2c (sin comandos solo texto por el momento) pero me he encontrado con el siguiente problema...

tanto el pic16f84 como el 16f628 carecen de modulo ssp y aunque se pueda implementar por software el i2c al menos en ccs cuando intentas leer algo del bus i2c y no hay nada se queda ahí esperando eternamente...

alguien podria decirme cómo saber si un pic tiene modulo ssp?¿?¿

1 saludo

Desconectado Tec_Claudio_Perez

  • PIC12
  • **
  • Mensajes: 62
RE: LCD en BUS I2C
« Respuesta #2 en: 20 de Febrero de 2006, 09:58:00 »
Hola a todos,
Si querés saber que Pic tiene SSP o si soporta I2C maestro o esclavo, o bien si quieres saber la resolución del AD o si tiene puerto serial o la cantidad de E/S, lo mejor es bajarte un documento en pdf de la pagina web de Microchip llamado "Product Line Card" (Tabla de linea de productos). Este documento está aquí:

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1924

Pesa unos 4.5Mb y contiene las principales características de todos los microcontroladores pic, Dspic, memorias seriales y demás productos de Microchip.

Lógicamente este documento se va actualizando a medida que salen nuevos productos.

Espero te sirva.

Téc. Claudio J. Pérez
Ciberar-Sistemas & Desarrollos
Jujuy-Argentina



Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: LCD en BUS I2C
« Respuesta #3 en: 20 de Febrero de 2006, 10:02:00 »
picavid, para controlar el LCD a través de este expansor de puertos por I2C, yo primero probaría las rutinas con el lcd solo y luego le añadiria el pcf.

Ten en cuenta que si alguna funcion para el lcd no funciona, te vas a volver loco.

Primero prueba que el lcd funciona y que los comandos son correctos. Luego, comprueba que el LCF funciona y por último unelos

Desconectado Picavid

  • PIC12
  • **
  • Mensajes: 89
    • www.seguridomo.es
RE: LCD en BUS I2C
« Respuesta #4 en: 20 de Febrero de 2006, 23:52:00 »
Gracias por el interes, pero todavia estoy igual. En cuanto a lo que comentas elmasvital, no se que es el ssp?. Hace poco tiempo que estoy en este mundo y todavia uso el MPLAB (pero ya doy mis pasitos en VB ehh!). Efectivamente el problema esta en la inicializacion del LCD, Pero volviendo a mi primer mensaje de ayuda, como??. Los demas dispositivos funcionan bien a traves del BUS, no es complicado.

  Encuanto a la sugerencia de antoniof, es lo mejor que se puede hacer cuando uno esta "colapsado", pero, he parado, he probado el LCD en otra placa conectado directo al PIC en 4 bits, he probado el PCF, he vuelto a hacer el programa desde 0, y todo OK!!!!.

  Con el LCD conectado al PIC, no hay ningun problema. Todo bien, Pero a traves del BUS, todo cambia. He probado cada comando, 1 por 1 y he medido la posición en el PCF, todo bien. Mis dudas son:

-La velocidad del protocolo i2c es aceptada por el modulo LCD?
-Entre byte y byte de comando de inicializacion hay que ponerlo todo a 0
-Al trabajar en 4 bits, se manda a saco 4+4 bits? Lo entenderá bien? p.e.0000 +0001?
-El impulso en el pin E del LCD se manda con los últimos bits del comando activos, luego, se pueden poner todos los bits a 0 a la vez, o primero el E y despues el grupo de 4 bits, o en vez de a 0, de golpe la siguiente instruccion????

  Un saludo a todos los del foro.

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: LCD en BUS I2C
« Respuesta #5 en: 21 de Febrero de 2006, 02:17:00 »
Picavid, has probado el LCD en modo 4 bits directamente conectado a un puerto del PIC?. Las preguntas que haces creo que son debidas a que no has probado este modo de funcionamiento.
Cuando el LCD esta en modo 4 bits, se envian primero 4 bits se da un pulso en la entrada Enable, se ponen los siguientes 4 bits y se da otro pulso de Enable. Cuando se da el pulso de enable los datos deben ser estables. Lo de poner ceros en el bus no es necesario, ya que cuando la señal E esta a cero, lo que haya en el bus es indiferente para el LCD.

Tal vez si pones el código de inicializacion del LCD con sus subrrutinas de tratamiento del I2C te pueda ayudar mejor.

Desconectado Picavid

  • PIC12
  • **
  • Mensajes: 89
    • www.seguridomo.es
RE: LCD en BUS I2C
« Respuesta #6 en: 21 de Febrero de 2006, 10:24:00 »
  Gracias antoniof,

  Probaré lo del pin Enable de esta forma. Lo de probarlo directamente lo he hecho tambien en 4 bits. Ya te diré, pero creo que el problema anda por ahí.

  Ya diré algo. Muchas gracias.Rebotado

Desconectado Picavid

  • PIC12
  • **
  • Mensajes: 89
    • www.seguridomo.es
RE: LCD en BUS I2C
« Respuesta #7 en: 24 de Febrero de 2006, 05:37:00 »
Hola a todos.

POR FIN!!!!!!!!Rebotado

  Bien, el tema estaba en lo cabezudo que soy. Estaba colapsado y cerrado. Como que no funcionaba por lo del pin E, llegué a invertir los bits a enviar, y seguí colapsandome más aún. Luego tambien tuve algunas dificultades al dar pulsos al pin E, y al activar el pin RS para el modo carácter, pero al final, lo he conseguido simplificar y aclarar bastante.

  Por si alguien algun dia se colapsa como yo, os dejo la libreria original modificada para funcionar a 4 bits.
  Lloricammmm... Bueno, veo que no puede. Os pongo las modificaciones. Si alguien la necesita entera que me lo pida por email en: dgoma108@yahoo.es
LCD_EscribeLCD   ;Aquí escribe en modo COMANDO, por pin RS=0   
   movwf   LCD_Dato
   movlw   b"11110000"      ; Se queda con el nibble alto del dato a enviar
   andwf   LCD_Dato,f
   call   I2C_EnviaStart
   movlw   b"01001000"      ;************DIRECCION BUS DEL LCD***************
   call   I2C_EnviaByte
   movf   LCD_Dato,W
   call   I2C_EnviaByte
   call   I2C_EnviaStop
   call   ActivaE      ;Da el pulso al pin E para indicar que capture dato
   call   DesactivaE
   return

LCD_EscribeLCDCaracter   ;Aquí escribe en modo texto por que activaremos el pin RS
   movwf   LCD_Dato
   movlw   b"11110000"      
   andwf   LCD_Dato,f
   call   ActivaRS
   call   ActivaE
   call   DesactivaE
   return
ActivaE
   call   I2C_EnviaStart
   movlw   b"01001000"      ;************DIRECCION BUS DE MI LCD***************
   call   I2C_EnviaByte
   bsf   LCD_Dato,2      ;Pin donde govierno en pin E en mi PCB*********
   movf   LCD_Dato,W
   call   I2C_EnviaByte
   call   I2C_EnviaStop
   return
DesactivaE
   call   I2C_EnviaStart
   movlw   b"01001000"   
   call   I2C_EnviaByte
   bcf   LCD_Dato,2
   movf   LCD_Dato,W
   call   I2C_EnviaByte
   call   I2C_EnviaStop
   return
ActivaRS
   call   I2C_EnviaStart
   movlw   b"01001000"   
   call   I2C_EnviaByte
   bsf   LCD_Dato,3      ;Pin donde govierno en pin RS en mi PCB*********
   movf   LCD_Dato,W
   call   I2C_EnviaByte
   call   I2C_EnviaStop
   return
y,

LCD_EnviaComando
   movwf   LCD_GuardaDato   ; Guarda el dato a enviar.
   call   LCD_EscribeLCD   ; Primero envía el nibble alto.
   swapf   LCD_GuardaDato,W   ; Ahora envía el nibble bajo. Para ello pasa el
            ; nibble bajo del dato a enviar a parte alta del byte.
   call   LCD_EscribeLCD   ; Se envía al visualizador LCD.
            ; Debe garantizar una correcta escritura manteniendo
   call   Retardo_2ms      ; 2 ms en modo comando y 50 µs en modo cáracter.
;   call   Retardo_50micros
   return
LCD_Caracter
;   bsf   LCD_PinRS      ; Activa el "Modo Dato", poniendo RS=1.
   call   LCD_CodigoCGROM   ; Obtiene el código para correcta visualización.
   movwf   LCD_GuardaDato   ; Guarda el dato a enviar.
   call   LCD_EscribeLCDCaracter   ; Primero envía el nibble alto.
   swapf   LCD_GuardaDato,W   ; Ahora envía el nibble bajo. Para ello pasa el
            ; nibble bajo del dato a enviar a parte alta del byte.
   call   LCD_EscribeLCDCaracter   ; Se envía al visualizador LCD.
;   btfss   LCD_PinRS      ; Debe garantizar una correcta escritura manteniendo
;   call   Retardo_2ms      ; 2 ms en modo comando y 50 µs en modo cáracter.
   call   Retardo_50micros
   return   


  Os agradezco el interes y colaboración:

  Saludos desde Sabadell, Barcelona.Fumador


 

anything