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 :
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.
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.
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.
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:
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
|
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 18/10/2024 © 2002 -2024 INTPLUS ®. Todos los derechos reservados
|