A ver si hay alguien que haya funcionado con este dispositivo, ya que me vuelvo loco y no consigo conmutar las salidas.
Estoy usando un 877A vía I2C para escribir en los puertos de un PCF8575 (expansor de 16 puertos).
Estas son las definiciones de los pin y defines:
"*****************************
"* DEFINE *
"*****************************
"Define LOADER_USED 1 "Se usa bootloader
DEFINE OSC 20 " Ajuste de la frecuencia del oscilador en 20MHz
DEFINE SER2_BITS 8 "Ajusto la transmision a 8 bits sin paridad
DEFINE NO_CLRWDT 1 "desactivo CLRWD automatico
define CHAR_PACING 1000 "Tiempo entre caracteres de la puerta serie 1ms
DEFINE I2C_SLOW 1 "Reloj SCL a 100KHz con oscilador a 20MHz
"Ajustes del display LCD
DEFINE LCD_DREG PORTD " Ajusto el puerto para datos D
"DEFINE LCD_DBIT 4 " Ajusta el bit de inicio (0 o 4) si el bus es de 4 bits
DEFINE LCD_RSREG PORTA " Ajusta el puerto para el RS del LCD
DEFINE LCD_RSBIT 2 " Ajusto el bit de RS dentro del puerto elegido
DEFINE LCD_EREG PORTA " Ajusto el puerto para Enable
DEFINE LCD_EBIT 0 " Ajusto el bit Enable dentro del puerto elegido
DEFINE LCD_RWREG PORTA " LCD read/write pin port
DEFINE LCD_RWBIT 1 " LCD read/write pin bit
"DEFINE LCD_RWREG PORTA " Ajusto el puerto del pin R/W del LCD
"DEFINE LCD_RWBIT 1 " Ajusto el pin del puerto para usar R/W del LCD
DEFINE LCD_BITS 8 " Ajusto el tamaño del bus (4 o 8 bits)
DEFINE LCD_LINES 2 " Ajusto el numero de lineas del LCD
DEFINE LCD_COMMANDUS 2000 " Ajusto el retardo de los comandos en microsegundos
DEFINE LCD_DATAUS 50 " Ajusto retardo de los datos en microsegundos
"** FIN DE DEFINE
"DEFINICION DE CONSTANTES
transmito con 1 "constante usada para conmutar la transmision/recepcion
recibo con 0 " " "
apagado con 0 "constante para apagar los led
encendido con 1 "constante para encender los led
"DEFINICION DE VARIABLES
SDA var PORTC.4 "Data I2C
SCL var PORTC.3 "Clock I2C
LEDROJO var PORTE.0 "Led rojo
LEDVERDE var PORTE.1 "Led verde
tempo8 var byte "Variable temporal tipo byte
tempo16 var word "Variable temporal tipo Word
i var word "Variable temporal tipo Word
i2 var byte "Variable temporal tipo byte
"DEFINICION DE LOS PINES DE ENTRADA/SALIDA.
ADCON1 = 7 "PORTA y PORTE como I/O digitales
OPTION_REG.7=0 "activo las resistencias pull up del puerto B
TRISA=%00000000 "Los pin PORTA son salidas
TRISB=%01110000 "Los pin (PORTB.4, 5 y 6) son entradas.
TRISC=%10000000 "Los pin (PORTC.7) son entradas.
TRISD=%00000000 "Todos los pin salidas.
TRISE=%00000000 "Todos los pin salidas.
El cuerpo principal del programa es el siguiente:
while 1
I=i+1
ledrojo= ~ledrojo
for tempo16=1 to 500
pause 1
next tempo16
gosub visualizar
gosub escribir_PCF
"Pause 5
"Gosub escribir_PCF
"U9 tiene A0 A1 A2 --> 1 0 1
wend
"*************************************************************************
"** SUBRUTINA: escribir_PCF
"** escribe uno de los expansores de bus
"*************************************************************************
escribir_PCF:
i2=i2+1
i2cwrite SDA, SCL,%01001010, [i2,i2]
Return
"** FIN SUBRUTINA: escribir_PCF
"*************************************************************************
"** SUBRUTINA: visualizar
"** escribe en el display LCD
"*************************************************************************
visualizar:
lcdout $FE,$C0
lcdout dec i," ",bin8 i2
Return
"** FIN SUBRUTINA: visualizar
El display y los LED me funcionan bien. Pero no consigo escribir en el PCF8575.
Según el PDF del datasheet la palabra de control es 0 1 0 0 A2 A1 A0 0
Las direcciones hardware del dispositivo las tengo así:
A2 a +5
A1 a GND
A0 a +5 (las he medido con el polímetro)
No se si estoy pasando algo por alto
Se agradece cualquier ayuda.
Saludos
Ricky