Hola.
Acabo de empezar a usar el circuito integrado PCF8574 y me es de gran utilidad. asi que decidi compartir con uds la información con la que cuento.
Este integrado es un expansor de bus paralelo comunicado al microcontrolador atraves del bus I2C. Es bidireccional y cuenta con la capacidad de manejar LED's directamente de su salida. El protocolo de comunicaciones solo cuenta con dos Bytes, el de direccionamiento y el de datos.
El byte de direcionamiento esta compuesto por la direccion del dispositivo (0100[A0][A1][A2]) y el bit R/W. A0, A1 y A2 asumen el valor logico de los pines 1, 2 y 3 respectivamente, lo que permite conectar al mismo bus hasta ocho dispositivos, con la direcciones 0x20; 0x21; 0x22; 0x23; 0x24; 0x25; 0x26 y 0x27. el bit 7 de este byte (R/W) es el que indica si se va a leer o a grabar el dispositivo, por ende seleccionando la dirección del siguiente byte.
El byte de datos es el que transporta la información hacia o desde el microcontrolador. si el bit R/W esta a nivel bajo este byte sera transmitido por el microcontrolador y las salidas del PCF8574 asimiran su valor. En cambio si el bit R/W esta a nivel alto este byte sera transmitido desde el PCF8574 hacia el microcontrolado y contendra el estado de las entradas.
Este integrado cuenta con un pin de interrucion a drenador abierto que pasa a nivel bajo cuando alguno de sus pines cambia de nivel. este pin es de gran utilidad si algunos de los pines va a ser usado como entrada, ya que conectando este pic a una interrupcion externa del micro se puede leer solo cuando algunas de las entradas cambia de nivel, evitando tener que hacer reinteradas lecturas del integrado para conocer si hubo o no un cambio de estado.
A continuacion deje un ejemplo para el empleo del PCF8574 como salida para el manejo de 8 LED's. estos LED'sm asumen el valor del puerto B del microcontrolador.
En el siguiente ejemplo se puede utilizar el PCF8574 para el manejo de un display de siete segmento y escribir el mensaje "HOLA" (la conexion del display es conectando cada segmento en orden alfabetico con el numero de salida correspondiente, osea: segmento A conectado a P0; segmento B conectado a P1.......segmento G conectado a P7)
Espero haber sido de ayuda. Un gran saludo.
SEBITRONIC
Acabo de empezar a usar el circuito integrado PCF8574 y me es de gran utilidad. asi que decidi compartir con uds la información con la que cuento.
Este integrado es un expansor de bus paralelo comunicado al microcontrolador atraves del bus I2C. Es bidireccional y cuenta con la capacidad de manejar LED's directamente de su salida. El protocolo de comunicaciones solo cuenta con dos Bytes, el de direccionamiento y el de datos.
El byte de direcionamiento esta compuesto por la direccion del dispositivo (0100[A0][A1][A2]) y el bit R/W. A0, A1 y A2 asumen el valor logico de los pines 1, 2 y 3 respectivamente, lo que permite conectar al mismo bus hasta ocho dispositivos, con la direcciones 0x20; 0x21; 0x22; 0x23; 0x24; 0x25; 0x26 y 0x27. el bit 7 de este byte (R/W) es el que indica si se va a leer o a grabar el dispositivo, por ende seleccionando la dirección del siguiente byte.
El byte de datos es el que transporta la información hacia o desde el microcontrolador. si el bit R/W esta a nivel bajo este byte sera transmitido por el microcontrolador y las salidas del PCF8574 asimiran su valor. En cambio si el bit R/W esta a nivel alto este byte sera transmitido desde el PCF8574 hacia el microcontrolado y contendra el estado de las entradas.
Este integrado cuenta con un pin de interrucion a drenador abierto que pasa a nivel bajo cuando alguno de sus pines cambia de nivel. este pin es de gran utilidad si algunos de los pines va a ser usado como entrada, ya que conectando este pic a una interrupcion externa del micro se puede leer solo cuando algunas de las entradas cambia de nivel, evitando tener que hacer reinteradas lecturas del integrado para conocer si hubo o no un cambio de estado.
A continuacion deje un ejemplo para el empleo del PCF8574 como salida para el manejo de 8 LED's. estos LED'sm asumen el valor del puerto B del microcontrolador.
Código:
; Programa de lectura y escritura del
;expansor de puerto via I2C PCF8574
LIST P=16F876A
#INCLUDE "P16F876A.INC"
#DEFINE AUX0 H'20'
;CONFIGURACION DE LOS FUSES
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF
;INICIO DEL PROGRAMA
; CONFIGURACIÓN
LOOP MOVLW B'00101000'
MOVWF SSPCON
BANKSEL OPTION_REG
BCF OPTION_REG,NOT_RBPU
MOVLW D'49'
MOVWF SSPADD
BCF STATUS,RP0
A NOP
; (1)
;(inicio de la "START CONDITION")
BANKSEL SSPCON2
BSF SSPCON2,SEN
;(espera a terminar la start condition)
BANKSEL PIR1
BTFSS PIR1,SSPIF
GOTO $-1
; (2)
;(carga la direccion del dispositivo y el bit R/W)
MOVLW B'01000000'
MOVWF SSPBUF
;(espera a terminar la transmicion)
BCF PIR1,SSPIF
BTFSS PIR1,SSPIF
GOTO $-1
; (3)
;(comprobacion de ACK)
BANKSEL SSPCON2
BTFSC SSPCON2,ACKSTAT
GOTO $-11
;(6)
;(envio del valor del puerto B)
BANKSEL PORTB
MOVF PORTB,W
MOVWF SSPBUF
;(espera a termianr de transmitir)
BCF PIR1,SSPIF
BTFSS PIR1,SSPIF
GOTO $-1
;(7)
;(comprobacion de ACK)
BANKSEL SSPCON2
BTFSC SSPCON2,ACKSTAT
GOTO $-8
;(9)
;(inicio de la "STOP CONDITION")
BSF SSPCON2,PEN
;(espera a terminar la stop condition)
BANKSEL PIR1
BCF PIR1,SSPIF
BTFSS PIR1,SSPIF
GOTO $-1
BCF PIR1,SSPIF
GOTO A
END
En el siguiente ejemplo se puede utilizar el PCF8574 para el manejo de un display de siete segmento y escribir el mensaje "HOLA" (la conexion del display es conectando cada segmento en orden alfabetico con el numero de salida correspondiente, osea: segmento A conectado a P0; segmento B conectado a P1.......segmento G conectado a P7)
Código:
; Segunda practica con PCF8574,
;la cual consiste en escribir la
;palabra HOLA en un display de
;siete segmentos.
;-----------------------------------
; Microcontrolador: PIC16F873A
; Oscilador: Cristal 20MHz
LIST P=16F876A
#INCLUDE "P16F876A.INC"
;CONFIGURACION DE LOS FUSES
__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _HS_OSC & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF
#DEFINE H B'01110110'
#DEFINE O B'00111111'
#DEFINE L B'00111000'
#DEFINE A B'01110111'
#DEFINE TRANS 20H
#DEFINE PDel0 21H
#DEFINE PDel1 22H
#DEFINE PDel2 23H
;INICIO DEL PROGRAMA
;(configuracion)
LOOP MOVLW B'00101000'
MOVWF SSPCON
BANKSEL OPTION_REG
BCF OPTION_REG,NOT_RBPU
MOVLW D'49'
MOVWF SSPADD
BCF STATUS,RP0
;(bucle principal)
BP MOVLW H
MOVWF TRANS
CALL I2C
CALL DEMORA
MOVLW O
MOVWF TRANS
CALL I2C
CALL DEMORA
MOVLW L
MOVWF TRANS
CALL I2C
CALL DEMORA
MOVLW A
MOVWF TRANS
CALL I2C
CALL DEMORA
GOTO BP
;(bucle de transmicion de de dato)
I2C NOP
; (1)
;(inicio de la "START CONDITION")
BANKSEL SSPCON2
BSF SSPCON2,SEN
;(espera a terminar la start condition)
CLRWDT
BANKSEL PIR1
BTFSS PIR1,SSPIF
GOTO $-1
; (2)
;(carga la direccion del dispositivo y el bit R/W)
MOVLW B'01000000'
MOVWF SSPBUF
;(espera a terminar la transmicion)
CLRWDT
BCF PIR1,SSPIF
BTFSS PIR1,SSPIF
GOTO $-1
; (3)
;(comprobacion de ACK)
BANKSEL SSPCON2
BTFSC SSPCON2,ACKSTAT
GOTO $-8
;(6)
;(envio del valor del puerto B)
BANKSEL TRANS
MOVF TRANS,W
MOVWF SSPBUF
;(espera a termianr de transmitir)
CLRWDT
BCF PIR1,SSPIF
BTFSS PIR1,SSPIF
GOTO $-1
;(7)
;(comprobacion de ACK)
BANKSEL SSPCON2
BTFSC SSPCON2,ACKSTAT
GOTO $-9
;(9)
;(inicio de la "STOP CONDITION")
BSF SSPCON2,PEN
;(espera a terminar la stop condition)
CLRWDT
BANKSEL PIR1
BCF PIR1,SSPIF
BTFSS PIR1,SSPIF
GOTO $-1
BCF PIR1,SSPIF
RETURN
;-------------------------------------------------------------
; Generado con PDEL ver SP r 1.0 el 05/01/2010 Hs 05:04:27 p.m.
; Descripcion: Delay 5000000 ciclos
;-------------------------------------------------------------
DEMORA movlw .165 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .41 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .147 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
return ; 2+2 Fin.
;-------------------------------------------------------------
END
Espero haber sido de ayuda. Un gran saludo.
SEBITRONIC