Como ya se ha avanzado anteriormente, MCC es una aplicación que se ejecuta sobre MPLAB® Xpress IDE y que permite, gracias a su interfaz gráfica, generar los archivos para la configuración del microcontrolador de forma rápida, sencilla y transparente a los entresijos de funcionamiento del microcontrolador. Es decir, nos libera en gran medida de la ardua y a veces tediosa tarea de revisar la extensa —varios cientos de páginas— documentación o datasheet del microcontrolador. Con MCC, esta labor es sustituida por varios clics de ratón, lo que acelera así enormemente la tarea del programador.
Es importante remarcar que MCC ayuda de forma considerable al programador en las tareas de configuración del microcontrolador, pero muchas veces será necesario echar mano del datasheet para conocer su configuración, así como sus posibles modos de funcionamiento. Por lo tanto, MCC debe ser tomado como un complemento de ayuda a la configuración del microcontrolador y su ayuda será tanto mayor cuanto mejor conozcamos el funcionamiento del microcontrolador en cuestión. Así pues, MCC nos ayudará a dar nuestros primeros pasos en la configuración del microcontrolador cuando todavía no conozcamos a fondo su funcionamiento, pues nos permitirá configurar de forma sencilla los módulos que vayamos a usar. Sin embargo, será mucho más útil cuanto más conozcamos el dispositivo con el que vamos a trabajar.
Para acceder a esta herramienta, podremos hacerlo a través del acceso directo que se nos ha creado en el escritorio al ejecutar el archivo descargado en el paso descrito en la Figura 2.2, desde el menú Tools/Embedded/Mplab Xpress Code ConFigurator (que nos llevará de nuevo a repetir los pasos de descarga y ejecución del programa), o bien desde el icono MCC de la aplicación. En la Figura 3.1 podemos ver la ventana de configuración de MCC, con la que nos tendremos que familiarizar para sacarle el máximo partido.
Aunque al principio parezca un poco abrumador, MCC nos muestra varias ventanas a través de las cuales podemos ir estableciendo la configuración del microcontrolador. A continuación, vamos a describir de forma genérica la función de cada una de las ventanas que aparecen en la Figura 3.1.
Figura 3.1 Ventana de configuración de MCC.
• Barra superior
Situada en la parte superior de la ventana. Nos permite identificar el microcontrolador con el que estamos trabajando, además de deshacer/ rehacer/guardar cambios, entre otras cosas.
• Project Resources
Situada en la parte superior izquierda. En esta ventana aparecen los recursos del sistema que estamos utilizando. Por defecto nos aparecerán las opciones de configuración de interrupciones (Interrupt Module), puertos I/O (Pin Module) y modo de funcionamiento del sistema (System Module) para la selección de los ajustes de las palabras de configuración y del reloj. Además, en esta ventana se encuentran los botones para generar el código de configuración necesario e incluirlo en nuestro proyecto (Generate) o importar la configuración de nuestro proyecto (Import).
• Device Resources
Situada en la parte central izquierda. En esta ventana aparecen los recursos/periféricos del sistema que tenemos disponibles. Estos recursos los podremos ir añadiendo a los recursos de nuestro proyecto (Project Resources) haciendo doble clic en cada uno de ellos.
• Versions
Situada en la parte inferior izquierda. Nos muestra la versión de MCC que estamos utilizando y nos permite añadir las librerías asociadas a las funcionalidades de los diferentes periféricos.
• Ventanas de configuración
Situadas en la parte central y derecha. Nos permiten seleccionar el modo de funcionamiento del recurso que tengamos marcado en la ventana Project Resources y visualizar qué pines estamos utilizando con cada uno de los recursos en cada momento (Pin Manager: Grid View), las notificaciones o advertencias de MCC respecto a la configuración o los avisos de salida sobre la generación del código de configuración.
La utilización de MCC y la configuración de cada uno de los recursos se irá revisando de forma gradual en los ejemplos que se desarrollarán más adelante. Así, ahora nos quedaremos simplemente con que serán los recursos de la ventana Project Resources los que nos permitan visualizar los módulos con los que vamos a interactuar y los que tengamos que ajustar a través de las ventanas de configuración para generar el código necesario para la inicialización del sistema.
El entorno de programación MPLAB® Xpress IDE es compatible con diferentes tipos de hardware, como el debugger/programador PICkit 3 orientado a proyectos con hardware personalizado, las placas de desarrollo con la función de debugger como la Explorer o la Curiosity para sistemas MCU de 16/32 bits y 8 bits respectivamente, y las placas de evaluación de bajo coste (unos 10 €), sin la opción de debugger y orientadas hacia microcontroladores de 8 bits, como la que utilizaremos a lo largo de los ejemplos que aparecen en este libro. Entre estas últimas nos encontramos con diferentes modelos, como la DM164140, que es la que utilizaremos en este libro, pensada para aplicaciones de propósito general; la DM164141, orientada hacia aplicaciones de bajo consumo; la DM164142, que satisface aplicaciones de propósito general con requerimientos más elevados; o la DM164143, pensada para aplicaciones de bajo coste. Las distintas funcionalidades vienen definidas principalmente por el modelo de microcontrolador que lleva integrado cada una de las tarjetas.
La placa de desarrollo DM164140 es una placa de evaluación que, a pesar de no incluir la opción de debugger, nos permitirá desarrollar multitud de aplicaciones. Muchas de estas aplicaciones las podremos probar utilizando los diferentes módulos hardware que integra la misma tarjeta o conectando módulos externos, bien a través de su conector mikroBUS compatible con los módulos click de MikroElektronica®, bien mediante los terminales situados a ambos lados de la tarjeta, que están conectados con los pines del microcontrolador, tal y como se observa en la Figura 4.1.
Figura 4.1 Tarjeta de evaluación DM164140.
A través de los módulos hardware, que incorporan la tarjeta de evaluación, y sus conexiones con el microcontrolador, será posible explorar muchas de las funcionalidades y los modos de funcionamiento de los periféricos. Las conexiones de estos módulos con el microcontrolador se muestran en la Figura 4.2. Entre ellas, podemos observar las conexiones con el conector microBUS , cuatro ledes rojos conectados a los terminales RA0-RA3, un pulsador conectado al terminal RA5, un potenciómetro conectado al terminal RA4, un sensor de temperatura digital (EMC1001) conectado a los terminales RC3/SCL y RC4/SDA del puerto de comunicaciones I2C y las conexiones con el microcontrolador PIC18LF25K50 a través de los terminales RB6/CLK, RB7/DAT y RE2/MCLR (función de programador) y los terminales RC0/TX y RC1/RX (puente para la utilización del puerto de comunicaciones UART), que permitirán la comunicación del microcontrolador con nuestro ordenador mediante la utilización de un emulador de terminal.
Figura 4.2 Conexiones del microcontrolador PIC16F18855 con los módulos hardware.
Tal y como se indicó anteriormente, la tarjeta DM164140 está pensada para el desarrollo de aplicaciones de propósito general. Esta funcionalidad está principalmente dictada por la utilización del microcontrolador PIC16F18855, cuyas características principales y periféricos se describirán en el siguiente apartado. Sin embargo, esta tarjeta no incluye la función de debugger, por lo que no será posible realizar la ejecución de nuestros programas paso a paso para depurar el código y corregir los posibles bugs. A pesar de no contar con la función de debugger, y de forma similar a lo que ocurre con las placas Arduino®, es posible realizar la comunicación entre el microcontrolador y el ordenador utilizando como puente entre ellos el microcontrolador PIC18LF25K50 que se encuentra en la placa, según se muestra en la Figura 4.3. De esta forma, podremos visualizar a través de la pantalla del terminal los mensajes que nos envíe el microcontrolador durante la ejecución del programa y, a través de estos mensajes, podremos obtener la información necesaria para establecer o no la correcta ejecución de este.
Figura 4.3 Conexión entre la placa DM164140 y el ordenador.
Para ello será necesario contar en nuestro ordenador con un emulador de terminal, como Hercules, Teraterm, Coolterm (este último será el que utilicemos en los ejemplos) o cualquier otro similar que nos descarguemos de Internet. Este modo de funcionamiento requiere la instalación de unos drivers adicionales que habiliten este tipo de comunicación a través del puerto USB. La instalación de estos drivers se realiza generalmente de forma automática al conectar el dispositivo, pero hay casos en los que no es así. La solución en estos casos, a pesar de no ser demasiado complicada, no es trivial, por lo que a continuación describiré paso a paso el proceso de instalación manual para aquellos a quienes no se les haya instalado de forma automática.
Instalación de los drivers USB Communication Device Class (CDC drivers)
• Descargaremos los drivers CDC de la página web de Microchip y los extraeremos en una carpeta en nuestro ordenador.
http://ww1.microchip.com/downloads/en/SoftwareLibrary/inf%20-%20Composite%20Device.zip
• Conectaremos la placa DM164140 al ordenador.
• Accederemos al administrador de dispositivos en nuestro ordenador desde el panel de control, o bien haciendo clic con el botón derecho en Equipo y luego en Propiedades.
• En Administrador de dispositivos buscaremos en el desplegable Otros dispositivos y haremos clic con el botón derecho en el dispositivo que cuelga de esta rama, seleccionando la opción Actualizar software de controlador.
• A continuación, seleccionaremos la opción Buscar software de controlador en el equipo y elegiremos Seleccionar de una lista de controladores en el equipo.
• En la siguiente ventana, elegiremos Utilizar disco y buscaremos la carpeta donde hemos extraído los drivers para seleccionar el archivo “.inf” que allí se encuentra.
• Pulsaremos finalmente Aceptar para finalizar la instalación del controlador y comprobaremos que ahora en el administrador de dispositivos nos aparezca el nuevo puerto de comunicaciones, que será el que utilice el terminal para recibir la información de nuestro microcontrolador (Figura 4.4).
Figura 4.4 Configuración del puerto de comunicación serie.
Una vez configurado el dispositivo para la transmisión de datos al ordenador a través de la comunicación serie, será importante tener en cuenta que la realización de cada nueva programación del microcontrolador requerirá pulsar el botón Reset de la placa para iniciar la transferencia del archivo al dispositivo.
Una vez descrito de forma más o menos detallada el entorno software y hardware en el que nos vamos a mover, es necesario presentar al actor principal: el núcleo donde se desarrollará la acción —o, lo que es lo mismo, el microcontrolador con el que trabajaremos en los ejemplos de programación del apartado 6—. Se trata en este caso de un microcontrolador PIC® que pertenece a la gama media mejorada dentro de la familia de microcontroladores de 8 bits. Más concretamente, nos referimos al microcontrolador de 28 pines PIC16F18855, que se ha mostrado ya anteriormente en las Figuras 5 y 7. Este microcontrolador cuenta con una arquitectura RISC (Reduced Instruction Set Code), al igual que los de su familia, optimizada para la compilación en C que dispone de tan solo 49 instrucciones de 14 bits. Integra un reloj interno configurable que puede llegar hasta 32 MHz, que le permite ejecutar una instrucción en un tiempo mínimo de 125 ns. Permite la generación de interrupciones con hasta 16 niveles de profundidad y cuenta con una memoria de programa de 14 KB, una memoria de datos de 1 KB y memoria EEPROM interna de 256 bytes. Además, está constituido por multitud de periféricos con características mejoradas, que permiten aprovechar mejor los ciclos de funcionamiento de la CPU. Son lo que se conoce como CIP (Core Independent Peripherals).
En particular, el microcontrolador PIC16F18855 cuenta con 25 puertos de entrada/salida digitales, 24 terminales configurables como entradas analógicas, un terminal configurable como salida analógica, dos comparadores analógicos, siete temporizadores (tres temporizadores de 8 bits y cuatro de 16 bits), cinco módulos de captura y comparación y modulación de anchura de pulsos, dos modulos PWM (Pulse Width Modulation) con resolución de 10 bits, un módulo detector de cruce por cero, tres módulos generadores de ondas (Complementary Waveform Generator), cuatro celdas lógicas configurables (CLC), un módulo modulador de señal digital (DSM), módulos de comunicaciones USART, SPI e I2C y el nada desdeñable módulo de selección de pines para los periféricos (Peripheral Pin Select). Este último nos permite elegir el terminal del microcontrolador que vamos a asociar con cada uno de los módulos anteriores, lo cual otorga gran versatilidad a los diseños que realicemos, además de una mayor flexibilidad a la hora de diseñar los circuitos y conectar el microcontrolador con los componentes electrónicos con los que tiene que actuar. Aparte de las características anteriores —por si todo ello aún no fuese suficiente—, el microcontrolador también integra funcionalidades avanzadas para reducir el consumo de energía y gestionar los posibles errores de funcionamiento.
La revisión exhaustiva de todas y cada una de las funcionalidades del microcontrolador se escapa de objetivo buscado en este libro, dado el gran número de módulos y funcionalidades que lo integran. Además, todo ello está ampliamente documentado en la hoja de especificaciones del integrado que proporciona Microchip (casi 700 páginas), que puede descargarse de forma gratuita en su página web. En los siguientes capítulos se utilizarán casos prácticos que irán describiendo de forma paulatina la configuración y el funcionamiento de los módulos más interesantes del microcontrolador conforme los vayamos utilizando en cada ejemplo.
Tal y como se ha indicado en la introducción, el objetivo que se persigue en este libro es el de guiar al lector en el aprendizaje de la programación y configuración de sistemas microcontroladores mediante la utilización de ejemplos prácticos que irán acompañados de propuestas para su modificación.
Vamos a comenzar con un sencillo ejemplo con el que empezaremos a familiarizarnos con las funciones más básicas y sencillas, aunque no por ello menos importantes, que podemos realizar con nuestro microcontrolador. Me estoy refiriendo a la gestión de entradas/salidas digitales; se pueden llegar a gestionar hasta 25.
Para ello, vamos a realizar un sencillo ejercicio que consistirá en encender y apagar un led conectado a RA0 cada vez que actuemos sobre el pulsador conectado a RA5 (ver Figura 4.2).
Pulsuz fraqment bitdi.