Pcf8574

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.

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
 

Adjuntos

  • PCF8574-_-Datasheet-_-.pdf
    436.1 KB · Visitas: 48
Fig2606_PCF8574.gif



Descargar código fuente.

Contraseña: D.P.E.

Más información.
 
Acabo de leer algo sobre otro integrado de esta familia, el PCF8591 que es un cuadruple ADC y un DAC todo en un integrado, esta bueno, en cuanto lo compre y diseñe un soft lo suvo a modo de ejemplo de empleo.
 
Atrás
Arriba