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.