TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: thegame en 02 de Noviembre de 2013, 14:49:57
-
Muy buen dia a todos
Quisiera saber si alguno a trabajado con un LCD de 2X16 via I2C con un expansor de puertos PCA9554, he leido todos los post existentes acerca de tema, aunque los que han trabajado con expansor de puertos I2C es con el PCF8574 (que es completamente compatible pin a pin con el que yo uso, pero no se si tenga alguna caracteristica que no le permita ser 100% compatible), e incluso existe una libreria que ya he probado y no me funciona.
Por lo cual me di a la tarea de leer el datasheet del controlador HD44780, e intentar realizar una pequeña libreria que me permitiera usar el lcd con el expansor de puertos PCA9554, pero no lo he logrado.
Entonces mi situacion es la siguiente:
-El expansor me trabaja correctamente, leo y escribo cualquier pin sin problema
-Uso un PIC pequeño (buscando aprobechar los expansores de puertos que tengo y aprender en el proceso) el 12F683
-Lenguaje C, con el compilador CCS v5.013
-El lcd lo tengo conectado tal como indica la libreria que esta en este fantastico foro, es decir, pines de datos del lcd (DB4,DB5,DB6,DB7) a los pines P4,P5,P6,P7 respectivamente del expansor, el bit R/W a
GND, RS a P1,y E a P0 (aunque tambien he probado RS a P0, R/W a P1, E a P2 y nada), quedan sin utilizar P2 y P3 del expansor
-Resistencias de 10K en el bus I2C
-Oscilador interno a 8Mhz en el PIC (aunque he probado con un cristal externo de 4Mhz y nada)
-Programando el PIC con el PICKIT 3
-Realice una simple rutina de inicializacion guiandome, con el datasheet del controlador del lcd, pero creo que algo no estoy haciendo nada bien porque a pesar de que he probado de mil y una formas
(cambiando tiempos, opciones de configuracion, conexiones fisicas distintas, y un largo etc etc) no he logrado siquiera inicializar y borrar la pantalla
Lo que quisiera lograr es:
-Que el bendito LCD inicialice y borre la pantalla, eso es todo lo que quisiera para empezar jaja
Coloco el codigo con el que he estado probando:
#include<12f683.h>
#fuses INTRC_IO,MCLR,NOWDT,PUT
#use delay(clock=8Mhz)
#use I2C(master,scl=PIN_A5,sda=PIN_A4,force_sw,slow)
#include"i2c.h"
void main(void)
{
delay_ms(20);
write_expansor(CFGEXPANSOR,0b00000000);
write_expansor(POLAEXPANSOR,0b00000000);
write_expansor(OUTEXPANSOR,0b00000000);
write_expansor(OUTEXPANSOR,0b00110100); //Funcion Set 8bits
delay_ms(4); //Esperamos (deberia ser 4.1ms)
delay_us(100);
write_expansor(OUTEXPANSOR,0b00110100); //Funcion Set 8bits
delay_us(100); //Esperamos 100us
write_expansor(OUTEXPANSOR,0b00110100); //Funcion Set 8bits
delay_ms(5);
write_expansor(OUTEXPANSOR,0b00100100);
write_expansor(OUTEXPANSOR,0b00100100);
write_expansor(OUTEXPANSOR,0b10000100);
write_expansor(OUTEXPANSOR,0b00000100);
write_expansor(OUTEXPANSOR,0b10000100);
write_expansor(OUTEXPANSOR,0b00000100);
write_expansor(OUTEXPANSOR,0b00010100);
write_expansor(OUTEXPANSOR,0b00000100);
write_expansor(OUTEXPANSOR,0b01100100);
while(true)
{
}
}
En la libreria i2c.h tengo mis rutinas para el manejo del Expansor que como ya mencione, funciona bien.
Ojala alguien me ayude un poco, por lo pronto seguire intentando, muchas gracias a todos.
-
Bueno, he estado todo el dia dandole, y solo he logrado que se active la segunda linea del lcd, es decir, cuando lo alimentamos normalmente solo se ve la primera linea del lcd con recuadros, bueno pues ahora si se me activan las dos, pero no apaga, ni limpia el lcd.... :x
Sospecho que es o un problema de tiempos o la forma en la que envio los datos, y es que no me queda muy claro lo siguiente:
(http://img203.imageshack.us/img203/4710/udlq.jpg) (http://imageshack.us/photo/my-images/203/udlq.jpg/)
Uploaded with ImageShack.us (http://imageshack.us)
los comandos encerrados en rojo, ¿Deben o no, llevar un delay entre cada uno?, es decir, los envio uno tras otro tal cual o debo darle un tiempo despues de cada par de comandos?????
Lo he intentado de varias formas y no logro terminar la inicializacion... :( :( :(
gracias
-
Hola
Un favor podria alguien decirme cual es el resultado visual en el LCD la intruccion lcd_init() (por ejemplo con la libreria flex_lcd).
Es decir, si solo lo inicializan, que les aparece en el display o en que estado queda????
muchas gracias.
-
no aparece nada... comprobado
-
:? :? eso me temia, entonces no estoy terminando la inicializacion correctamente, ok gracias, sigo intentando.
-
Aun sin resultados :? , alguna idea???
saludos
-
Ok pues he seguido intentando y no he encontrado la solucion aun a mi problema, comienzo a pensar que estos dos expansores (PCA9554 y PCF8574) solo son compatibles en pinout pero no del todo en funcionamiento.
Ojala alguien me de una idea :(
Saludos
-
hasta ahora he probado poniendo el lcd a 4 y 8 bits y nada, esto es lo que pongo para inicializar a 8 bits
//Primera instruccion
write_pca9554(OUTEXPANSOR,0x30);
on_off();
delay_ms(5);
//Segunda instruccion
write_pca9554(OUTEXPANSOR,0x30);
on_off();
delay_us(120);
//Tercera instruccion
write_pca9554(OUTEXPANSOR,0x30);
on_off();
delay_ms(45);
//Cuarta instruccion
write_pca9554(OUTEXPANSOR,0x38);
on_off();
delay_us(50);
//Quinta instruccion
write_pca9554(OUTEXPANSOR,0x08);
on_off();
delay_us(50);
//Sexta instruccion
write_pca9554(OUTEXPANSOR,0x01);
on_off();
delay_ms(50);
//Ultima instruccion
write_pca9554(OUTEXPANSOR,0x06);
on_off();
delay_us(50);
Resultado: la pantalla se pone gris, es decir se ponen todos los recuadros de las dos filas pero no se borra la pantalla.
Nadie puede sugerirme algo???
gracias.
-
Como no amigo no faltaba mas :D
Aqui (http://www.iesluisdelucena.es/dpp/docs/presentaciones/LCD_I2C.pdf) tienes lo que buscas ;-)
O al menos es una gran ayuda :D
Saludos
-
jajaja gracias RALF2 de echo ya lo habia leido, el detalle es que el expansor que estoy tratando de usar es el que me da problema.
tengo dos teorias
1ra: el expansor al momento de energizarse envia todo el puerto a 0xFF hasta que le doy la instruccion de configurar es que cambia el estado, no se si el lcd malinterprete ese estado inicial del lcd y sea por eso que se inicializa mal.
2da: estoy emulando el protocolo i2c, y no se eso le cause algun problema, lo raro es que ya he colocado una memoria 24C02, un rtc DS1307 y un sensor de temperatura TC74 emulando el protocolo y todo funciona ok, e incluso el expansor me responde a escritura y lectura, pero nada de poder inicializar el lcd.
He pedido los PCF8574 y probare, asi como pondre tambien un PIC con el modulo I2C por HW, haber si hay cambio (aunque lo dudo).
Sigo creyendo que el PCF8574 y el PCA9554 no son 100% compatibles
No me dare por vencido seguire intentando
saludos.
-
Fíjate que el puerto del LCD es bidireccional. Escribe y lee... me ha pasado alguna vez tener el puerto de la pantalla declarado como fast_io y no funcionar
-
hola ppyote, sabes el detalle esta en que yo uso un expansor de puertos, el PCA9554, no el puerto en si del PIC, y puedo escribir y leer en el expansor sin problema, pero no logro inicializar el lcd, estan a punto de llegarme los PCF8574 (el expansor de puertos para el que si hay librerias) probare y comento si se pudo o no y asi salimos de dudas si es o no totalmente compatible el PCA9554 con el PCF8574.
de echo hice una consulta en texas instruments preguntando por la compatibilidad de ambos expansores, pero no he tenido respuesta :?
por el momento estoy a la espera para probar con el otro expansor y ya comentare que paso.
gracias.
P.D. vi tu trabajo con la pantalla TFT, muy bueno ((:-))
-
lo que yo digo, es que el lcd también tiene que leerse en algunos momentos, revisa la librería de flex_lcd y veras a lo que me refiero
el expansor tiene que cambiar su direccionamiento en algunos momentos para habilitar la lectura de los datos que recibes desde el mismo lcd
te voy a poner unas lineas y veras...
este trozo de codigo esta sacado de la libreria de flex_lcd, decir que trabaja a 4 bits, algo diferente a lo que tu estas haciendo
#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3
retval = 0;
output_high(LCD_E);
delay_cycles(1);
retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);
output_low(LCD_E);
return(retval);
}
#endif
por cierto, me alegro que te gustara mi trabajo con la tft...a ver si me animo un dia y cuelgo todo el proyecto....
-
A claro, también lo intente sin resultados,pero también en el datasheet del controlador HD44780 menciona que si no se lee el bit de BF (busy flag) se debe esperar un poco mas a que la instrucción termine, e leído en varias partes que se debe esperar mas o menos un 10% mas de lo que dura la instrucción y que no debe haber problema.
seguiré intentando y comparare cuando me llegue el otro chip, agradezco mucho la ayuda, y ojala te animes a publicar tu proyecto que la verdad esta muy interesante y muy bien echo, felicidades por ello.
saludos desde Morelia
-
hoy he pedido unos cuántos expansores como los que tú tienes, cuando lleguen, intentaré utilizarlos para control de un lcd ya que tengo una cosa entre manos :mrgreen:
-
Hola ppyote, muy bien seguro que tu si lo logras, por mi parte a mi hoy me llegaron los PCF8574, lo armare con el lcd y comento que sucede.
aun no me doy por vencido es solo que necesito saber si se puede o no, si el problema esta en el expansor o que es lo que pasa.
Saludos y seguimos en contacto
P.D. ppyote si lo logras con el PCA9554, podrias porfavor darme algun tip
-
Pues bien, estos son mis resultados:
PCF8574N, operando OK, sin problemas
Se visualizan los mensajes correctamente en el LCD.
Hice pruebas comparativas con el PCA9554, e incluso llegue a pensar que tenia correcta la funcion de lcd_init() que programe, pero no logre escribir nada con el PCA9554.
La gran diferencia para mi y desde mi punto de vista es que, en el PCA9554, tienes que configurar si el pin sera entrada o salida, y para ello debes escribir el registro de configuración, en cambio el PCF8574, NO TIENE ESO, al menos no lo vi en su hoja de datos, simplemente lo hace solo, sin necesidad de configurar, y talves solo talves, por eso pudiera llegar al lcd un nivel lógico a sus pines que malinterpreta y hace errónea la inicializacion.
Solo es una suposición.
Como comentario aparte, use el PCA9554 con displays de 7 segmentos, para visualizar la variable que necesitaba, esto lo hice ya que aun no tenia los PCF8574, y ahora que los tengo y que observo su correcto funcionamiento, puedo usar el LCD, aunque confieso que estoy un poco decepcionado.
Por ultimo, decir que, en la hoja de datos del PCA9554, no lo recomiendan para nuevos diseños, sera que aun no es estable??? o aun no es lo suficientemente optimo para su uso???.
Ojala amigo ppyote tengas mas suerte que yo, y si lo logras no te olvides de mi jaja, que me quedo con la espinita de no lograrlo echar a andar, aun así los usare para otras aplicaciones.
Muchos saludos y agradezco la ayuda prestada.
P.D. sigo pendiente por si surgen dudas y pudiera ayudar en algo con las pruebas que realice.
-
Hola, me pregunto, tuviste suerte con el LCD y el PCA9554 amigo ppyote????? :mrgreen:
-
estoy esperando la entrega aún
-
a ok entiendo, creo que a mi me llegan mas rapido por la distancia un poco mas corta, bueno ya me contaras como te fue
saludos