Aquí se presenta un tutorial del compilador XC8 que pretende proporcionar los conocimientos básicos para comenzar a desarrollar con el mismo, para ello daremos una introducción de cómo es un microcontrolador PIC y su funcionamiento, los lenguajes de programación y la ventaja de usar C, como crear un proyecto, la estructura de un programa en C y lo necesario para ir creando ejemplos. Espero sea de utilidad
Licencia
La misma se expresa al pie de cada articulo.
Indice
- Introducción al microcontrolador
- El lenguaje de programación
- Comenzando a desarrollar en C
- Nuestro primer proyecto en un PIC18F4550 y XC8
- Operadores, variables y estructura for
- Estructura if y arreglos de variables
Introducción al microcontrolador
Un microcontrolador es un dispositivo electrónico capaz de ejecutar una secuencia de comandos previamente programados. Estos comandos son proyectados por el usuario utilizando algún lenguaje de programación y luego grabados en la memoria del microcontrolador.
Los microcontroladores PIC de gama baja poseen arquitectura Harvard, esto quiere decir que utilizan dos memorias distintas, una para almacenar las instrucciones y otra para manejar los datos. Entonces está compuesto principalmente por un procesador (CPU), memoria RAM, memoria ROM y buses de comunicaciones (cada tipo de memoria tiene un bus de datos, uno de direcciones y uno de control). Adicionalmente también dispone de puertos de entrada y salida, y diversos periféricos que nos facilitan el desarrollo tales como osciladores, temporizadores/contadores, módulos de comunicación serial y paralela, comparadores analógicos, conversores analógicos a digital, memoria eeprom, etc.
Pero vayamos por partes, así entenderemos como es su funcionamiento, igualmente cabe aclarar que seremos concisos, sin describir profundamente.
La memoria ROM es del tipo no volátil, esto significa que los datos almacenados no se pierden aunque no esté energizada. Se destina principalmente a contener la lista de instrucciones que conforman la aplicación, por ello suele llamarse memoria de programa y en microcontroladores de la actualidad ronda desde los 512 bytes a 128 kbytes, correspondientes a los de gama baja de Microchip. Son del tipo Flash, de bajo consumo, que se pueden escribir y leer, y de gran densidad de almacenamiento. Además tienen la ventaja que permiten ser reprogramadas en circuito, sin necesidad de extraer el circuito integrado de la tarjeta.
La memoria RAM, memoria volátil, es la destinada a guardar las variables y datos temporales que serán utilizados por el procesador para realizar cálculos u otro tipo de operaciones lógicas. El espacio de direcciones de memoria RAM se divide en dos sectores: registros de propósito general (GPR), espacio destinado para crear variables por el usuario y variables propias del compilador; y registros de funciones especiales (SFR), espacio que contiene bits de configuración y control de los periféricos del microcontrolador. En la actualidad se pueden encontrar microcontroladores con memoria RAM de unos 32 bytes hasta 4 kbytes.
Un registro es una pequeña porción de la memoria y su tamaño se mide generalmente en bits (8-bits, 16-bits, 32-bits). Está representado por un numero que denominamos dirección de memoria, pero dentro del lenguaje de programación existe la posibilidad de asignarle un nombre, de esta manera es más sencillo de manejar.
El CPU o unidad central de procesamiento es el encargado de direccionar la memoria ROM, decodificar la instrucción y ejecutar la operación que implica. El primer paso es leer la instrucción de la memoria, la posición es controlada por un contador de programa (PC) que almacena un número que identifica la posición actual a ejecutar. La instrucción que el CPU lee desde la memoria es usada para determinar qué operación debe hacer el CPU, en este paso hay una decodificación, en donde la instrucción es dividida en partes que tienen significado para otras unidades del CPU. Después de los pasos de lectura y decodificación, es llevado a cabo el paso de la ejecución de la instrucción. Durante este paso, varias unidades del CPU son conectadas de tal manera que ellas pueden realizar la operación deseada. Si, por ejemplo, una operación de adición fue solicitada, una unidad aritmético lógica (ALU) será conectada a un conjunto de entradas (números a ser sumados) y un conjunto de salidas (suma). Luego el paso final, simplemente la obtención del resultado, escribiéndolo en un registro interno del CPU de acceso rápido, modificando un registro de la memoria RAM o modificando el contador de programa para generar saltos o bucles, etc.
La siguiente animación intenta dar a comprender como es el funcionamiento, pero tener en cuenta que es muy genérica:
Actualmente existen 3 tipos de arquitectura:
CISC (Computadores de juego de instrucciones complejo): Disponen de un conjunto amplio de instrucciones donde muchas de ellas son complejas, permitiendo realizar operaciones sofisticadas y potentes, pero que ocupan varios ciclos.
RISC (Computadores de juego de instrucciones reducido): En este caso el repertorio de instrucciones mínimo y muy sencillo, y generalmente ocupa entre 1 o 2 ciclos. La ventaja de éstos es que la sencillez y rapidez de las instrucciones permiten optimizar el hardware y el software del procesador.
SISC (Computadores de juego de instrucciones específicos): Se utiliza para microcontroladores destinados a aplicaciones concretas, donde el set de instrucciones es reducido y específico para las tareas a desarrollar, adaptándose a las necesidades de la aplicación prevista.
Los microcontroladores de gama baja de Microchip se basan en la arquitectura RISC, con 35 instrucciones para los 16F y 75 instrucciones para los 18F, en este último caso parecen muchas pero son simples y que ocupan pocos ciclos.
El PIC18F4550
Ahora tenemos un conocimiento general de que compone un microcontrolador y como es su funcionamiento, así que pasaremos a uno puntual. En este tutorial nos basaremos en el microcontrolador PIC18F4550 de la familia PIC18 de Microchip que tiene las siguientes características básicas:
- Arquitectura RISC avanzada Harvard de 16-bits con 8-bits de datos.
- Máxima frecuencia de operación 48 MHz, 12 MIPS.
- Memoria de programa de 32 kBytes.
- Memoria RAM de 2 kBytes.
- Memoria EEPROM de 256 Bytes.
- Multiplicador por hardware de 8×8
- Pila de 32 niveles.
- 2 niveles de prioridad para las interrupciones.
- 20 fuentes de interrupción.
- 4 temporizadores.
- 2 comparadores analógicos.
- 13 canales de conversión analógica.
- Comunicación UART, SPI, I2C, USB.
- PLL y oscilador interno de 8 MHz.
En el mismo datasheet podemos encontrar el siguiente diagrama de bloques de su estructura interna:
Su memoria de programa de de 32768 bytes, pero las instrucciones ocupan 2 bytes (excepto call, goto, movff, lsfr que ocupan 4), por lo que se pueden almacenar hasta 16384 instrucciones como máximo. Las direcciones especiales son 0×00 que corresponde al reset del microcontrolador, 0×08 correspondiente a la interrupción de alta prioridad y 0×18 correspondiente a la interrupción de baja prioridad. Las prioridades de interrupciones pueden no habilitarse y comportarse como un PIC16F, o habilitarse y cada fuente de interrupción (excepto la interrupción externa por RB0, solo es de alta prioridad) tiene un bit que la configura como de alta prioridad o baja prioridad.
La memoria RAM es de 2048 bytes, 8 bancos de 256 bytes donde 4 de ellos son utilizados por el módulo USB en caso de utilizarlo. Además se tiene 160 bytes dedicados a los registros de funciones especiales utilizados para la configuración de los módulos del microcontrolador.
Físicamente es un dispositivo de 40/44 pines donde, excepto los de alimentación, los pines tienen varias funciones según como se lo configure. Se puede encontrar con los package TQFP, QFN o DIP. Este último, el más utilizado para el aprendizaje y los hobbystas, tiene el siguiente pinout:
Hay mucho más por agregar respecto a este microcontrolador, pero no es la intensión de este tutorial, para profundizar más es recomendable leer el datasheet.
Continuará…






