TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: xabibix en 07 de Febrero de 2006, 17:28:00
-
He construido un circuito con 4 expansores de 8-bits "PCF8574", dos como entradas y los otros dos como salidas, quiero comunicar todos lo PCF8574 con el bus I2C por medio del pic 16f84a, mi problema es el siguiente,al pulsar uno de los interruptores de entrada del expansor (PCF8574_DireccionLectura1) obtengo la salida del (PCF8574_DireccionEscritura1), pero no obtengo nada en la salida (PCF8574_DireccionEscritura2), cuando pulso los interruptores del (PCF8574_DireccionLectura2).
Me podriais ayudar?
Muchas Gracias.
El programa es el siguiente:
;************************************ BOTONERA I2C.asm *****************************
; ZONA DE DATOS **********************************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0x0C
Dato
ENDC
PCF8574_DireccionLectura1 EQU b"01110001"
PCF8574_DireccionEscritura1 EQU b"01110010"
PCF8574_DireccionLectura2 EQU b"01110101"
PCF8574_DireccionEscritura2 EQU b"01111110"
#DEFINE PCB8574_INT PORTB,0
; ZONA DE CÓDIGOS ********************************************************************
ORG 0
goto Inicio
ORG 4
goto ServicioInterrupcion
Inicio
bsf STATUS,RP0
bsf PCB8574_INT
bcf OPTION_REG,INTEDG
bcf STATUS,RP0
call ServicioInterrupcion
movlw b"10010000"
movwf INTCON
Principal
sleep
goto Principal
; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
; Lee los interruptores conectados al PCF8574 que actúa como entrada y el resultado lo visualiza
; en los diodos LEDs conectados al PCF8574 configurado como salida.
ServicioInterrupcion
call Retardo_20ms
call PCF8574_Lee1 entrada.
movwf Dato
comf Dato,W
call PCF8574_Escribe1
call Retardo_20ms
call PCF8574_Lee2
movwf Dato
comf Dato,W
call PCF8574_Escribe2
bcf INTCON,INTF
retfie
INCLUDE <BUS_I2C.INC>
INCLUDE <PCF8574(4).INC>
INCLUDE <RETARDOS.INC>
END
;**************************** Librería "PCF8574(4).INC" **********************************
CBLOCK
PCF8574_Dato dato leído o que
ENDC
PCF8574_Lee1
call I2C_EnviaStart
movlw PCF8574_DireccionLectura1
call I2C_EnviaByte
bsf I2C_UltimoByteLeer
call I2C_LeeByte
movwf PCF8574_Dato
call I2C_EnviaStop
movf PCF8574_Dato,W
return
PCF8574_Escribe1
movwf PCF8574_Dato
call I2C_EnviaStart
movlw PCF8574_DireccionEscritura1
call I2C_EnviaByte
movf PCF8574_Dato,W
call I2C_EnviaByte
call I2C_EnviaStop
movf PCF8574_Dato,W
return
PCF8574_Lee2
call I2C_EnviaStart
movlw PCF8574_DireccionLectura2
call I2C_EnviaByte
bsf I2C_UltimoByteLeer
call I2C_LeeByte
movwf PCF8574_Dato
call I2C_EnviaStop
movf PCF8574_Dato,W
return
PCF8574_Escribe2
call I2C_EnviaStart
movlw PCF8574_DireccionEscritura2
call I2C_EnviaByte
bsf I2C_UltimoByteLeer
call I2C_LeeByte
movwf PCF8574_Dato
call I2C_EnviaStop
movf PCF8574_Dato,W
return
-
Has probado el hardware por separado?
Has debugueado la posibilidad de que no estes direccionando todos los dispositivos i2C? El ic2 te permite verificar si recibiste o no un acknowledge. Si no lo recibiste entonces no direccionaste bien el pic o tienes problema en el hardware.
Te aconsejo que empieces por ahi.
-
Hola xabibix,
Aunque soy novato, a mí me paso algo parecido, y me dio mucho por .....
Prueba con lo siguiente:
- Activa las resistencias de pull-up (creo que esto no es necesario, pero yo lo tengo puesto así
: bcf OPTION_REG,NOT_RBPU
- Por que llamas al servicio de interrupcion desde Inicio, ya ira solo.
- En los sub de PCF8574_Lee1, ......, direcciona directamente desde ahí:
movlw b"01000001". Esto a mi me fastidió mucho y no se porque.
- Luego he visto que en tus direccionamentos, pones: b"0111xxxx". Teoricamente, esta direccion es para el PCF8574a, para el normal es b"0100xxxx"
Supongo que las librerias de i2c las tienes bien (deben ser las del libro del PIC16F84 no?)
Espero que te funcione. Un Saludo.
-
hOLA
Bien, yolo estoy intentando en CSS con el PIC 18f2550. He montado un PCF8574 como entrada ADR001 , y otro como salida ADR:000.
Efectuo la lectura del primero y lo escribo en el segundo. Todo va bien hasta que pongo PB7 del expansor de entradas a cero. No se por que pero cuando he efectuado la lectura y se va ha realizar la escritura el programa se pierde. Lo he montado y simulado y en ambos casos de pierde.
Si tienes alguna sugerencia
tomasgarcia57@hotmail.com
Saludos
He probado por SW y por HW. (Cual es la diferencia)