Robotica Facil. Robots, kits, circuitos, sensores, motores, etc.. SR1 Robot Multifuncional Robótica Fácil  
Página Principal Novedades Ayuda Ver Carrito Catálogo
Kits Robots Circuitos electrónicos Sensores robotica Motores y servos para robots Ruedas y Orugas para robots
Soportes y hardware Tornillos y separadores Libros robotica Radio Modem, Transmisores de Vídeo Robots Fotograficos
Fuentes de Alimentacion Componentes electrónicos Varios robotica Proyectos de Robotica Tutoriales de Robotica
IC CONTROLADOR DE ENTRADA SALIDA POR I2C GPIO14 S320190

IC CONTROLADOR DE ENTRADA SALIDA POR I2C GPIO14. Clic para ampliar

GPIO14 es un circuito de entradas salidas digitales de propósito general que se controla por bus I2C, permitiendo ampliar fácilmente los sistemas basados en este bus. El GPIO14 consiste en un chip PIC16F818 preprogramado que ejecuta un reloj interno de 8MHz. Su función es la de proporcionar una expansión de entradas/salidas estándar en el bus I2C. Además cuenta con funciones adicionales como es la de controlar de forma autónoma hasta dos sensores de distancia por ultrasonidos SRF04 o SRF05. También cuenta con la posibilidad de emplear 5 líneas como puertos de entrada analógicos con conversión de 10 bits y una salida PWM controlada por un conversor digital a analógico de 8 bits. El circuito se controla mediante bus I2C de forma análoga a como se controla una EEPROM del tipo 24C02. La dirección interna dentro del bus puede cambiarse mediante software.

Características:

-Control de hasta dos sensores SRF04 o SRF05, incluyendo todas las temporizaciones.
-Hasta 14 líneas de entrada/salida estándar.
-Hasta 5 canales de entrada analógicos con conversión de analógico a digital de 10-bits.
-1 salida PWM utilizable como un conversor D/A de 8 bits con un filtro sencillo.
-La dirección 0x40 del bus I2C puede modificarse para permitir la conexión de hasta 8 dispositivos en el mismo bus I2C.
-Las 6 líneas de entrada/salida tienen resistencias de pull-up programables integradas en el chip.
-Control individual de cada pin para entrada o salida.
-Comandos sencillos para Bit Set, Bit Clear y Bit Toggle.
-Control sencillo del bus I2C con protocolo similar al EEPROM (24C02).

Diagrama de conexión

Las conexiones de pines de GPIO14 son :

Conexiones de los pines del circuito GPIO14

El GPIO14 requiere una alimentación de 5v. El consumo es muy bajo - aproximadamente 2mA. Se debería conectar un condensador de 100n entre la alimentación de 5v y la conexión a tierra cerca del chip. El bus I2C está conectado en SDA (pin 7) y SCL (pin 10). Se deberían de instalar resistencias pull-up en las líneas SDA y SCL. Normalmente un valor 4k7 es suficiente. Utilizamos resistencias de 1k8 para una mejor inmunidad ante los ruidos, aunque cualquier resistencia entre 1k8 y 10k puede valer. Sólo necesita un par de resistencias de pull-up en todo el bus I2C y no una para cada dispositivo. Las resistencias de pull-up se suelen montar en el bus maestro. El circuito CM02 ya integra las resistencias 1k8 en el módulo.

Hay dos puertos de 8 bits en el GPIO14. El puerto A y el puerto B. Los bits individuales en el puerto A van desde el RA0 hasta el RA7, y para el puerto B van desde el RB0 hasta el RB7. Sólo 6 de estos bits están disponibles, ya que RB1 se utiliza para la línea SDA y RB4 se utiliza para la línea SCL. Sin embargo, puede seguir escribiendo lo que desee a través del puerto B, ya que el firmware evitará que se sobrescriban las líneas I2C. Los bits RB0, RB2, RB3, RB5, RB6 y RB7 están disponibles para entradas/salidas estándar. Algunos pines pueden tener otras funciones. Los bits desde RA0 hasta RA4 pueden utilizarse para las entradas analógicas. El bit RB3 puede utilizarse como una salida PWM. Los bits RB0, RB2, RB3, RB5, RB6 y RB7 pueden tener habilitadas las resistencias de pull-up. RA5 es un pin sólo de entrada. Esta es una limitación del PIC16F818 utilizado. Por defecto, todas las líneas de entrada/salida son entradas en el inicio.

Registros internos

El GPIO14 tiene ocho registros internos, algunos de los cuales tienen funciones diferentes de lectura o escritura.

Registro Lectura Escritura
0 Número de revisión de firmware Registro de comando
1 Byte de nivel lógico alto Máscara de entrada/salida de Puerto A
2 Byte de nivel lógico bajo Máscara de entrada/salida de Puerto B
3 Control de conversor A/D Control de conversor A/D
4 Puerto A Puerto A
5 Puerto B Puerto B
6 PWM PWM
7 Nada (Lee cero) Cambio de dirección I2C

Registro 0

Al leer de GPIO14, el registro 0 devolverá el número de la revisión del firmware (actualmente 2 en el momento de la escritura - Noviembre 2005). Al escribir en el registro 0 se escribe en el registro de comando. Esto se utiliza para Set (Configurar), Clear (Borrar) y Toggle (Cambiar) los pines de entrada/salida (I/O) y otros comandos. Podrá encontrar todos los detalles en la sección Comandos.

Registros 1 y 2

La lectura de estos comandos devolverán el registro del resultado. Este registro de 16 bits contiene por un lado el resultado de la última conversión A/D (En la sección Analógico a digital más adelante encontrará información detallada) o por otro lado la medición de distancia por ultrasonido más reciente (En la sección Medición de distancia por ultrasonido más adelante encontrará información detallada). Al escribir en estos registros se escribe en los registros de control de dirección del puerto. Cada bit configurado convierte al pin del puerto en una entrada. Al borrar un bit se convierte el pin en una salida. Por ejemplo, si se escribe 1 (0x01 en hexadecimal o 00000001 en binario) para registrar 2 convertirá el bit 0 del Puerto B (RB0) en una entrada y todos los demás bits del Puerto B en una salida. Nota - ya que RA5 puede ser sólo un pin de entrada, se ignorará el bit 5 al escribir en el registro 1. Asimismo, RB1 y RB4 están reservados para el bus I2C, por lo que se ignorarán los bits 1 y 4 al escribir en el registro 2.

Registro 3

Este registro se puede escribir o leer. Se utiliza para definir qué pines se usarán como entradas analógicas y cuáles como digitales. Podrá encontrar todos los detalles en la sección Analógico a digital.

Registros 4 y 5

Estos son los registros de datos para el Puerto A y B. Al escribir en estos registros se enviarán los datos a los pines de dicho puerto que estén definidos como salidas. Los pines que sean entradas no cambiarán, seguirán funcionando como pines de entrada. Sin embargo, si posteriormente se cambia un pin a salida escribiendo en los registros 1 ó 2, entonces este dato será tratado automáticamente como una salida. La lectura de estos registros devolverá los datos actuales de los pines, independientemente de que sean una entrada o una salida.

Registro 6

El pin 9, el pin RB3 del puerto, puede utilizarse opcionalmente como una salida pwm. Al escribir en este registro se define el periodo de 8-bits de la salida pwm. Podrá encontrar todos los detalles en la sección PWM. Este registro puede leerse o escribirse.

Registro 7

Este registro de sólo escritura se utiliza para cambiar la dirección I2C del chip GPIO14 del valor predeterminado en fábrica de 0x40. Consulte la sección Dirección I2C a continuación para obtener más detalles.

Comandos

El chip GPIO14 dispone de un conjunto completo de comandos para Set (Establecer), Clear (Borrar) o Toggle (Conmutar) los pines de los puertos. Simplemente debe escribir uno de estos valores en el registro del comando y se establecerá el pin automáticamente como una salida independientemente de su estado anterior. RA5 no aparece porque es un pin de sólo entrada mientras que RB1 y RB4 no aparecen ya que se utilizan exclusivamente para el bus I2C. 

Pin de entrada/salida (I/O) Bit Set Bit Clear Bit Toggle
RA0 16 (0x10) 32 (0x20) 48 (0x30)
RA1 17 (0x11) 33 (0x21) 49 (0x31)
RA2 18 (0x12) 34 (0x22) 50 (0x32)
RA3 19 (0x13) 35 (0x23) 51 (0x33)
RA4 20 (0x14) 36 (0x24) 52 (0x34)
RA6 22 (0x16) 38 (0x26) 54 (0x36)
RA7 23 (0x17) 39 (0x27) 55 (0x37)
RB0 24 (0x18) 40 (0x28) 56 (0x38)
RB1 25 (0x19) 41 (0x29) 57 (0x39)
RB2 26 (0x1A) 42 (0x2A) 58 (0x3A)
RB3 27 (0x1B) 43 (0x2B) 59 (0x3B)
RB5 29 (0x1D) 45 (0x2D) 61 (0x3D)
RB6 30 (0x1E) 46 (0x2E) 62 (0x3E)
RB7 31 (0x1F) 47 (0x2F) 63 (0x3F)

Hay 15 conjuntos de comandos más que pueden enviarse al registro de comando:

Nombre Comando Acción
NO_OP 0 (0x00) Sin operación
PULLB_ON 1 (0x01) Se activan las resistencias de pull-up del puerto B
PULLB_OFF 2 (0x02) Se desactivan las resistencias de pull-up del puerto B
GET_AD0 3 (0x03) Obtener el canal analógico 0 (RA0)
GET_AD1 4 (0x04) Obtener el canal analógico 0 (RA1)
GET_AD2 5 (0x05) Obtener el canal analógico 2 (RA2)
GET_AD3 6 (0x06) Obtener el canal analógico 3 (RA3)
GET_AD4 7 (0x07) Obtener el canal analógico 4 (RA4)
GET_S4A 8 (0x08) Obtener medición de distancia del SRF04 A
GET_S4B 9 (0x09) Obtener medición de distancia del SRF04 B
GET_S5A 10 (0x0A) Obtener medición de distancia del SRF05 A
GET_S5B 11 (0x0B) Obtener medición de distancia del SRF05 B
SET_US 12 (0x0C) Definir la medición de distancia en uS
SET_CM 13 (0x0D) Definir la medición de distancia en centímetros
SET_IN 14 (0x0E) Definir la medición de distancia en pulgadas

Todos los comandos que no estén definidos en las dos tablas anteriores serán tratadas como NO_OP y no tendrán efecto alguno.
PULLB_ON y PULLB_OFF activarán y desactivarán respectivamente las resistencias de pull-up internas del puerto B. Normalmente hay un valor aproximado de 20k pero éste puede variar desde 12.5k hasta 100k.
GET_AD0, GET_AD1, GET_AD2, GET_AD3 y GET_AD4 convierte el canal analógico a una precisión de 10-bits y coloca el resultado en el registro RESULT. La conversión A/D se realiza muy rápido. Se puede enviar el comando GET_ADx e inmediatamente después leer el registro RESULT. Los comandos 8 (0x08) - 14 (0x0E) son cuatro comandos de medición de distancia por ultrasonido utilizados por los módulos SRF04 o SRF05. Para obtener más detalles acerca de estos comandos, consulte la sección Medición de distancia por ultrasonido.

Conversión de señal analógica a digital (A/D)

Cinco de los pines del GPIO14 pueden utilizarse para las entradas analógicas. Estos son AN0 - AN4 (pines 17, 18, 1, 2, y 3). Los pines que realmente estén disponibles dependerá del valor escrito en el registro 3, es decir, el registro de control de la conversión A/D. El registro de control de la conversión A/D puede también utilizarse para justificar a la izquierda o derecha el resultado de 10-bits. La justificación a la izquierda coloca el resultado de 10-bits en bits 15-6 del registro de resultado, los bits 5-0 equivaldrán a cero. Esto resulta de gran utilidad si sólo se necesita un resultado de 8-bits, ya que podrá leerlo desde el registro 1 (byte de nivel lógico alto del resultado de la conversión A/D). La justificación a la derecha coloca el resultado de 10-bits en bits 9-0 del registro de resultado, los bits 15-10 equivaldrán a cero. El registro de resultado de 16-bits contendrá entonces valores desde 0 hasta 1023 (desde 0x0000 hasta 0x03FF). Se debe establecer el bit 7 del registro de control de A/D para la justificación a la derecha y borrarlo para la justificación a la izquierda. 

Registro de control de conversión A/D

7 6 5 4 3 2 1 0
ADFM 1 x x PCFG3 PCFG2 PCFG1 PCFG0

El significado de los bits se ve en la siguiente tabla:

Bit Nombre Función
Bit7 ADFM El resultado 1 de A/D se justifica a la derecha
El resultado 0 de A/D se justifica a la izquierda
Bit 6 1 Este bit siempre se fuerza a 1
Bits 5,4 x x Bits no utilizados - siempre de lectura 0
Bits 3,2,1,0 PCFG Estos bits seleccionan qué pines serán entradas Analógicas, Digitales y entradas de voltaje de Referencia.
PCFG   AN4 AN3 AN2 AN1 AN0 VRef+ VRef-
0000 A A A A A 5 V Tierra
0001 A VRef+ A A A AN3 Tierra
0010 A A A A A 5 V Tierra
0011 A VRef+ A A A AN3 Tierra
0100 D A D A A 5 V Tierra
0101 D VRef+ D A A AN3 Tierra
0110 D D D D D 5 V Tierra
0111 D D D D D 5 V Tierra
1000 A VRef+ VRef- A A AN3 AN2
1001 A A A A A 5 V Tierra
1010 A VRef+ A A A AN3 Tierra
1011 A VRef+ VRef- A A AN3 AN2
1100 A VRef+ VRef- A A AN3 AN2
1101 D VRef+ VRef- A A AN3 AN2
1110 D D D D A 5 V Tierra
1111 D VRef+ VRef- D A AN3 AN2

Como puede ver, hay limitaciones en los que respecta a las combinaciones posibles de entradas analógicas y digitales. Debe tener esto en cuenta al realizar el cableado del chip. Las cuatro combinaciones más útiles se destacan en color verde. El registro de control A/D debe estar definido antes de realizar su primera conversión. Los comandos GET_ADx convertirán el canal seleccionado automáticamente en una entrada y las dejarán como entrada tras la conversión. Si escribe en el registro de control de dirección del puerto A, deberá asegurarse de mantener los canales analógicos requeridos como entradas.
La conversión de un canal se realiza ejecutando un comando GET_ADx, que colocará el valor en el registro de resultado. Se puede obtener entonces el valor leyendo el registro de resultado. Por lo tanto, se necesitan dos secuencias de transacciones I2C independientes, una para ejecutar el comando y otra para leer el resultado. Las opciones VRef+ y VRef- se utilizan como entradas de referencia. La conversión se realiza generalmente para las entradas que oscilan entre 0v y 5v (opciones resaltadas). Al seleccionar las otras opciones se pueden convertir entre 0v y cualquier valor insertado en el pin VRef+, o entre VRef+ y VRef-. No introduzca un valor superior a 5v o inferior a 0v en ningún pin. El rango mínimo para Vref+ - Vref- es 2.5v. 

Salida PWM

Pin 9, el pin RB3 del puerto, puede utilizarse opcionalmente como una salida PWM. Un filtro muy sencillo la convertirá en una salida analógica. La frecuencia de PWM es fija a 32KHz. El ancho de pulso oscila entre 0 y 100% y se define escribiendo los valores 0-255 (0x00 - 0xFF) en el registro PWM. Un valor de 255 (0xFF) da como resultado un valor lógico alto continuo, mientras que un valor de 0 (0x00) dará como resultado un valor lógico bajo continuo en RB3. Si se escribe un valor de 127 (0x7F) se obtendrá una onda cuadrada de 50% alto, 50% bajo a 32KHz. Al escribir en el registro PWM, RB3 se convierte automáticamente en una salida e inicia la PWM. Puede modificar la salida PWM escribiendo un valor nuevo en el registro PWM en cualquier momento. Para detener la salida PWM simplemente debe escribir 0 (0x00) en el registro PWM. RB3 se deja como una salida cuando PWM se detiene. Para convertir la salida a un voltaje analógico, se puede utilizar un filtro sencillo con una resistencia de 47k y un condensador de 100nF.

Conversión digital analogico con filtro en la salida PWM

Este filtro tiene una onda de salida de menos de 1 LSB. La impedancia de la salida es obviamente superior a 47k por lo que deberá utilizar un amplificador operacional.

Medición de distancia por ultrasonido

La medición de distancia por ultrasonido puede realizarse a través de los módulos SRF04 o SRF05. Los dos módulos ofrecen control y temporización completa. 

Conexión de dos sensores SRF04 al circuito GPIO14

Los diagramas anteriores muestras la conexión de la señal para la conexión de los medidores de distancia por ultrasonidos SRF04 con el GPIO14. Estos diagramas también se aplican para el SRF05 si el pin de modo del SRF05 no está conectado, ya que lo define en modo de compatibilidad con el SRF04. El GPIO14 puede realizar la medición de la distancia de los SRF04 en uS, centímetros y pulgadas. Los comandos siguientes seleccionan el modo de medición:

Comando Valor Acción
SET_US 12 (0x0C) Definir la medición de distancia en uS
SET_CM 13 (0x0D) Definir la medición de distancia en centímetros
SET_IN 14 (0x0E) Definir la medición de distancia en pulgadas

Para comenzar la medición de distancia, se debe escribir GET_S4A en el registro de comando para los módulos SRF04(A), o GET_S4B para los módulos SRF04(B).
Deberá esperar aproximadamente al menos unos 60ms para que finalice el proceso de medición. El GPIO14 no responderá a más comandos I2C mientras esté realizando la medición. 
El resultado de la medición se insertará en el registro de resultado (RESULT) y puede leerse desde ese registro.

Conexión de dos sensores SRF05 al circuito GPIO14

El diagrama anterior muestra el método de conexión de dos módulos SRF05 al GPIO14. Con el pin de modo del SRF05 conectado a 0v, operará en un modo de un único pin cuando los pulsos del punto de activación y de eco utilizan el mismo pin.
RB6 y RB7 no están utilizados en el modo por lo que pueden utilizarse como entrada/salida de propósito general.
Para comenzar la medición de distancia, se debe escribir GET_S4A en el registro de comando para los módulos SRF04(A), o GET_S4B para los módulos SRF04(B).
Deberá esperar aproximadamente al menos unos 60ms para que finalice el proceso de medición. El GPIO14 no responderá a más comandos I2C mientras esté realizando la medición. 
El resultado de la medición se insertará en el registro de resultado (RESULT) y puede leerse desde ese registro.

Cambio de la dirección del I2C

¡Esto es lo último que debe intentar hacer! La dirección predeterminada en fábrica del chip GPIO14 es 0x40. Le recomendamos que antes de intentar cambiar esta dirección, se familiarice primero con ella.

La dirección del bus I2C puede modificarse a 0x40, 0x42, 0x44, 0x46, 0x48, 0x4A, 0x4C o 0x4E, escribiendo una secuencia específica en el registro 7, el registro de cambio de dirección I2C. La secuencia es 0xA0, 0xAA, 0xA5 y a continuación la nueva dirección. Esta secuencia debe escribirse en el registro 7 en cuatro transacciones de bus I2C independientes. No debe leer o escribir en los demás registros durante esta secuencia. La nueva dirección se almacenará en la memoria EEPROM dentro del chip y se activará inmediatamente. Para evitar la confusión, debería colocar una etiqueta en el chip con esta nueva dirección. 

Código de ejemplo para RF04/CM02

El siguiente ejemplo de código muestra cómo leer y escribir a través del circuito transceptor de datos por USB RF04 S350175 y el circuito transceptor de datos I2C CM02 S350180 al GPIO14 conectado a los pines I2C del CM02. 
Existen tres funciones, la primera de ellas escribe un byte de data en cualquier registro de GPIO14. Para definir un valor lógico alto en RB0 debería utilizar:


gpio_write(0, 24);

o mucho mejor:


#define CMD       0
#define SET_RB0  24
gpio_write(CMD, SET_RB0);

La segunda función lee un registro de GPIO14.


#define PORT_A    4
PortAData = gpio_read1(PORT_A); 

La tercera función lee dos bytes de los registros de GPIO14 y los devuelve como un valor entero.


#define RESULT    1
AN0  = gpio_read2(RESULT); 

Las tres funciones están desarrolladas para una aplicación VisualC. WriteFile y ReadFile son funciones MFC, hCom puede controlar el puerto com serie al que está asignado el RF04.


#define I2C_CMD   0x55
#define GPIO14    0x40

void CRF04_driverDlg::gpio_write(BYTE reg, BYTE data)
{
char cmd[10];
DWORD n;
  cmd[0] = I2C_CMD;              // send command
  cmd[1] = GPIO14;
  cmd[2] = reg;
  cmd[3] = 0x01;
  cmd[4] = data;
  WriteFile(hCom, &cmd, 5, &n, NULL);
  ReadFile(hCom, &cmd, 1, &n, NULL);
}

BYTE CRF04_driverDlg::gpio_read1(BYTE reg) 
{
char cmd[10];
DWORD n;
  cmd[0] = I2C_CMD;              // send command
  cmd[1] = GPIO14+1;
  cmd[2] = reg;
  cmd[3] = 1;
  WriteFile(hCom, &cmd, 4, &n, NULL);
  ReadFile(hCom, &cmd, 1, &n, NULL);
  return cmd[0];
}

int CRF04_driverDlg::gpio_read2(BYTE reg) 
{
char cmd[10];
DWORD n;
  cmd[0] = I2C_CMD;              // send command
  cmd[1] = GPIO14+1;
  cmd[2] = reg;
  cmd[3] = 2;
  WriteFile(hCom, &cmd, 4, &n, NULL);
  ReadFile(hCom, &cmd, 2, &n, NULL);
  return (cmd[0]<<8)+cmd[1];
}
 

 

Ejemplo de PIC16F877

El ejemplo siguiente muestra cómo leer estas tres entradas analógicas, dos sensores de distancias SRF05, los Puertos A y B, y mostrar los resultados en un display LCD03. El código está escrito en lenguaje C, por lo que se puede modificar fácilmente en cualquier chip de tipo PIC. Puede desacargarse una copia en este enlace o el archivo compilado .hex en este enlace.

 

Haga clic en el botón COMPRAR para añadir este producto a su carrito de la compra.

9,65-Euros.
IVA incluido
AÑADIR AL CARRITO DE LA COMPRA

IC CONTROLADOR DE ENTRADA SALIDA POR I2C GPIO14

Vea mas productos de esta categoría en:

Circuitos controladores y electrónica para robots.

Ir a la Página Principal de www.SuperRobotica.com

Actualizada el 29/12/2023 © 2002 -2023 INTPLUS ®. Todos los derechos reservados