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