4 PUERTOS DE ENTRADA

Anuncio
4- Puertos de Entrada-Salida
4 PUERTOS DE ENTRADA-SALIDA
Los pines de E/S del PIC32 permiten monitorear y controlar otros dispositivos. La
mayoría de los pines del FPGA están multiplexados con otras funciones de periféricos
internos del PIC.
Por ejemplo el pin 6 del PIC32MX534F064H que se muestra en la Figura 4-1 es el
bit 8 del puerto G (RG8), pero ese mismo pin está multiplexado con la señal SCL de un
módulo I2C (SCL4), también está multiplexado con la señal SDO de un módulo SPI
(SDO2), y con otras señales más de módulos internos (U3TX, PMA3, CN10).
Es responsabilidad del programador usar el pin de puerto o usar una señal de
módulo interno sin que se interfieran.
Al reset todos los módulos internos están desactivados y los pines del PIC32MX
funcionan solo como señales de puertos de Entrada/Salida.
Cuando algún módulo interno se habilita y usa un pin de un puerto, el uso del pin
del puerto queda deshabilitado.
Figura 4-1. Algunos pines del PIC32MX534F064H
Ing. Juan Ramon Terven Salinas
36
4- Puertos de Entrada-Salida
Registros de Control
Antes de realizar una operación de lectura o escritura de algun puerto, los pines a
utilizar deben ser configurados apropiadamente.
Cada puerto tiene 4 registros asociados: TRIS, PORT, LAT y ODC; cada pin
de puerto tiene un bit correspondiente en cada uno de estos registros.
Los PIC32MX tienen los puertos llamados Puerto A, Puerto B, Puerto C, Puerto D,
Puerto E, Puerto F y Puerto G. Cada uno de estos puertos tiene los registros antes
mencionados. Por ejemplo para el Puerto A, los registros se llaman TRISA, PORTA,
LATA y ODCA.
En la siguiente explicación nos referiremos a TRISx, PORTx, LATx y ODCx,
donde “x” representa el puerto (A, B, C, D o E).
Registro TRISx
El registro TRISx se usa para configurar el sentido de datos del puerto, puede ser
Entrada (con “1”) o Salida (con “0”). Una manera recomendable de recordar esto es “1”
de “Input” y “0” de “Output”.
Registro PORTx
Por medio del registro PORTx se accede a los datos de los pines. Cuando se escribe
en PORTx, se escribe en el latch del puerto. Cuando se lee el PORTx, se lee el valor
directamente del pin.
Registro LATx
Este registro está directamente conectado con el latch del puerto. Cuando se escribe
en el LATx se escribe en el latch del puerto y cuando se lee el LATx se lee del latch del
puerto.
Ing. Juan Ramon Terven Salinas
37
4- Puertos de Entrada-Salida
Registro ODCx
Cada pin de puerto puede ser individualmente configurado para salida digital
normal o salida de drenaje-abierto. Esta configuración se realiza por medio del registro
ODCx. Si el bit del ODC para un pin está en ‘1’, entonces el pin actúa como salida de
drenaje abierto. Si el bit del ODC está en ‘0’ la salida digital es normal. Este uso sólo es
valido cuando el bit del puerto es salida.
La salida de tipo drenaje-abierto permite enviar voltajes mayores a VDD usando
una resistencia de pull-up externa. Tenga en cuenta que el voltaje máximo que se le
puede conectar por medio de la resistencia de Pull-up es de 5.5V.
La Figura 4-2 explica la diferencia de la salida digital normal y la salida de drenaje
abierto.
Figura 4-2. Salida Drenaje-abierto
Ing. Juan Ramon Terven Salinas
38
4- Puertos de Entrada-Salida
La Figura 4-3 muestra un diagrama a bloques de un puerto típico multiplexado.
Figura 4-3. Diagrama a bloques de un puerto típico multiplexado
El Problema de la escritura
Cuando se envía un dato de salida por un puerto, los PIC32 usan una secuencia
conocida como Read-Modify-Write (RMW). Esto puede causar comportamientos
inesperados bajo ciertas circunstancias.
Cuando un programa cambia el estado de un pin, por ejemplo RB0 del PORTB, el
microcontrolador realiza la siguiente secuencia:
1. LEE todos los bits del PORTB (lee los pines físicos).
2. Almacena este dato leído en un registro interno.
3. Modifica el bit deseado (RB0).
4. Escribe todos los bits de vuelta al registro PORTB.
Ing. Juan Ramon Terven Salinas
39
4- Puertos de Entrada-Salida
El problema de esto ocurre cuando el pin que se desea modificar (RB0) tiene una carga
que afecta el estado lógico. Por ejemplo un LED sin resistencia limitadora de corriente o
una carga con alta capacitancia o inductancia.
Por ejemplo si el programa es el siguiente:
_RB0 = 1;
_RB1 = 1;
Asumiendo que el puerto está inicialmente en 0 y que todos los pines son salidas.
Supongamos que conectamos un capacitor descargado en el pin RB0.
La primera línea _RB0=1 realiza lo siguiente:
Figura 4-4. Secuencia RMW en _RB0 = 1
La siguiente línea _RB1 = 1 realiza lo siguiente:
Ing. Juan Ramon Terven Salinas
40
4- Puertos de Entrada-Salida
Figura 4-5. Secuencia RMW para _RB1=1
Como resultado tenemos 00000010 en el puerto en lugar de 00000011.
Existen 2 soluciones a este problema:
SOLUCION 1: MODIFICAR TODO EL PUERTO
En lugar de modificar un solo bit, modificar todo el puerto.
Por ejemplo en lugar de escribir
_RB0 = 1;
_RB1 = 1;
Escribimos
PORTB = 0x3;
Sin embargo esta operación modifica todo el PORTB y tal vez los otros pines no se
desean cambiar.
Ing. Juan Ramon Terven Salinas
41
4- Puertos de Entrada-Salida
SOLUCIÓN 2: USAR LATx EN LUGAR DE PORTx
Si modificamos el bit 0 usando LATB en lugar de PORTB, se realiza la misma
secuencia (RMW) pero la lectura no la realiza de los pines físicos sino del registro
LATB.
Entonces en lugar de escribir
_RB0 = 1;
_RB1 = 1;
Escribimos
_LATB0 = 1;
_LATB1 = 1;
Y el problema queda resuelto. Con esto llegamos a la siguiente regla:
Regla del uso de puertos:
Cuando usemos un puerto x como entrada usamos PORTx y cuando usamos el
puerto como salida usamos LATx.
Ing. Juan Ramon Terven Salinas
42
4- Puertos de Entrada-Salida
Ejemplo 1. Uso de Puertos de Entrada/Salida
El siguiente ejemplo muestra el uso de los pines de entrada/salida para leer el estado
de interruptores (DSW1) y cambiar el estado de los LEDs. La Figura 4-6 muestra el
diagrama utilizado para este ejemplo. Para este circuito podemos usar solamente la
alimentación que nos proporciona el USB a través del cable y nos ahorramos usar una
fuente externa como muestra la figura.
Figura 4-6. Diagrama Electrónico para Ejemplo 1
Este programa realiza 3 rutinas en las salidas (RE0-RE7) en función del estado de las
entradas (RB0, RB1, RB4, RB5). Las rutinas son las siguientes:
Si la entrada RB0 tiene un ‘1’ parpadea los LEDs.
Ing. Juan Ramon Terven Salinas
43
4- Puertos de Entrada-Salida
Si la entrada RB1 tiene un ‘1’ muestra un contador ascendente en los LEDs.
Si la entrada RB4 y RB5 tienen “11” muestra un contador descendente en los LEDs.
El código de este ejemplo se muestra en el Programa 4-1.
Programa 4-1. Uso de pines E/S
#include <p32xxxx.h>
#include "../librerias/retardos/retardos.h"
//Bits de configuracion
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPLLMUL = MUL_20
#pragma config FPLLIDIV = DIV_2, FPLLODIV = DIV_1
#pragma config FPBDIV = DIV_1, FWDTEN = OFF, UPLLEN = ON
#pragma config UPLLIDIV = DIV_2, FVBUSONIO = ON, FUSBIDIO = ON
#pragma config FSOSCEN = OFF, CP = OFF, FCKSM = CSECMD
int main(void)
{
unsigned char contador;
AD1PCFG = 0xFFFF;
TRISB = 0x0033;
TRISE=0;
// configura AN pins como digitales
//bits 0, 1, 4 y 5 como entradas
// puerto E como salida
contador = 0;
while(1)
{
//Si RB0=1 parpadea LEDs
if(_RB0)
{
LATE = 0;
retardoms(100); // retardo de aproximadamente 100ms
LATE = 0xFF;
retardoms(100);
}
//de lo contrario si RB1=1
else if(_RB1)
{
LATE = contador;
contador++;
retardoms(100);
}
//de lo contrario si RB4 y RB5 = "11"
else if(_RB4 && _RB5)
{
LATE = contador;
contador--;
retardoms(100);
}
}
return 0;
}
Ing. Juan Ramon Terven Salinas
44
4- Puertos de Entrada-Salida
PRÁCTICA 1. Uso de Puertos de Entrada/Salida
a) Arme el circuito del ejemplo anterior mostrado en la Figura 4-6, grabe y
compruebe el funcionamiento del Ejemplo.
b) Crear un nuevo proyecto el cual realizará las 4 rutinas que se describen a
continuación, considerando las entradas en este orden RB5,RB4,RB1,RB0:
1. Si las entradas son “0001” realiza una rutina de rotación a la derecha de 1
sólo bit en los 8 bits de salida.
2. Si las entradas son “0010” realiza una rutina de rotación a la izquierda de
1 sólo bit en los 8 bits de salida.
3. Si las entradas son “0100” realiza una rutina de “ojo de kit” en los 8 bits
de salida.
4. Si las entradas son “1000” realiza un contador binario de 2 en 2,
iniciando en 0, en los 8 bits de salida.
5. Si las entradas son cualquier otra combinación, muestra los LEDs
apagados.
Toda rutina es independiente de las demás y debe continuar en el estado que se quedó,
por ejemplo si el contador se queda en 12 cuando el usuario cambia de rutina, si se
regresa de nuevo a la rutina contador, debe seguir contando a partir de 12.
Ing. Juan Ramon Terven Salinas
45
4- Puertos de Entrada-Salida
Interfaces Digitales de Distintos Voltajes
Los PIC32MX se pueden alimentar en un rango de 2.3V a 3.6V. Un voltaje común
de alimentación es 3.3V. Por lo tanto, si VDD es 3.3V, los pines son capaces de enviar
3.3V de salida y son capaces de recibir hasta 3.3V de entrada.
Cuando se conectan 2 dispositivos que operan a distintos voltajes, es necesario
conocer los valores de umbral de entrada y salida de cada uno. Una vez que se conocen
estos valores se puede seleccionar una técnica para realizar la conexión.
La Figura 4-7 muestra los niveles de umbral de salida (VOH, VOL) y de entrada (VIH,
VIL) que se deben de cumplir cuando hacemos una conexión de 2 dispositivos digitales.
Figura 4-7. Niveles lógicos y márgenes de ruido [16]
Conexión de 3.3V a 5V
Existen varias formas de realizar una conexión de 3.3V de salida digital a 5V de entrada
digital.
1. Forma Directa
Cuando queremos conectar una salida digital del PIC32 de 3.3V a una entrada digital de
5V, podemos realizar la conexión directa siempre y cuando se cumplan los siguientes
requerimientos:
Ing. Juan Ramon Terven Salinas
46
4- Puertos de Entrada-Salida
•
El VOH de la salida de 3.3V es mayor que el VIH de la entrada de 5V.
•
El VOL de la salida de 3.3V es menor que el VIL de la entrada de 5V.
La Tabla 4-1 muestra los niveles de VOH y VOL del PIC32MX534F064H.
Tabla 4-1. Características de DC: Especificaciones de salida de pin
2. Usando Salida de Drenaje Abierto
Si necesitamos enviar voltajes mayores a VDD por algún pin, ya vimos que
configurando dicho pin como salida de drenaje abierto (bit del ODC en ‘1’) y una
resistencia de pull-up conectada a una fuente separada de voltaje mayor (máximo 5.5V),
es posible enviar voltajes de 5 (como se muestra en la Figura 4-8).
Figura 4-8. Salida de drenaje abierto con pull-up
Ing. Juan Ramon Terven Salinas
47
4- Puertos de Entrada-Salida
3. Usando un transistor MOSFET
Para realizar una conexión de 3.3V a 5V o a mayor voltaje podemos usar un transistor
MOSFET como se muestra en la Figura 4-9.
Figura 4-9. Conexión de 3.3V a 5V con MOSFET
Para seleccionar el valor de R1 deben considerarse 2 parámetros; la velocidad de
conmutación de la señal a enviar y el consumo de corriente a través de R1.
Cuando se conmuta de ‘0’ a ‘1’, debemos considerar el tiempo que toma en subir el
voltaje debido a la constate de tiempo RC formada por R1 y la capacitancia de la entrada
de 5V (CIN), además de capacitancias parásitas formadas en la tablilla (CS).
La velocidad a la que puede conmutar la entrada (TSW) está dada por la fórmula:
[10]
Como las capacitancias son fijas, la única manera de permitir mayor velocidad de
conmutación es disminuyendo R1, sin embargo al hacer esto, aumenta la corriente de la
fuente de 5V a través de la resistencia y el chip de 5V o a través del MOSFET.
Ing. Juan Ramon Terven Salinas
48
4- Puertos de Entrada-Salida
Cuando se seleccione el MOSFET canal-N, escoja uno cuyo voltaje de umbral VGS sea
menor que el VOH del PIC32.
Existen otros métodos para realizar este tipo de conexiones, sin embargo estos 3 pueden
ayudarnos a resolver casi cualquier interface de 3.3V a 5V. Para ver más sobre trucos de
interfaces de diferentes voltajes vea la referencia [10] Microchip. 3V Tips ‘n Tricks.
DS41285a, Microchip Technology Inc. 2006.
Conexión de 5V a 3.3V
¿Que pasa si queremos conectar un sensor con interface de 5V al microcontrolador
que funciona a 3.3V? Al igual que las interfaces de 3.3V a 5V, existen diversas formas
de conectar dispositivos de salida de 5V con dispositivos de entrada de 3.3V.
1. Forma directa
Se puede realizar una conexión directa solo si los pines del microcontrolador son
tolerantes a 5V como se muestra en la Figura 4-10.
Figura 4-10. Conexión directa con pines tolerantes a 5V [10]
En la hoja de datos del PIC32 que queremos usar se muestra la configuración de
pines de cada encapsulado. En esta configuración podemos ver cuales pines son
tolerantes a entradas de 5V. La Figura 4-11 muestra el diagrama de pines del
Ing. Juan Ramon Terven Salinas
49
4- Puertos de Entrada-Salida
PIC32MX534F064H con encapsulado QFN-64. Observe en este diagrama que los pines
oscuros son tolerantes a 5V.
Nota: Tenga en consideración que si los pines NO son tolerantes a 5V se puede
dañar el chip si conectamos circuitos digitales de 5V.
Figura 4-11. Diagrama de Pines [9]
2. Interface con diodo
Se puede usar un diodo para aislar la señal de 5V del dispositivo de 3.3V como se
muestra en la Figura 4-12. El diodo no permite que pasen los 5V, por lo tanto se
requiere una resistencia (R1) a 3.3V para lograr el ‘1’ lógico. El ‘0’ lógico equivaldría
al voltaje del diodo; por esta razón se usan diodos Schottky ya que tienen un voltaje
Ing. Juan Ramon Terven Salinas
50
4- Puertos de Entrada-Salida
menor (tipicamente 0.2 V) el cual debe ser menor que VIL para que sea considerado
como ‘0’ lógico.
Figura 4-12. Interface con diodo [17]
La Tabla 4-2 tomada de la hoja de datos, muestra los niveles de voltaje VIL y VIH
del PIC32MX534F064H.
Tabla 4-2. Características de DC: Especificaciones de pines de entrada [9]
Ing. Juan Ramon Terven Salinas
51
4- Puertos de Entrada-Salida
3. Interface con transistor BJT
La Figura 4-13 muestra como usar un transistor 2N3904 para hacer una interface de 5V
a 3.3V. Como se puede ver se requiere una resistencia (R2) del lado de los 3.3V. Una
resistencia limitadora de corriente (R1) se usa del lado de 5V. Cuando el lado de 5V se
ponga en nivel alto, Q1 conducirá llevando la entrada de 3.3V a tierra. Cuando la salida
de 5V está en nivel bajo, Q1 no conduce y R2 sube el voltaje a 3.3V. Observe que esta
interface con transistor invierte la lógica de la señal. Sin embargo podemos compensar
por software esta inversión.
Figura 4-13. Interface de 5V a 3.3V con transistor BJT [17]
4. Interface con transistor FET
La Figura 4-14 muestra la misma interface usando un transistor FET, en lugar de un
BJT. En este arreglo R2 se sigue utilizando para subir el voltaje a 3.3V, sin embargo R1
se conecta a tierra para asegurar que Q1 está apagado cuando la salida de 5V esté
flotando (por ejemplo cuando el pin aun no se configura como salida).
Figura 4-14. Interface con transistor FET [17]
Ing. Juan Ramon Terven Salinas
52
4- Puertos de Entrada-Salida
Al igual que la interface con BJT, esta interface también invierte la lógica de la señal.
Sin por alguna razón no podemos invertir la señal por software para compensar,
podemos crear un buffer de 2 etapas para invertir otra vez dejando la lógica igual. La
Figura 4-15 muestra está interface de 2 etapas.
Figura 4-15. Interface con FET de 2 etapas [17]
5. Interface con Optoacoplador
La interface con optoacoplador funciona de manera similar a la realizada con transistor,
sin embargo provee aislamiento eléctrico entre los 2 dispositivos. Esta característica es
muy útil cuando se tiene ruido eléctrico presente en la señal.
La Figura 4-16 muestra la interfaz de 5V a 3.3V por medio de un optoacoplador 4N25.
Observe que si queremos un aislamiento eléctrico las tierras no deben ser comunes. Al
igual que las interfaces con transistor, la lógica de la señal se invierte.
Figura 4-16. Interface con optoacoplador [17]
Ing. Juan Ramon Terven Salinas
53
4- Puertos de Entrada-Salida
Otra ventaja de la interfaz con optoacoplador es que es posible prevenir que la señal se
invierta conectando la entrada del opto como se muestra en la Figura 4-17.
Figura 4-17. Interfaz con optoacoplador sin inversión de señal [17]
Los optoacopladores son muy útiles para realizar interfaces a dispositivos de mayor
voltaje, tales como 12V de sistemas automotrices o 24V en aplicaciones industriales.
6. Interfaz con Buffer
La Figura 4-18 muestra una interfaz con un buffer 74LVC244A, el cual es un buffer
octal, con 2 grupos de 4 puertos con habilitaciones separadas. Este chip provee un
buffer de salida de 3.3V y las entradas pueden aceptar entradas de 5V y 3.3V. Las
salidas son capaces de proporcionar 50mA y la alimentación está en el rango de 1.65V a
3.6V. La comunicación es unidireccional. Cuando un pin OE está en nivel alto, las
salidas son de alta impedancia, cuando el pin OE está en nivel bajo, el dato pasa de la
entrada A a la salida Y. Las entradas no utilizadas se conectan a tierra para reducir ruido
y consumo de potencia.
Figura 4-18. Interfaz con Buffer [17]
Ing. Juan Ramon Terven Salinas
54
4- Puertos de Entrada-Salida
7. Interfaz con traductor de voltaje
Una forma de realizar una interfaz bidireccional entre 2 dispositivos de voltajes
diferentes es usando un circuito traductor de voltaje. La Figura 4-19 muestra un
traductor TXB0108PW. Este chip usa 2 alimentaciones diferentes como se muestra en
la figura.
Figura 4-19. Interfaz con traductor de voltaje [17]
Ing. Juan Ramon Terven Salinas
55
4- Puertos de Entrada-Salida
Display de Cristal Líquido (LCD)
Nuestra primer interfaz de 3.3V - 5V será con un display LCD alfanumérico de
16x2. Las pantallas de cristal líquido o LCD (Liquid Crystal Display) alfanuméricas
permiten mostrar mensajes y con esto podemos dotar a nuestros circuitos de una interfaz
mas llamativa para el usuario.
Un LCD comúnmente usado debido a su bajo costo y disponibilidad es la pantalla
alfanumérica de 16 caracteres por 2 renglones mostrada en la Figura 4-20
Figura 4-20. Display 2x16
El funcionamiento de esta pantalla puede revisarlo en su hoja de datos o recomiendo el
libro Microcontrolador PIC16F84 Desarrollo de proyectos de Enrique Palacios para una
explicación en español mas detallada.
Para el uso de este LCD haremos uso de una librería llamada alpha_lcd modificada
para el uso del PIC32. El código de esta librería lo puede ver en el APÉNDICE B y la
puede descargar de la página de la materia.
En el archivo alpha_lcd.h de la librería puede modificar los pines del PIC32 que se
conectan con el LCD.
El Display LCD que usaremos se alimenta con 5V, por lo tanto su interfaz digital es de
5V, sin embargo el PIC32 lo alimentaremos con 3.3V. Entonces para poder saber que
tipo de interfaz usar, debemos analizar las características eléctricas del display. La Tabla
4-3 muestra dichas características del display JHD162A.
Para la interfaz de salida del PIC32 (de 3.3V a 5V); como podemos observar un nivel
lógico de entrada alto del LCD (VIH) está en el rango de 2.2 a VDD, entonces podemos
realizar la interfaz de manera directa, ya que el nivel de voltaje alto del PIC32 (VOH) es
mayor que el VIH del LCD.
Ing. Juan Ramon Terven Salinas
56
4- Puertos de Entrada-Salida
Tabla 4-3. Características Eléctricas del display JHD162A
Para la interfaz de entrada del PIC32 (de 5V a 3.3V) simplemente usaremos pines
tolerantes de 5V.
La Figura 4-21 muestra la interfaz de conexión del PIC32 con el display usando interfaz
directa con pines tolerantes a 5V.
Ing. Juan Ramon Terven Salinas
57
4- Puertos de Entrada-Salida
Ejemplo 2: Uso de Display LCD 16x2
El siguiente ejemplo demuestra el uso del LCD 16x2 con la librería alpha_lcd.
Este ejemplo simplemente muestra 2 mensajes en el display, como se muestra en la
figura.
Figura 4-21. Diagrama de conexión
Ing. Juan Ramon Terven Salinas
58
4- Puertos de Entrada-Salida
Programa 4-2. Uso de LCD 16x2
#include <p32xxxx.h>
#include "alpha_lcd.h"
//Bits de configuracion
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPLLMUL = MUL_20
#pragma config FPLLIDIV = DIV_2, FPLLODIV = DIV_1
#pragma config FPBDIV = DIV_1, FWDTEN = OFF, UPLLEN = ON
#pragma config UPLLIDIV = DIV_2, FVBUSONIO = ON, FUSBIDIO = ON
#pragma config FSOSCEN = OFF, CP = OFF, FCKSM = CSECMD
int main(void)
{
AD1PCFG = 0xFFFF;
// configura pines AN como digitales
// configura LCD
openLCD();
//Muestra cadena "Probando LCD"
putsLCD("Probando LCD");
//Cambia al renglon 2
setDDRamAddr(0x40);
//Muestra cadena en renglón 2
putsLCD("EN PIC32!!");
while(1)
{
}
return 0;
}
Ejemplo 3: Mostrar valores numéricos en LCD 16x2
Las funciones de la librería alpha_lcd sólo nos permiten mostrar caracteres y
cadenas de caracteres en el display, que el display LCD alfanumérico recibe códigos
ASCII y muestra el carácter asociado al código.
Si queremos mostrar el contenido de variables, como resultados de operaciones
matemáticas, primeramente necesitamos convertir el valor numérico a cadena para
luego mostrarlo en el display.
Para convertir un dato numérico a cadena podemos hacer uso de la función
sprintf de la librería stdio.h. La Figura 4-22 muestra la descripción de esta
función dada por el documento 32-bit Language Tools Libraries, el cual describe las
funciones que contiene el lenguaje C32.
Ing. Juan Ramon Terven Salinas
59
4- Puertos de Entrada-Salida
Figura 4-22. Función sprintf [11]
La función sprintf se usa de la siguiente manera:
Si queremos convertir el contenido de una variable short llamada num a una cadena
y almacenarla en strNum el procedimiento sería el siguiente:
short num;
char strNum[6];
//declaro mi variable short
//declaro mi cadena strNum de 6 bytes porque
//el número máximo contiene 6 bytes(“65535” + 0);
//asigno algún valor a la variable num
num = 100;
//Convierto a cadena el contenido de num
sprintf(strNum,”%d”,num);
//Muestro en LCD
putsLCD(strNum);
También podemos convertir variables del tipo flotante a cadena usando la función
sprintf, inclusive podemos decirle la cantidad de decimales que incluya en la cadena,
por ejemplo:
double num;
char strNum[16];
//declaro mi variable short
//declaro una cadena capaz de contener un número
// de 14 dígitos + punto decimal
//asigno algún valor a la variable num
num = 100.54321;
//Convierto a cadena el contenido de num con 5 decimales
sprintf(strNum,”%.5f”,num);
//Muestro en LCD
putsLCD(strNum);
Ing. Juan Ramon Terven Salinas
60
4- Puertos de Entrada-Salida
El siguiente programa muestra un contador en el display LCD usando el mismo
circuito del display mostrado anteriormente (Figura 4-21). Para hacer uso de la función
sprintf se necesita agregar la librería stdio.h.
Programa 4-3. Mostrar valores numéricos en Display
#include <p32xxxx.h>
#include <stdio.h>
#include "../../librerias/LCD/alpha_lcd.h"
#include "../../librerias/retardos/retardos.h"
//Bits de configuracion
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPLLMUL = MUL_20
#pragma config FPLLIDIV = DIV_2, FPLLODIV = DIV_1
#pragma config FPBDIV = DIV_1, FWDTEN = OFF, UPLLEN = ON
#pragma config UPLLIDIV = DIV_2, FVBUSONIO = ON, FUSBIDIO = ON
#pragma config FSOSCEN = OFF, CP = OFF, FCKSM = CSECMD
int main(void)
{
int num;
char strNum[6];
// configura pines AN como digitales
AD1PCFG = 0xFFFF;
// configura LCD
openLCD();
//Envía cadena "Numero en LCD"
putsLCD("Numeros en LCD");
num = 0;
while(1)
{
//se coloca en renglon 2
setDDRamAddr(0x40);
//convierte num a cadena en strNum
sprintf(strNum,"%d",num);
//muestra strNum en display
putsLCD(strNum);
//siguiente numero
num++;
//espera aprox 200ms
retardo1ms(200);
}
return 0;
}
Ing. Juan Ramon Terven Salinas
61
4- Puertos de Entrada-Salida
Librerías de C32
El lenguaje C32 provee una gran cantidad de funciones disponibles para ser usadas.
Estas funciones básicamente están separadas en 2 categorías: Librerías geneales y
Librerías para uso de periféricos.
Librerías Generales
En estas librerías encontramos las funciones estándar del lenguaje C, por ejemplo
stdio.h, stdlib.h, string.h, time.h, math.h, etc. También se tienen
librerías de procesamiento digital de señales (DSP) para realizar operaciones comunes
como multiplicaciones de vectores, filtros digitales y transformada de Fourier.
Para acceder al documento que detalla todas las Librerías generales, en el MPLAB
seleccione el menú Help->Topics… y dentro de este, seleccione C32 C Lib
Guide(PDF).
Librerías de Periféricos
Además de las librerias generales, el lenguaje C32 proporciona una gran variedad
de funciones para el manejo de periféricos del PIC32, por ejemplo: Interrupciones,
Timers, Modulos de comunicación serial, ADC, RTCC, etc.
Para acceder al documento que detalla todas las Librerías de Periféricos, en el
MPLAB seleccione el menú Help->Topics… y dentro de este, seleccione C32
Peripheral Lib Guide.
Ing. Juan Ramon Terven Salinas
62
4- Puertos de Entrada-Salida
Tipos de datos de C32
La Tabla 4-4 muestra los tipos de datos enteros que maneja el lenguaje C32.
Observe que el tipo de dato int es de 32 bits a diferencia de otras implementaciones
del lenguaje C.
Tabla 4-4. Tipos de datos enteros
La Tabla 4-5 muestra los tipos de datos de punto flotante que maneja el lenguaje
C32.
Tabla 4-5. Tipos de datos con punto flotante
El PIC32 no posee una unidad de punto flotante, de tal forma que todas las
operaciones de punto flotante son realizadas por software y no por hardware. Por esta
razón, las operaciones con punto flotante funcionan mucho más lento que las
operaciones con enteros.
Ing. Juan Ramon Terven Salinas
63
4- Puertos de Entrada-Salida
PRÁCTICA 2: Funciones Trigonométricas en LCD 16x2
Desarrolle un proyecto que muestra el seno y coseno en un display LCD
alfanumérico como se muestra en la Figura 4-23.
1. Mostrar en el renglón 1 el seno.
2. Mostrar en el renglón 2 el coseno.
3. Debe mostrar automáticamente el seno y coseno desde 0° hasta 359°, al
llegar a 360° el ángulo se regresa a 0°.
4. De un retardo de aproximadamente ¼ de segundo entre cada actualización
de la pantalla.
Nota: Existen funciones que calculan el seno y coseno de variables de punto
flotante en la librería de matemáticas. Consulte las librerías generales.
Figura 4-23. Diagrama de Práctica
Ing. Juan Ramon Terven Salinas
64
Descargar