TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: RGL en 16 de Noviembre de 2004, 10:20:00
-
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
-
Pana Ricky, la señalizacion de control no deberia de ser 01000000 ??
Un abrazo pana
-
Hola Ricky:
O las has puesto por fuera o no tienes pull ups en las lineas de sda y scl....puesto que la habilitacion de los pull ups solo es para port b y tus lieas no salen por portB
otra esa variable i2c=i2c+1 ...no le has dado valor inicial ...0 o 1 y porque motivo la mandas a escribir 2 veces???sera igual las dos veces...... 11 2 2 lo que interpreto que tu comando envia la palabra de control que a mi modesto entender esta bien y una repeticion del mismo numero .....
pero fijate en lpos pull ups
saludos
khasistos
-
Hola muchachos,
Gracias por vuestra rápida respuesta.
La palabra de control es la siguiente: 01001010
0100 lo dice el DS del fabricante.
101 mi hardware lo impone así A2 A1 A0
0 para escribir
Así que deduzco que la palabra está bien.
--------------------------
Las pull up las tengo puestas, primero puse unas de 4K7 y no contento con eso miré la señal en un osciloscopio y las cambié por 2K. Sale una señal mucho más cuadrada con 2K. Lo recomiendo para velocidades altas del bus.
La inicialización de la variable i2 si la hago pero por algún motivo no se ha copiado la linea.
Por otra parte lo de mandarle 2 veces la misma variable es simplemente porque como tiene 16 salidas yo tengo que enviarle 2 bytes para poner las salidas como quiera y en principio esto es una prueba yo solo quiero ver como varían con un contador que vaya aumentando. En el display veo como la variable i2 va cambiando pero no en las salidas del expansor. He probado a 100KHz y a 400KHz, pero de ningún modo va. He mirado con el osciloscopio y la señal llega a los pines del expansor. No se si se me escapa algo por soft o es que la pieza estará rota. La he soldado con un soldador de baja potencia y con mucho mimo, pero quien sabe.
Saludos panas y gracias por la ayuda.
Ricky
-
HOLA RICKY:
obviamente si chekeaste las sda y scl ,chekeaste que envie la palabra de control?? la puedes llegar a ver como un tren de pulsos...
baja la velocidad del contador o dejala fija con un dato determinado.....
tal vez este esperando el bit de confirmacion de recepcion creo llamado ack por eso te digo que mandes la config y UN solo dato...y fijate si hay salidas no sigas incrementando la variable.....
no recurerdo bien pero habia dos formas una ignorando el ACK y otra con recepcion del ack si no no enviaba o no se producia la comunicacion chekea esas cosas ricky.
saludos
khasistos