You are on page 1of 6

Expansor de E/S PCF8574

Detalles
Última actualización el Lunes, 25 Noviembre 2013 20:39
Escrito por Biblioman

El PCF8574 es un expansor de E/S compatible con la mayoría de microcontroladores, permite una comunicación
bidireccional, necesitando para ello solo dos líneas a través del bus I2C.

Características del módulo


 Tensión de alimentación de 2.5 a 6 V CC.
 Bajo consumo en standby (máximo 10 microamperios).
 Conversión de datos de I2C a paralelo y viceversa.
 Un Pin de interrupción de salida a drenador abierto (necesita resistencia pul-up).
 Un puerto cuasi-bidireccional de ocho bits (necesitan resistencias pul-up).
 Tres pines disponible para configurar por hardware la dirección del dispositivo.
 Disponible en encapsulados DIP y SMD.
Diagrama de bloques

Direccionamiento
Este módulo dispone de dos modelos (PCF8574 y PCF8574A) cuya única diferencia es su dirección.

Los primeros cuatro bits vienen configurados de fábrica y los tres últimos son configurables por hardware, por
lo que podemos tener 8 módulos conectados al mismo bus I2C (y si combinamos ambas versiones hasta 16).

Funcionamiento
Como cualquier dispositivo I2C la comunicación es a través de dos líneas:

 SDA: línea serie para los datos.


 SCL: para la señal de reloj.

Ambas líneas deben de estar conectadas a una alimentación positiva a través de una resistencia pul-up.

El microcontrolador es el que está configurado como maestro y él o los módulos PCF8574 que estén conectados
al bus se configuran como esclavos, el maestro es el que realiza las peticiones de lectura o escritura sobre los
módulos y controla la señal de reloj (SCL).

La transferencia de datos puede ser inicializada solo cuando el bus no está ocupado.

Una trama de datos en una transmisión consta de:

 Un bit de inicio de la comunicación.


 Un byte formado por siete bits que identifican la dirección del esclavo + un bit para indicar si se va
hacer una lectura (R/W=1) o escritura (R/W=0) en el módulo.
 Los datos en sí (de transmisión o recepción); el número de bytes de datos a transmitir o recibir entre
el comienzo de la comunicación y la condición de fin de transmisión (bit de parada) no está limitada.
 Un ACK de reconocimiento. A cada byte transmitido le sigue un bit de reconocimiento, cuando el
esclavo recibe un byte este envía el ACK para indicarle al maestro que lo ha recibido correctamente,
cuando la petición del maestro al esclavo es de lectura este debe de enviar un ACK al esclavo para
indicarle que ha recibido el byte correctamente.
 Un bit de parada. La condición de parada (P) ocurre cuando la línea SDA cambia de nivel alto a bajo
mientras la línea de reloj se encuentra a nivel alto y es controlada por el dispositivo maestro (en nuestro
caso el microcontrolador).

Nota: en el segundo vídeo se muestra la explicación sobre el datagrama.

Ejemplos
Los ejemplos están basados en el siguiente módulo que se puede adquirir fácilmente por Internet y que incluye
en una pequeña placa el integrado PCF8574 listo para usar:

Ejemplo LCD I2C con Arduino

Vídeo de la demo:

Código fuente de la demo:

01./*
02.** Example Arduino sketch for SainSmart I2C LCD Screen 16x2
03.** based on https://bitbucket.org/celem/sainsmart-i2c-
lcd/src/3adf8e0d2443/sainlcdtest.ino
04.** by
05.** Edward Comer
06.** LICENSE: GNU General Public License, version 3 (GPL-3.0)
07.
08.** This example uses F Malpartida's NewLiquidCrystal library. Obtain from:
09.** https://bitbucket.org/fmalpartida/new-liquidcrystal
10.
11.** Modificado por Biblioman
12.
13.** NOTE: Tested on Arduino Uno whose I2C pins are A4==SDA, A5==SCL
14.
15.*/
16.#include <Wire.h>
17.#include <LCD.h>
18.#include <LiquidCrystal_I2C.h>
19.
20.#define I2C_ADDR 0x3f // <<-Dirección del esclavo
21.#define BACKLIGHT_PIN 3
22.#define En_pin 2
23.#define Rw_pin 1
24.#define Rs_pin 0
25.#define D4_pin 4
26.#define D5_pin 5
27.#define D6_pin 6
28.#define D7_pin 7
29.
30.int n = 1;
31.
32.LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
33.
34.void setup()
35.{
36.lcd.begin (16,2); // <<--- LCD 16x2
37.
38.
39.// Enciende el backlight
40.lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
41.lcd.setBacklight(HIGH);
42.
43.}
44.
45.void loop()
46.{
47.lcd.setCursor (0,0); // va al comienzo de la 1ª línea LCD
48.lcd.print("Aquihayapuntes");
49.lcd.setCursor (0,1); // va al comienzo de la 2ª línea LCD
50.lcd.print("LCD I2C.......");
51.delay(3000);
52.
53.lcd.setCursor (0,0); // va al comienzo de la 1ª línea LCD
54.lcd.print("LCD I2C.......");
55.lcd.setCursor (0,1); // va al comienzo de la 2ª línea LCD
56.lcd.print("Aquihayapuntes");
57.delay(3000);
58.}
59.
60.

1º Ejemplo con PICs: Decodificador de binario a hexadecimal

Esquema:
Vídeo de la demo:

Código fuente:

01.
02./*--------------------------------------------------------*\
03.| Ejemplo uso de bus expansor de 8 bits PC8574 |
04.| autor: biblioman |
05.| www.aquihayapuntes.com |
06.\*--------------------------------------------------------*/
07.
08.#include <16F877.h>
09.#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
10.#use delay(clock=4000000)
11.#use i2c(master,sda=pin_C4,scl=pin_C3,force_hw)
12.
13.int array[16] =
{0xFF,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E};
14.int valor=0b11111111;
15.
16.#int_EXT
17.void EXT_isr(void){
18.
19.//Lectura Bus I2C
20.int tmp=0;
21.i2c_start(); // Start I2C
22.i2c_write(0x4F); // Direccion del dispositivo PCF8574 + bit modo lectura
23.tmp = i2c_read(); //Asigno el valor leído en la variable tmp
24.tmp=~tmp;//
25.valor=array[tmp];
26.i2c_stop(); // Stop
27.
28.}
29.void main() {
30.
31.enable_interrupts(GLOBAL);//habilito interrupción global
32.enable_interrupts(INT_EXT);//habilito interrupción externa
33.ext_int_edge(H_TO_L);//interrupción activa a nivel bajo
34.
35.while(true){
36.delay_ms(500);
37.//Escritura del valor en el Bus
38.i2c_start(); // Inicio
39.i2c_write(0x42); // Dirección del dispositivo PCF8574 + bit modo escritura
40.i2c_write(valor);
41.i2c_stop(); // Stop I2C
42.}
43.}
44.

Ejemplo LCD I2C con PIC

Esquema:

Haz clic en la imagen para ampliar

Vídeo de la demo:

Código fuente:

01./*--------------------------------------------------------*\
02.| Ejemplo LCD I2C con PIC |
03.| autor: biblioman |
04.| www.aquihayapuntes.com |
05.\*--------------------------------------------------------*/
06.
07.#include <16f877.h>
08.#use delay(clock=4000000)
09.
10.#FUSES XT,NOPROTECT,NOWRT,PUT,NOWDT,NOLVP,NOCPD
11.
12.#include "lcd_i2c.h"
13.
14.void main()
15.{
16.
17.lcd_init();
18.While(true){
19.delay_ms(3000);
20.lcd_gotoxy(1,1);
21.printf(lcd_putc, "Aquihayapuntes");
22.lcd_gotoxy(1,2);
23.printf(lcd_putc, "LCD I2C PIC ");
24.delay_ms(3000);
25.lcd_gotoxy(1,1);
26.printf(lcd_putc, "LCD I2C PIC ");
27.lcd_gotoxy(1,2);
28.printf(lcd_putc, "Aquihayapuntes");
29.}
30.}
31.

Fuente de la información
 Datasheet PCF8574

Puedes comentar este artículo en este hilo del foro.

Un saludo y hasta la próxima

You might also like