Introduccion-a-la-programacion-d... Alex_oo Electrónica Digital y Microcontroladores 3º Grado en Ingeniería en Electrónica y Automática Industrial Escuela de Ingeniería Industrial Universidad de Vigo Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 U NIVERSIDADE DE V IGO, E SCOLA DE E NXEÑARÍA I NDUSTRIAL Introducción a la Programación de Embebidos a través del PIC18F47Q10 Alejandro García Peña 19 de mayo de 2025 Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Í NDICE 1. Breve Introducción a los Microcontroladores 3 1.1. La Importancia de los Microcontroladores en la Industria y la Vida Cotidiana . . 1.2. Conceptos Básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. Características de los Microcontroladores . . . . . . . . . . . . . . . . . . . . . . . 1.3.1. Recursos de Entrada/Salida y Tamaño . . . . . . . . . . . . . . . . . . . . . . 1.3.2. Capacidad de Comunicación . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.3. Disponibilidad de Versiones . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.4. Otros Factores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4. Componentes Elementales de un Microcontrolador . . . . . . . . . . . . . . . . . 1.4.1. CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.2. Memorias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.3. Bloques de Entrada/Salida (E/S) . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.4. Bloque de Temporizadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.5. Gestor de Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.6. Circuitos de Vigilancia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.7. Inicialización de Funcionamiento (Reset) . . . . . . . . . . . . . . . . . . . 1.5. Tipos de Arquitecturas de los Microcontroladores . . . . . . . . . . . . . . . . . . . 1.5.1. Atendiendo a la Conexión de la Memoria . . . . . . . . . . . . . . . . . . . . 1.5.2. Atendiendo al Juego de Instrucciones . . . . . . . . . . . . . . . . . . . . . . 2. Estructura de los Microcontroladores PIC (PIC18F47Q10) 9 2.1. Características Generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Unidad Aritmético-Lógica (ALU) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3. Unidad de Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4. Memoria de Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5. Memoria de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6. Periféricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.7. Otros Aspectos Relevantes del PIC18F47Q10 . . . . . . . . . . . . . . . . . . . . . . 2.7.1. Reset del Microcontrolador . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.7.2. Gestión de Subrutinas: Memoria PILA . . . . . . . . . . . . . . . . . . . . . . 2.7.3. Gestión de Look-up Tables en la Memoria de Programa . . . . . . . . . . . 3. Entradas y Salidas en Paralelo 9 11 11 12 13 13 14 14 14 15 15 3.1. Conceptos Básicos de las E/S Paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Estructura de E/S en el PIC18F47Q10 . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1. Salida con Drenador Abierto (ODCONx) . . . . . . . . . . . . . . . . . . . . 3.2.2. Control del Slew-rate (SLRCONx) . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.3. Control del Umbral Lógico (INLVLx) . . . . . . . . . . . . . . . . . . . . . . . 3.2.4. Resistencia de Carga (WPUx) . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3. Interrupt-on-Change: Detección de Cambios de Estado Lógico . . . . . . . . . . . 3.4. Asignación de Terminales a Periféricos (PPS) . . . . . . . . . . . . . . . . . . . . . . 3.5. Ejemplos de Conexión de Periféricos . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.1. Conexión de un Interruptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6. Conexión de un LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7. Cargas DC y Aislamiento Galvánico . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. Temporizadores 15 16 17 17 17 17 17 18 18 18 19 19 19 4.1. Consulta Periódica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2025 3 3 3 3 4 4 4 5 5 6 6 6 7 7 7 8 8 8 1 19 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 4.2. La Necesidad de Temporización y su Realización . . . . . . . . . . . . . . . . . . . 4.2.1. Temporización por Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2. Temporización por Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3. Estructura Básica de un Temporizador . . . . . . . . . . . . . . . . . . . . . . . . . 4.4. Temporizadores/Contadores del PIC18F47Q10 . . . . . . . . . . . . . . . . . . . . 4.4.1. Temporizador Polivalente: TMR0 . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.2. Temporizadores por Rebosamiento: TMR1, TMR3 y TMR5 . . . . . . . . . 4.4.3. Temporizadores por Comparación: TMR2, TMR4 y TMR6 . . . . . . . . . . 5. Interrupciones 24 5.1. Concepto de Excepción e Interrupción . . . . . . . . . . . . . . . . . . . . . . . . . 5.2. Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1. Identificación de la Fuente de Interrupción . . . . . . . . . . . . . . . . . . 5.2.2. Prioridad de las Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.3. Inhibición de Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.4. Borrado de las Peticiones de Interrupción . . . . . . . . . . . . . . . . . . . 5.3. Gestión de las Interrupciones en el PIC18F47Q10 . . . . . . . . . . . . . . . . . . . 5.3.1. Fuentes de Interrupción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.2. Interrupt-on-Change . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.3. Registros Asociados a la Gestión de Interrupciones . . . . . . . . . . . . . . 6. Entradas y Salidas Analógicas 24 24 25 25 25 25 25 25 26 26 27 6.1. Gestión de Señales Analógicas en el PIC18F47Q10 . . . . . . . . . . . . . . . . . . . 6.1.1. Convertidor ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.2. Convertidor DAC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.3. Módulos de Comparación Analógica . . . . . . . . . . . . . . . . . . . . . . 6.1.4. Sensor de Temperatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2. Convertidor Analógico-Digital del PIC18F47Q10 . . . . . . . . . . . . . . . . . . . . 6.2.1. Terminales de Entrada Analógica . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.2. Tensión de Referencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.3. Reloj de Conversión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.4. Inicio y Fin de Conversión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.5. Formato de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3. Secuencia de Operaciones del ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.1. Configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.2. Inicio de Conversión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.3. Fin de Conversión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A. Juego de Instrucciones del PIC18F47Q10 B. Modos de Direccionamiento de un microcontrolador 32 33 40 B.1. Modos de Direccionamiento del PIC18F47Q10 . . . . . . . . . . . . . . . . . . . . . B.2. Códigos de Carga o Transferencia en Memoria para Tablas . . . . . . . . . . . . . 2 27 27 27 27 28 28 29 29 29 29 30 30 30 30 31 32 A.1. Lenguaje Ensamblador pic-as (XC8) . . . . . . . . . . . . . . . . . . . . . . . . . . . A.2. Instrucciones del PIC18F47Q10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2025 19 20 20 20 20 20 21 22 41 42 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 1. B REVE I NTRODUCCIÓN A LOS M ICROCONTROLADORES 1.1. La Importancia de los Microcontroladores en la Industria y la Vida Cotidiana Partamos de la premisa de que si está leyendo este documento en un soporte digital, al menos un par de microcontroladores están haciendo posible dicha lectura. Y si lo está leyendo en formato impreso, la impresora que lo plasmó sobre el papel contenía uno o varios microcontroladores, al igual que el ordenador en el que fue redactado. Los microcontroladores son circuitos integrados especialmente diseñados para aplicaciones de control de procesos. Por ello, tienen una presencia masiva en industrias y dispositivos de todo tipo: automoción, informática, telefonía y comunicaciones, maquinaria y herramientas, electrodomésticos, sector sanitario, instrumentación. . . Su versatilidad, unida al progresivo abaratamiento de su coste, ha permitido su adopción incluso en aplicaciones que tradicionalmente se resolvían mediante electrónica analógica o lógica discreta, superando en ocasiones con creces las necesidades funcionales de dichas aplicaciones, pero siendo igualmente empleados. Por todo esto, el conocimiento de las distintas tecnologías disponibles y de su uso -al menos en un nivel elemental- resulta esencial para cualquier ingeniero electrónico. 1.2. Conceptos Básicos Se define un computador como un sistema electrónico digital capaz de ejecutar un programa informático, es decir, una secuencia de instrucciones que especifica un conjunto de operaciones. De este modo, un mismo sistema con hardware fijo puede realizar distintas funciones según el software que se le proporcione. Todo computador presenta una serie de elementos comunes, entre los cuales destaca el procesador secuencial, encargado del procesamiento de datos siguiendo las órdenes definidas por la máquina de estados (FSM) que constituye la unidad de control. Esta unidad recibe las instrucciones desde la memoria de programa. El conjunto formado por la unidad de control y la unidad aritmético-lógica (ALU) constituye la unidad central de proceso (CPU), la cual emplea tanto la memoria de programa como la memoria de datos para llevar a cabo las funciones definidas. A su vez, la CPU interactúa con el entorno mediante interfaces de entrada y salida. Se denomina microcomputador al computador cuya unidad de control se basa en un microprocesador, compuesto por una CPU, una memoria y un sistema de gestión de entradas y salidas que permite la conexión con periféricos. Este tipo de sistema presenta sus bloques funcionales interconectados a través de un bus de direcciones (AB) de m bits (por ejemplo, 8, 16, 32. . . ) y un bus de datos (DB) de n bits (8, 16, 32. . . ). Cuando el microcomputador se integra completamente en un único encapsulado, se denomina microcomputador integrado. Si este sistema está específicamente diseñado para aplicaciones de control de procesos, recibe el nombre de microcontrolador. 1.3. Características de los Microcontroladores 1.3.1. Recursos de Entrada/Salida y Tamaño Todos los microcontroladores cuentan con una serie de entradas y salidas, tanto digitales como analógicas, así como con la capacidad de detectar eventos relacionados con ellas (interrupciones). Estas E/S constituyen el principal medio de comunicación del microcontrolador con el exterior. 2025 3 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Además, es común que un mismo terminal de un microcontrolador pueda desempeñar varias funciones, configurables por software. Esta multifuncionalidad contribuye a la reducción del tamaño físico del sistema, permitiendo soluciones más compactas. 1.3.2. Capacidad de Comunicación En muchas aplicaciones, los algoritmos de control requeridos son demasiado complejos para ser implementados en un único microcontrolador, ya sea por limitaciones de hardware o por la complejidad del código. Por ello, es habitual segmentar un sistema en varios microcontroladores, cada uno encargado de determinadas funciones pero interconectados entre sí. Las capacidades de comunicación se vuelven, por tanto, esenciales para el establecimiento de sistemas de control distribuidos. 1.3.3. Disponibilidad de Versiones Los principales fabricantes ofrecen familias de microcontroladores que, aunque comparten aspectos como el empaquetado, el entorno de programación o los sistemas de depuración, difieren en características específicas como la capacidad de memoria, la velocidad de operación o la disponibilidad de determinados periféricos. Esta diversidad permite elegir el dispositivo más adecuado en función de los requisitos concretos de cada aplicación. 1.3.4. Otros Factores Factores como la seguridad operativa -a través de mecanismos de vigilancia y detección de errores- y la protección de la propiedad intelectual -mediante técnicas como la protección contra lectura del código de programa o los sistemas OTP (One-Time Programmable)- son clave a nivel industrial a la hora de seleccionar un microcontrolador. Otro aspecto importante, dependiendo de la aplicación, es el consumo energético. Aunque en sistemas industriales de gran escala este no suele ser un factor crítico, en aplicaciones donde se requiere autonomía (por ejemplo, drones, robótica, o sistemas aeroespaciales), la eficiencia energética es un criterio determinante. Muchos microcontroladores incorporan modos de bajo consumo o espera (standby), en los que desactivan parte de su hardware interno para reducir significativamente el consumo. 2025 4 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 1.4. Componentes Elementales de un Microcontrolador Figura 1.1: Arquitectura básica de un microcontrolador. 1.4.1. CPU La CPU constituye el microprocesador que integra todos los elementos necesarios para la ejecución de un programa. Algunos de estos elementos, así como ciertos métodos de funcionamiento, están orientados a reducir el tamaño de las instrucciones, optimizando así el uso de memoria: Figura 1.2: Instrucción de operación sin reducir. Contador de programa (Program Counter, PC): es un registro contador con capacidad suficiente para direccionar toda la memoria de programa. Su uso permite eliminar el campo de dirección de la próxima instrucción, ya que las instrucciones suelen estar ubicadas en direcciones consecutivas. De este modo, el PC actúa como puntero a la siguiente instrucción. Esta arquitectura requiere instrucciones específicas de salto o ruptura de secuencia para alterar el flujo normal de ejecución, como se verá más adelante. Almacenamiento de resultado: al guardar el resultado de una operación directamente en uno de los operandos, se puede eliminar el campo de dirección de resultado en la instrucción, reduciendo así su longitud. Esta estrategia requiere instrucciones adicionales para la transferencia de datos entre registros o entre memoria y registros. Acumulador (ACC): es un registro de propósito general con el tamaño adecuado para almacenar temporalmente el dato de mayor tamaño manejado por la CPU. Si todas las operaciones utilizan siempre el contenido de un registro predefinido (por ejemplo, WREG -Work Register-), el microprocesador se puede considerar como una máquina de una sola dirección. Esto simplifica la codificación de instrucciones, aunque implica la 2025 5 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 necesidad de instrucciones específicas para la carga y almacenamiento de datos. El flujo típico es: cargar el primer operando en el acumulador, operar con el segundo operando, y almacenar el resultado en la ubicación deseada. Figura 1.3: Instrucción de operación reducida. 1.4.2. Memorias Los microcontroladores suelen integrar distintos tipos de memoria, todas ellas de acceso aleatorio, aunque con diferentes funciones y características. Se pueden clasificar principalmente en dos grupos: Memorias activas (Random Access Memory, RAM): utilizadas para el almacenamiento temporal de datos durante la ejecución del programa. Su contenido se pierde al interrumpirse la alimentación, por lo que se consideran volátiles. Memorias pasivas (ROM, EPROM, EEPROM, OTP, FLASH, etc.): empleadas para almacenar tanto el código del programa como datos que deben conservarse tras apagar el sistema. Estas memorias no volátiles varían en cuanto a su capacidad de reprogramación y velocidad de acceso. En el ámbito de los microcontroladores, resulta fundamental implementar mecanismos de protección frente a lecturas no autorizadas del contenido de la memoria de programa. Esta protección garantiza la integridad del sistema y la preservación de la propiedad intelectual del producto en el que se integra el microcontrolador. 1.4.3. Bloques de Entrada/Salida (E/S) Los bloques de entrada/salida permiten la interacción del microcontrolador con el entorno o proceso bajo control, actuando como interfaz entre el sistema digital y las señales externas. Estos bloques pueden clasificarse según el tipo de señal o protocolo que gestionan: E/S digital en paralelo: disponen de terminales independientes que permiten la lectura o escritura de señales digitales, ya sea de forma individual o a través de buses. Generalmente, cada terminal puede configurarse por software como entrada o salida. E/S digital en serie: implementan protocolos de comunicación serie estandarizados, permitiendo el intercambio de datos entre microcontroladores y/o periféricos con un menor número de líneas. Entre los protocolos más comunes se encuentran I2 C, SPI, UART, RS232, USB y CAN, entre otros. E/S analógica: incorporan convertidores que permiten la adquisición y generación de señales analógicas. Esto se logra mediante conversores analógico-digitales (ADC) para la lectura de variables analógicas, y conversores digital-analógicos (DAC) para la generación de señales continuas a partir de datos digitales. 1.4.4. Bloque de Temporizadores Todos los microcontroladores incorporan recursos específicos para la gestión de variables temporales. Estos bloques son fundamentales en aplicaciones como la generación de temporiza- 2025 6 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 ciones (bases de tiempo, retardos, etc.), la medición de parámetros de señales (frecuencia, periodo, desfase, entre otros) o el contaje de eventos. La funcionalidad de los temporizadores y su configuración se tratarán con mayor detalle en la sección correspondiente. 1.4.5. Gestor de Interrupciones El gestor de interrupciones es el conjunto de circuitos y mecanismos encargados de detectar eventos asíncronos al flujo secuencial del programa y que requieren la atención inmediata del microcontrolador. Este subsistema permite que el microcontrolador responda de forma inmediata a sucesos externos o internos que requieren una actuación urgente, suspendiendo temporalmente la ejecución normal del programa. Para ello, se basa en registros de petición (flags), habilitación (enable bits) y, en muchos casos, niveles de prioridad que permiten gestionar múltiples fuentes de interrupción de forma ordenada. El gestor de interrupciones es esencial en sistemas de control embebido, ya que permite una respuesta eficiente y determinista a estímulos que no pueden preverse en el ciclo normal de ejecución. 1.4.6. Circuitos de Vigilancia La mayoría de los microcontroladores incorporan mecanismos dedicados a la supervisión del correcto funcionamiento del sistema. Estos circuitos permiten detectar fallos tanto de hardware como de software. Entre los más comunes se encuentran: Temporizador de vigilancia (Watchdog Timer): contador que debe ser reiniciado periódicamente por el programa; de lo contrario, asume que se ha producido un fallo y provoca un reinicio del sistema. Supervisión del oscilador: detecta anomalías en el generador de reloj principal del sistema. Supervisión de alimentación: monitoriza el nivel de tensión de alimentación para prevenir comportamientos erráticos ante caídas de tensión o inestabilidad eléctrica. 1.4.7. Inicialización de Funcionamiento (Reset) El microcontrolador incorpora un mecanismo de reinicio destinado a colocar todos sus registros y periféricos en un estado conocido y predefinido. Simultáneamente, se establece el valor del program counter en la dirección correspondiente al vector de reset, donde debe almacenarse la primera instrucción del programa a ejecutar. Podemos distinguir entre dos tipos principales de reinicio: Reset en frío: se produce al aplicar tensión de alimentación al dispositivo. Supone una inicialización completa desde el estado de reposo eléctrico. Reset en caliente: tiene lugar tras un fallo detectado durante la operación. En este caso, el sistema conserva información del origen del evento que lo ha provocado, permitiendo su identificación mediante registros específicos. 2025 7 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 1.5. Tipos de Arquitecturas de los Microcontroladores 1.5.1. Atendiendo a la Conexión de la Memoria En función de cómo se organiza el acceso a la memoria, se distinguen dos arquitecturas fundamentales: Arquitectura Harvard: dispone de memorias físicamente separadas para el programa y para los datos. Aunque esto implica un mayor número de terminales, permite el solapamiento de las fases de búsqueda de instrucciones y ejecución de operaciones, ya que la ALU puede acceder a la memoria de datos mientras la unidad de control accede a la memoria de programa. Esta arquitectura es característica de los microcontroladores PIC. Arquitectura Von Neumann: utiliza una única memoria para almacenar tanto el programa como los datos. Esto reduce el número de terminales del microcontrolador, pero implica que el acceso a instrucciones y datos debe realizarse de forma secuencial, requiriendo una mayor eficiencia en la gestión de la memoria. Figura 1.4: Arquitecturas Harvard y Von Neumann. 1.5.2. Atendiendo al Juego de Instrucciones Se denomina código de operación a la secuencia binaria que indica a la unidad de control las tareas a ejecutar. Existen dos enfoques principales en el diseño del conjunto de instrucciones, con implicaciones directas en la estructura interna del microcontrolador: Complex Instruction Set Computer (CISC): busca que las instrucciones se asemejen a sentencias de lenguajes de alto nivel, permitiendo realizar operaciones complejas con una sola instrucción. Esto requiere una lógica de decodificación y ejecución más elaborada, pero reduce el número de instrucciones necesarias en un programa. Reduced Instruction Set Computer (RISC): emplea un conjunto reducido de instrucciones simples, que se ejecutan rápidamente gracias a su estructura uniforme y a la simplicidad de la unidad de control. En este enfoque, el compilador asume un papel importante en la optimización del código. Las arquitecturas RISC suelen presentar ortogonalidad (todas las instrucciones pueden usar cualquier modo de direccionamiento o registro) y emplean habitualmente estructuras Harvard con solapamiento de instrucciones (instruction pipelining). Esta es la arquitectura adoptada por los microcontroladores PIC. 2025 8 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 2. E STRUCTURA DE LOS M ICROCONTROLADORES PIC (PIC18F47Q10) Como se detalló en la sección 1.5, los microcontroladores PIC emplean una arquitectura Harvard y un conjunto de instrucciones del tipo RISC. En consecuencia, disponen de una memoria de programa que admite instrucciones de 12, 14 o 16 bits, y una memoria de datos de 8 bits. A pesar de su arquitectura RISC, estos microcontroladores pueden programarse en lenguajes de alto nivel, como C, lo que facilita su adopción en entornos industriales y académicos. Las operaciones de transferencia con la memoria, así como las operaciones aritméticas y lógicas (data path), se basan en el uso de un registro acumulador, denominado work register o WREG. La ejecución de instrucciones en el PIC18F47Q10 se basa en una segmentación del proceso en dos etapas (pipeline), lo que permite el solapamiento de instrucciones consecutivas. Esta técnica posibilita la realización simultánea de operaciones asociadas a diferentes instrucciones, introduciendo paralelismo y reduciendo el tiempo promedio de ejecución. Cada instrucción se completa, en condiciones normales, en un ciclo de instrucción (CI), el cual equivale a cuatro ciclos del reloj del oscilador. Las únicas excepciones son las instrucciones que provocan saltos o alteraciones en la secuencia normal del flujo de ejecución, las cuales requieren ciclos adicionales debido a la ruptura del pipeline. El microcontrolador puede operar con una frecuencia de reloj de hasta 64 MHz, lo que implica un tiempo mínimo por CI de 62.5 ns. Adicionalmente, los microcontroladores PIC cuentan con una memoria de pila dedicada, gestionada mediante un stack pointer, utilizada para almacenar direcciones de retorno durante llamadas a subrutinas e interrupciones. 2.1. Características Generales La familia de microcontroladores PIC comparte una serie de características comunes: Periféricos para control de procesos: incluyen temporizadores, contadores, entradas/salidas analógicas y digitales, interfaces de comunicación serie, unidades de captura y comparación, así como sistemas de gestión de interrupciones. Asignación configurable de terminales: los terminales de E/S son, en su mayoría, multifunción. La funcionalidad de cada uno se configura mediante registros específicos, lo que permite adaptar el dispositivo a diferentes aplicaciones con un mismo encapsulado. Circuitos de vigilancia: disponen de mecanismos como el watchdog timer, que permite detectar y actuar ante bloqueos o fallos en la ejecución del programa. Configuración del oscilador: ofrecen hasta siete modos distintos de configuración del oscilador, permitiendo adaptar el funcionamiento del microcontrolador a distintos entornos y requerimientos de precisión y consumo. Modos de bajo consumo: incluyen modos de ahorro energético como el modo SLEEP, posibilidad de seleccionar frecuencias de reloj reducidas e inhibición individual de periféricos para minimizar el consumo energético. Protección de datos: integran mecanismos de protección contra lectura no autorizada de la memoria de programa y de la EEPROM, protegiendo así la propiedad intelectual del firmware. 2025 9 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Figura 2.1: Bloques funcionales del PIC18F47Q10. 2025 10 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 2.2. Unidad Aritmético-Lógica (ALU) La unidad aritmético-lógica (ALU) es la encargada de ejecutar las operaciones aritméticas y lógicas incluidas en el juego de instrucciones del microcontrolador. En el modelo PIC18F47Q10, la ALU está compuesta por el registro de trabajo (W en la figura 2.2), un multiplicador de 16 bits (basado en multiplicación de 8x8 bits) y un bloque destinado a operaciones de suma y resta, así como a las operaciones lógicas básicas: AND, OR, XOR y NOT. Todos estos elementos están interconectados entre sí y tienen acceso directo al bus de datos interno del microcontrolador. El registro STATUS almacena información clave relativa al resultado de las operaciones realizadas por la ALU. Entre los indicadores más relevantes se encuentran: rebosamiento del watchdog, signo y desbordamiento en operaciones con representación en complemento a dos, detección de resultados nulos (resultado igual a cero), o la presencia de acarreo en operaciones de suma y resta. Figura 2.2: ALU de un PIC18. 2.3. Unidad de Control La unidad de control del PIC está conformada por un sistema secuencial síncrono, responsable de generar todas las señales necesarias para la ejecución de las instrucciones del programa. Para ello, obtiene la instrucción desde la memoria de programa a través del bus de instrucciones de 16 bits, empleando un controlador de ROM y un registro intermedio (IR en la figura 2.3). Desde este registro se extrae tanto la operación a realizar, que se envía al decodificador de instrucciones, como la dirección del dato asociado, si la instrucción Figura 2.3: Unidad de control de lo requiere. un PIC18. El decodificador transforma la operación en una serie de señales de control, que son empleadas por la máquina de estados para coordinar las diferentes unidades funcionales del microcontrolador durante el ciclo de instrucción. 2025 11 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Figura 2.4: Ciclo de ejecución de instrucciones en el PIC. En el caso del PIC18F47Q10, i = 2 debido a la estructura de memoria de 8 bits. 2.4. Memoria de Programa El PIC18F47Q10 dispone de una memoria de programa basada en tecnología FLASH de 64 KWords, complementada con 1 kByte de memoria EEPROM para almacenamiento no volátil. La vida útil estimada para estas memorias es de 10000 ciclos de escritura/lectura para la FLASH y 100000 para la EEPROM. La memoria de programa está organizada por bytes, aunque las instrucciones se alinean siempre en direcciones pares (con LSB = 0). Su distribución se presenta en la tabla siguiente. Dirección Uso 00 0000h Vector de reset. 00 0008h Vector de interrupción de alta prioridad. 00 0018h Vector de interrupción de baja prioridad. 00 001Ah 01 FFFFh Memoria interna disponible para programa (64 KWords). 02 0000h 1F FFFFh No disponible (devuelve "0"). 2025 12 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 2.5. Memoria de Datos El PIC18F47Q10 dispone de una memoria de datos tipo S-RAM de 4 kB (4096 x 8 bits), organizada en 16 bancos de 256 posiciones cada uno, seleccionables mediante el registro Bank Select Register (BSR). Esta memoria contiene dos tipos de registros fundamentales: SFR (Special Function Registers): registros dedicados al control y estado de la CPU y periféricos. GPR (General Purpose Registers): registros de uso general para almacenamiento temporal de variables y datos intermedios. Existen tres modos de acceso a la memoria de datos: acceso directo, indirecto e indexado. Acceso directo: emplea direccionamiento paginado mediante el registro BSR (4 bits), el cual se combina con los 8 bits de dirección provistos por la instrucción para formar la dirección completa de 12 bits. Acceso vía Access Bank: una forma especial de direccionamiento directo en la cual los 4 bits altos de la dirección se derivan Figura 2.5: Memoria de datos de un PIC18. automáticamente del banco de acceso, eliminando la necesidad de modificar manualmente el BSR. Acceso indirecto: se realiza mediante los registros FSR (File Select Registers), que permiten direccionamiento dinámico a través de punteros. 2.6. Periféricos Los terminales de E/S del PIC18F47Q10 están organizados en cinco puertos: cuatro de 8 bits (PORTA, PORTB, PORTC y PORTD) y uno de 4 bits (PORTE). Estos puertos, al igual que el resto de los periféricos (temporizadores, ADC, DAC, comparadores, etc.), están conectados directamente al bus de datos (DB). Figura 2.6: Algunos de los periféricos del PIC18F47Q10. La activación/desactivación (Peripheral Module Disable, PMD) y configuración de los periféricos se realiza mediante software, a través de los registros de configuración específicos. Por defecto, tras un reinicio, todos los periféricos están habilitados. De forma similar, los terminales de E/S se configuran inicialmente como entradas analógicas tras un reset. 2025 13 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 2.7. Otros Aspectos Relevantes del PIC18F47Q10 2.7.1. Reset del Microcontrolador Existen diversas condiciones que pueden provocar el reinicio del microcontrolador PIC18: Ejecución explícita de la instrucción RESET. Desbordamiento de la pila, lo cual puede indicar que el flujo del programa se ha desviado de manera errónea. Tiempo de espera excedido en el temporizador de vigilancia (watchdog), lo que sugiere un posible bloqueo del sistema. Anomalías en la tensión de alimentación (por debajo del umbral mínimo). Activación externa del pin de reset. Para garantizar un arranque fiable del programa almacenado en la memoria de programa y un funcionamiento autónomo seguro, el microcontrolador incorpora un circuito de reinicio basado en una red RC. Este asegura un retardo suficiente tras un evento de reset, permitiendo que el sistema se estabilice antes de comenzar la ejecución normal. 2.7.2. Gestión de Subrutinas: Memoria PILA En los programas puramente secuenciales, la necesidad de reutilizar funcionalidades similares o idénticas puede derivar en bloques de código repetidos, lo que incrementa el uso de memoria y genera una programación poco estructurada, dificultando su verificación y optimización. Para evitar esto, se adopta una estructura basada en subrutinas: bloques de instrucciones diseñados para ejecutar tareas específicas, que pueden ser invocados desde distintos puntos del programa sin afectar el flujo general del mismo. Su implementación requiere instrucciones específicas de salto y retorno que permitan preservar el contexto previo a la llamada, posibilitando el anidamiento y resultando transparentes para el programador. Con este propósito, el PIC18F47Q10 dispone de una memoria PILA o stack, compuesta por 31 posiciones de 21 bits cada una. El puntero de pila (stack pointer, STKPTR) de 5 bits señala la última posición utilizada. Al realizar una llamada a subrutina, se almacena en la pila la dirección de retorno (la siguiente a la llamada), lo que permite reanudar la ejecución desde el punto correcto tras completar la subrutina. El estado de la pila se supervisa mediante el registro PCON0, que informa sobre condiciones como desbordamiento, intento de lectura con la pila vacía (STKPTR = 0), o permite reinicializarla. Existe además una memoria PILA de registros que permite guardar automáticamente los valores de STATUS, WREG y BSR durante llamadas e interrupciones. Esta pila posee un único nivel de profundidad, por lo que su contenido se sobrescribe en llamadas anidadas. Durante las llamadas y retornos desde subrutinas, el uso de la pila de registros es opcional y puede habilitarse mediante la opción FAST en las instrucciones CALL y RETURN. En cambio, en interrupciones siempre se utiliza automáticamente. En estos casos, para restaurar el contexto es necesario emplear la instrucción RETFIE con la opción FAST. Se debe tener especial precaución si se emplean interrupciones de dos niveles de prioridad. Top-of-Stack (TOS): El registro TOS permite acceder directamente al contenido de la última posición ocupada en la PILA, determinada por el valor actual del puntero STKPTR. Este acceso resulta útil, por ejemplo, para inspeccionar o manipular la dirección de retorno antes de ejecutar una instrucción RETURN. 2025 14 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Dado que la PILA también es utilizada por el sistema de interrupciones, cualquier acceso al registro TOS debe realizarse con las interrupciones globales deshabilitadas, a fin de evitar condiciones de carrera o corrupción del contenido. Existen dos instrucciones específicas asociadas a la manipulación directa de la PILA: PUSH: incrementa el registro STKPTR y almacena en la PILA el contenido actual del contador de programa (PC). POP: decrementa el registro STKPTR, descartando el valor en la parte superior de la PILA. 2.7.3. Gestión de Look-up Tables en la Memoria de Programa El PIC18F47Q10 permite el almacenamiento y acceso a datos organizados en tablas (look-up tables) dentro de la memoria de programa. Para ello, dispone de recursos de hardware específicos, tales como el registro TBLPTR (puntero de datos para la tabla) y el registro TABLAT (registro para lectura y escritura de datos). Asimismo, el conjunto de instrucciones del microcontrolador incluye operaciones dedicadas para manipular estas tablas, las cuales se describirán en detalle en el anexo correspondiente al juego de instrucciones. 3. E NTRADAS Y S ALIDAS EN PARALELO Las entradas y salidas (E/S) de un microcontrolador son elementos esenciales para su funcionamiento, ya que permiten la comunicación con el entorno. Estas E/S pueden ser digitales o analógicas y se controlan mediante un procesador de control de transferencia, ya sea de forma síncrona (con reloj, como en SPI, I2 C, etc.) o asíncrona (mediante bits de inicio y fin, señales de reconocimiento como ACK, en protocolos como UART, CAN, etc.). En cuanto al modo de transferencia de información a través de las E/S, se distinguen dos modalidades principales: Comunicación serie: utiliza una única línea para la transmisión de datos. Aunque la velocidad de transferencia es relativamente baja, permite la comunicación a larga distancia y la posibilidad de modular la señal según el ancho de banda requerido. Comunicación en paralelo: utiliza tantas líneas como bits se deseen transmitir (o un divisor de estas). Ofrece una mayor velocidad de transferencia en comparación con la comunicación serie, pero requiere un número considerable de conexiones. Por esta razón, su uso se limita a distancias cortas (menores a 15 m) y suele emplearse en comunicación dentro del propio circuito. 3.1. Conceptos Básicos de las E/S Paralelo La transferencia de información entre las E/S (I/O) y el microcontrolador se realiza mediante un bus de datos (Data Bus, DB), el cual es un recurso compartido entre varios elementos del sistema. Esto requiere, a su vez, la existencia de un bus de direcciones (Address Bus, AB), que permite seleccionar los dispositivos o registros implicados en la comunicación. El elemento básico de almacenamiento para las salidas es el biestable tipo D (D flip-flop), que mantiene el estado de la señal hasta una nueva actualización. En el caso de las entradas, se emplean buffers en configuración tri-estado o amplificadores, que permiten una lectura eficiente y evitan conflictos en el bus de datos. 2025 15 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Figura 3.1: Arquitectura general de las entradas/salidas. 3.2. Estructura de E/S en el PIC18F47Q10 El PIC18F47Q10 dispone de cuatro puertos de 8 bits cada uno (PORTA, PORTB, PORTC y PORTD), cuyos terminales se denominan Rx0 a Rx7, y un puerto adicional de 4 bits (PORTE), con terminales RE0 a RE3. Todos los pines del microcontrolador son multifunción y pueden configurarse individualmente como entrada o salida, salvo el pin RE3, que únicamente funciona como entrada. La configuración y control de estos terminales se realiza mediante ocho registros dedicados, que permiten ajustar distintos parámetros de operación. Registro Función PORTx Lectura del terminal. LATx Escritura/lectura del flip-flop. TRISx Dirección del terminal (E: 1, S: 0). ANSElx Analog Select (Función analógica: 1). WPUx Weak Pull-up (PU enable: 1). INLVLx Input Level (Schmitt Trigger CMOS: 1, TTL: 0). SLRCONx Slew Rate Control (Limitado: 1). ODCONx Open Drain Control (Drenador abierto: 1). Analizando la gestión de las interfaces de E/S del PIC, se puntualizan los siguientes aspectos: La lectura de PORTx y LATx en un terminal concreto no tiene por qué coincidir, ya que uno refleja el estado físico del terminal y el otro el valor almacenado en el latch. Esta distinción es útil para verificar el correcto funcionamiento de los terminales. ANSELx desconecta la circuitería digital de las entradas analógicas, con el fin de reducir el consumo y evitar indeterminaciones y desviaciones en la señal. Cuando ANSELx está en 1 para un determinado terminal, el valor leído en PORTx será siempre 0. Además, dicho terminal puede funcionar como salida digital aún con ANSELx en 1. Las E/S pueden manejar hasta 50 mA en modo drenador abierto. Tras un reset, los pines se configuran como entradas (TRISx = 1) analógicas (ANSELx = 1). Al habilitar una salida analógica, el amplificador de salida se fuerza a alta impedancia. 2025 16 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Los dos diodos fijadores limitan la tensión a la entrada del terminal al rango [Vss , Vdd ]. 3.2.1. Salida con Drenador Abierto (ODCONx) Cada terminal cuenta con un registro que permite habilitar la salida con drenador abierto. Esto implica que la salida sólo puede forzar el nivel bajo (0). La topología de salida con drenador abierto permite trabajar con niveles de tensión distintos, incluso si la tensión de entrada supera la de alimentación del microcontrolador. Al dimensionar el circuito, es importante considerar no solo las características del MOSFET, sino también las de los diodos fijadores, para evitar dañarlos. Tras un reset, la salida a drenador abierto de todos los terminales está desactivada. 3.2.2. Control del Slew-rate (SLRCONx) Figura 3.2: Esquema de salida a drenador abierto. El registro SLRCONx permite limitar el slew-rate de cada terminal del PORTx. Cuando el valor de este registro es 1, el slew-rate se sitúa en el máximo permitido por el amplificador de entrada. Tras un reset, el control está desactivado, por lo que SLRCONx se inicializa a 1. 3.2.3. Control del Umbral Lógico (INLVLx) Cada terminal del PORTx dispone de un registro que permite seleccionar el umbral de detección para los niveles lógicos 1 y 0. Cuando este registro está habilitado, la detección se realiza mediante un Schmitt Trigger con niveles CMOS (modo por defecto tras un reset). Si INLVLx está deshabilitado (valor 0), los niveles lógicos son compatibles con TTL. 3.2.4. Resistencia de Carga (WPUx) Cada PORTx cuenta con un registro que permite habilitar de forma independiente resistencias de pull-up en cada terminal (tras el reset, estas resistencias están deshabilitadas por defecto). La función del pull-up, al igual que la del pull-down, es asegurar que el pin digital nunca se encuentre en estado flotante, es decir, en un nivel indeterminado entre 0 y 1 cuando no se marca un nivel lógico en la entrada. Figura 3.3: Resistencias de pull-up/pull3.3. Interrupt-on-Change: down. Detección de Cambios de Estado Lógico Todos los terminales de los PORTx pueden configurarse para detectar flancos en su entrada, y este evento puede gestionarse mediante consulta periódica o por interrupción (IOC). Para ello, existen varios registros asociados. Registro Función IOCxP Si habilitado, permite la detección de flancos de subida. IOCxN Si habilitado, permite la detección de flancos de bajada. IOCxF Indicador de flanco en el terminal correspondiente. PIR0[IOCIF] Bit de marca de evento (flanco en cualquier terminal permitido, borrado por hardware). PIE0[IOCIE] Bit de habilitación de IOC. El terminal que causa la interrupción se ha de identificar en la rutina. 2025 17 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Figura 3.4: Esquema de la detección de flancos IOC. 3.4. Asignación de Terminales a Periféricos (PPS) Muchos periféricos pueden utilizar terminales de entrada y/o salida para distintas funciones. Sin embargo, no todos los periféricos pueden conectarse a todos los terminales, ni todos los terminales están disponibles para todos los periféricos. Para configurar estas conexiones (Peripheral Pin Select Module), se emplean dos tipos de registros: Configuración de entrada: cada periférico dispone de un registro xxxPPS que permite seleccionar el terminal de entrada, donde xxx corresponde a la identificación del periférico (por ejemplo, TMR para temporizadores). Configuración de salida: cada terminal capaz de funcionar como salida cuenta con un registro RxyPPS mediante el cual se asigna el periférico que utilizará dicha salida, siendo xy la identificación del terminal. En periféricos con señales bidireccionales, se debe asignar el mismo terminal tanto en xxxPPS como en RxyPPS. Además, es posible bloquear asignaciones no deseadas mediante el registro PPSLOCK[PPSLOCKED]. Para más detalles, se recomienda consultar el datasheet del microcontrolador. 3.5. Ejemplos de Conexión de Periféricos 3.5.1. Conexión de un Interruptor Figura 3.5: Esquema de la conexión con un interruptor, con pull-up externo y con pull-up interno. 2025 18 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 3.6. Conexión de un LED Para calcular las resistencias necesarias en función del tipo de activación, se emplean las siguientes expresiones: R1 = Vc − VF − VOL [Ω] IF R2 = VOH − VF [Ω] IF Figura 3.6: Conexión de un LED con activación a 0 y a 1. 3.7. Cargas DC y Aislamiento Galvánico Cuando se conectan cargas inductivas a un terminal (como motores de corriente continua, relés, etc.), es importante prevenir sobrecargas provocadas por los picos de tensión generados durante el arranque o la desconexión. Para evitar estos fenómenos, se debe colocar un diodo de libre circulación o flyback en paralelo con la carga, permitiendo que las corrientes inducidas encuentren un camino seguro de descarga. Para lograr aislamiento galvánico entre distintos elementos del circuito -ya sea por motivos de seguridad eléctrica o para adaptar diferentes niveles de tensión- es común emplear optoacopladores. 4. T EMPORIZADORES Dos circuitos síncronos que compartan información entre ellos deben estar sincronizados. Dicha sincronización puede ser gestionada por el microprocesador -mediante la ejecución de instrucciones de transferencia iniciadas por el propio micro o por un periférico, a través de interrupciones- o bien por un periférico utilizando el mecanismo de Direct Memory Access (DMA). 4.1. Consulta Periódica En la adquisición de información mediante consulta periódica, el microprocesador comprueba de forma cíclica si el periférico está preparado para realizar la transferencia de datos, con un tiempo máximo entre consultas mayor que la duración del proceso. Este método de adquisición de información permite una mayor utilización de la capacidad de procesamiento del microcontrolador sin incrementar la complejidad del circuito, dependiendo íntegramente del programador. 4.2. La Necesidad de Temporización y su Realización Existen numerosas aplicaciones que requieren un control temporal preciso: generación de señales y trenes de pulsos, temporización en tiempo real, sincronización de actuaciones (retardos temporizados, precisión en la ejecución), medición de parámetros temporales (frecuencia, ciclos de trabajo, desfases), entre otros. Todos estos procesos justifican la existencia de técnicas y hardware específicos dedicados a la gestión precisa del tiempo. 2025 19 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 4.2.1. Temporización por Programa La temporización por programa consiste en la ejecución de bucles con tiempos de ejecución conocidos, sin requerir hardware específico. Aunque esta técnica tiene la ventaja de simplificar el diseño del circuito, presenta como inconveniente que el microcontrolador permanece ocupado con tareas “vacías” durante el periodo de temporización. 4.2.2. Temporización por Hardware Se pueden diferenciar dos modalidades: Temporizador (periférico) + programa, donde la precisión temporal depende de la estructura del programa y la habilidad del programador, aunque su implementación es sencilla. Temporizador + hardware específico + programa, cuya precisión depende de los retardos del circuito y requiere periféricos dedicados. 4.3. Estructura Básica de un Temporizador El comportamiento de un temporizador y un contador de flancos es idéntico. Por lo general, los temporizadores de un microcontrolador cuentan con una serie de registros de configuración (modo de operación, precarga, etc.), una entrada de reloj seleccionable, una entrada de habilitación y un indicador de fin de cuenta (rebosamiento o comparación). Habitualmente, se monitoriza dicho evento y no el estado concreto del conteo. 4.4. Temporizadores/Contadores del PIC18F47Q10 El PIC18F47Q10 cuenta con 7 periféricos altamente configurables dedicados a la temporización y conteo: TMR0, TMR1, TMR2, TMR3, TMR4, TMR5 y TMR6. Según sus modos de operación, se agrupan en 3 categorías: Temporizadores polivalentes: TMR0, operable por comparación o rebosamiento. Temporizadores por rebosamiento: TMR1, TMR3 y TMR5 (impares). Temporizadores por comparación: TMR2, TMR4 y TMR6 (pares). 4.4.1. Temporizador Polivalente: TMR0 El temporizador TMR0 puede funcionar tanto en modo rebosamiento (16 bits) como en modo comparación (8 bits). Dispone de una fuente de impulsos seleccionable (interna o externa con selección de flanco), la posibilidad de operar en modo síncrono o asíncrono, un divisor de frecuencia programable (prescaler y postscaler) y sincronización mediante interrupción. Además, su funcionamiento puede continuar en modo SLEEP. En el modo de comparación de 8 bits, a cada flanco de subida del reloj se incrementa el registro TMR0L hasta que su valor coincide con el almacenado en TMR0H. El valor de comparación guardado en TMR0H se mantiene constante entre comparaciones, pudiendo ser modificado por programa tras producirse una comparación positiva. En el modo de rebosamiento de 16 bits, el valor de precarga se almacena primero en TMR0H y luego en TMR0L (TMR0H actúa como registro intermedio, permitiendo la transferencia simultánea de los 16 bits al cargar TMR0L). La transición ocurre al desbordar de 0xFFFF a 0x0000. Para la lectura del contador, el orden es inverso: al leer TMR0L, los 8 bits más significativos se transfieren a TMR0H, que puede ser accedido a continuación. 2025 20 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Figura 4.1: Esquema eléctrico del TMR0 y diagramas funcionales de sus modos de operación. Figura 4.2: Resumen de los registros de configuración y operación del TMR0. 4.4.2. Temporizadores por Rebosamiento: TMR1, TMR3 y TMR5 La siguiente descripción aplica a todos los temporizadores impares del PIC18F47Q10. Se trata de contadores ascendentes de 16 bits con fuentes de impulsos seleccionables, que pueden operar tanto por control del programa como mediante un evento externo (GATE). Cuentan con prescalers configurables de 2 bits y permiten la sincronización del rebosamiento mediante interrupción. Al igual que el TMR0, estos temporizadores pueden generar eventos que despierten al microcontrolador del modo SLEEP. El principio de operación y rebosamiento es análogo al del TMR0 en su modo de 16 bits. Es importante destacar que el valor de precarga debe actualizarse tras cada ciclo de temporización, ya que el rebosamiento reinicia el contador a 0x0000. 2025 21 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Figura 4.3: Esquema eléctrico de un TMRx impar. Figura 4.4: Resumen de los registros de configuración y operación de los TMRx impares. 4.4.3. Temporizadores por Comparación: TMR2, TMR4 y TMR6 La siguiente descripción aplica a todos los temporizadores pares del PIC18F47Q10. Se trata de contadores ascendentes de 8 bits, con fuentes de impulsos seleccionables, prescalers configurables de 3 bits, postscalers de 4 bits, señal de RESET y 3 modos de operación. Estos temporizadores operan por comparación positiva, generando un rebosamiento cuando el valor ascendente de TxTMR se iguala a TxPR. A diferencia de los temporizadores por rebosa- 2025 22 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 miento, no es necesario recargar TxPR en cada conteo, aunque puede actualizarse por programa tras haberse producido el rebosamiento. Estos temporizadores cuentan con tres modos de operación: Modo continuo (Free-Running Period): cuando la comparación es positiva, TxTMR pasa a 0x00 y la cuenta vuelve a empezar. Temporización única (One-Shot): cuando la comparacion es positiva, el bit de habilitación del temporizador pasa a 0, no reiniciando la cuenta hasta una nueva habilitación. Funcionamiento monoestable (Monostable): modo de operación similar al anterior, salvo que el bit de habilitación no se reinicia, sino que el TMRx es reiniciado por un evento de RESET externo. Figura 4.5: Esquema eléctrico de un TMRx par. Figura 4.6: Resumen de los registros de configuración y operación de los TMRx pares. 2025 23 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 5. I NTERRUPCIONES 5.1. Concepto de Excepción e Interrupción Una excepción es un evento asíncrono que ocurre durante la ejecución normal de un programa y que requiere la atención inmediata del microcontrolador. Este tipo de eventos puede tener diversas causas: Internas a la CPU: errores de ejecución (como divisiones por cero) o condiciones especiales de operación (como ejecución paso a paso). Desde otros elementos del sistema: fallos de acceso al bus o solicitudes de atención de periféricos (es decir, interrupciones). Desde el propio programa: llamadas al sistema operativo o generación intencionada de interrupciones simuladas. Atender una excepción implica interrumpir el flujo normal de ejecución del programa para ejecutar una rutina específica destinada a gestionar la condición que la originó. Esta rutina se conoce como rutina de atención a la excepción. El método tradicional de detección de excepciones consiste en verificar, tras la ejecución de cada instrucción, si se ha producido alguna condición que requiera intervención. La atención a excepciones presenta una serie de parámetros característicos que condicionan su comportamiento: Figura 5.1: Algoritmo de detección. Latencia: tiempo transcurrido desde que se produce la excepción hasta que comienza la ejecución efectiva de su rutina de atención. Incluye el tiempo de finalización de la instrucción en curso (la más larga posible del código) y el tiempo necesario para preparar el cambio de contexto. Rutina de atención: conjunto de instrucciones encargadas de gestionar y resolver la condición que ha provocado la excepción. Circuitería asociada a las excepciones: incluye los mecanismos de detección, identificación del origen, gestión de prioridades, habilitación/inhibición de interrupciones y borrado de flags, entre otros. 5.2. Interrupciones Las interrupciones constituyen un tipo particular de excepción que permite el acoplamiento entre los periféricos y el microprocesador. Este acoplamiento puede ser: Asíncrono: iniciado por el periférico, independiente a la ejecución del programa. Síncrono: cuando la transferencia de información está controlada por el procesador. En general, el proceso se inicia con una petición de interrupción por parte del periférico, a la que el microprocesador responde con una aceptación. 2025 24 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 5.2.1. Identificación de la Fuente de Interrupción La identificación del origen de la interrupción puede realizarse mediante dos métodos: Identificación por consulta: el periférico que solicita la interrupción marca su estado mediante un biestable interno. En la subrutina de atención a la interrupción, el programa comprueba estos flags para determinar la fuente. Esta técnica requiere una intervención directa del software. Identificación por vector: el hardware asigna direcciones (vectores) específicas a cada fuente de interrupción. Cuando ocurre una interrupción, la CPU salta automáticamente a la dirección correspondiente, permitiendo identificar la fuente sin necesidad de consulta adicional en el software. 5.2.2. Prioridad de las Interrupciones En situaciones en las que dos o más periféricos solicitan atención simultáneamente, o se está atendiendo una interrupción y se recibe otra petición, es necesario establecer prioridades para la correcta ejecución del programa. Los niveles de prioridad resuelven conflictos y eliminan cualquier ambigüedad. Pueden ser fijos o variables, y establecerse tanto por hardware como por software. 5.2.3. Inhibición de Interrupciones Existen situaciones en las que el microcontrolador no debe ser interrumpido (por ejemplo, durante el arranque). En estos casos, se emplean máscaras para inhibir prioridades. La inhibición puede ser global o individual, afectando selectivamente a ciertos periféricos. Nótese que algunas interrupciones son no enmascarables, no siendo afectadas por la inhibición global. 5.2.4. Borrado de las Peticiones de Interrupción En las subrutinas de gestión de interrupciones debe realizarse el borrado de las banderas de petición ya atendidas, para evitar que un mismo evento dispare repetidamente su rutina de atención. Este borrado puede hacerse por programa (instrucciones explícitas) o por hardware, durante la identificación o gestión de la petición. Es importante que el borrado sea un proceso controlado, evitando eliminar peticiones no atendidas. Por ello, se recomienda el uso de máscaras de bits, evitando limpiar registros completos. 5.3. Gestión de las Interrupciones en el PIC18F47Q10 El PIC18F47Q10 cuenta con dos vectores de interrupción: uno de alta prioridad (0x0008) y otro de baja prioridad (0x0018). Se distinguen así dos niveles de prioridad, siendo el de baja incapaz de interrumpir al de alta. La identificación del origen de la interrupción se realiza por consulta dentro de la subrutina correspondiente, asociándose a cada fuente de interrupción 3 bits configurables: Flag bit: indica si la interrupción ha ocurrido. Enable bit: habilita la generación de la interrupción. Priority bit: determina si la interrupción es de alta o baja prioridad. 5.3.1. Fuentes de Interrupción Las principales fuentes de interrupción del PIC18F47Q10 son: 2025 25 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 INT0, INT1, INT2: detección de flanco activo en los terminales externos seleccionados de PORTA o PORTB. Interrupt-on-Change (IOC): detección de flanco configurado en los pines habilitados de PORTA, PORTB, PORTC o RE3. TMRxIF: interrupción generada por fin de alguno de los temporizadores (TMR). GATE: evento de compuerta activa en los temporizadores impares. ADCIF: fin de conversión del ADC. Además de estas, existen otras fuentes de interrupción asociadas a condiciones específicas, como el estado de la tensión de alimentación, fallos de reloj o señales de los comparadores. Todas ellas están descritas en detalle en el datasheet del microcontrolador. 5.3.2. Interrupt-on-Change Los terminales de los PORTA, PORTB y PORTC, además del terminal RE3, pueden configurarse para la detección de flancos de bajada o subida. Dichos eventos pueden ser atendidos por consulta o por interrupción. Para su configuración cuentan con los registros IOCxP (flanco de subida), IOCxN (flanco de bajada), IOCxF (flag del flanco seleccionado), PIR0[IOCIF] (marca de evento) y PIE0[IOCIE] (permiso de interrupción). Nótese que la identificación del terminal concreto se realiza en la subrutina de atención al IOCIF, mediante el IOCxF correspondiente. 5.3.3. Registros Asociados a la Gestión de Interrupciones INTCON (Interrupt Control Register): configuración general de las interrupciones. PIR0-7 (Peripherical Interrupt Request Register): flags de interrupción. PIE0-7 (Peripherical Interrupt Enable Register): habilitación de interrupción. IPR0-7 (Peripherical Interrupt Priority Register): establecimiento de prioridad. Figura 5.2: Resumen de los registros de operación y configuración de las interrupciones. 2025 26 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 6. E NTRADAS Y S ALIDAS A NALÓGICAS A pesar del amplio uso de las señales digitales, la mayoría de los procesos reales requieren la lectura y generación de señales analógicas. Para ello, se emplean convertidores analógicodigitales (ADC) y digital-analógicos (DAC), así como elementos auxiliares como detectores de umbral (comparadores) o actuadores conmutados (PWM, puentes H, etc.). Figura 6.1: Estructura básica de un circuito de adquisición. 6.1. Gestión de Señales Analógicas en el PIC18F47Q10 6.1.1. Convertidor ADC El PIC18F47Q10 incorpora un convertidor analógico-digital (ADC) por aproximaciones sucesivas de 10 bits, que puede conectarse a hasta 34 canales externos mediante una entrada multiplexada, así como a 4 canales internos auxiliares: la tensión de referencia VSS , el sensor interno de temperatura, la salida del DAC y la referencia de tensión interna FVR. El disparo del ADC puede activarse por software o por hardware, y admite funcionamiento en modo SLEEP. Además, el módulo ADC incluye funciones de procesamiento matemático integradas, como el cálculo del valor medio, filtrado, sobremuestreo y detección de umbral. También permite configurar el tiempo de adquisición (relacionado con la carga del condensador de muestreo, CSH ) y dispone de un divisor capacitivo para escalar la tensión de entrada. 6.1.2. Convertidor DAC El PIC18F47Q10 también cuenta con un convertidor digital-analógico (DAC) de 5 bits, con rango de tensión de salida programable mediante las referencias Vsource+ y Vsource- . Su salida puede redirigirse internamente hacia el ADC o a un pin físico de salida, según la configuración seleccionada. 6.1.3. Módulos de Comparación Analógica El microcontrolador dispone de dos comparadores analógicos rail-to-rail, cada uno con acceso a cuatro entradas analógicas externas. Su salida digital puede dirigirse a distintos periféricos a través del PPS y presenta polaridad programable. Además, la tensión de referencia del comparador es configurable, y su salida puede emplearse para activar eventos como: el disparo del ADC, el arranque de temporizadores impares, el reinicio de temporizadores pares o la captura en módulos CCP, entre otros. 2025 27 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 6.1.4. Sensor de Temperatura El PIC18F47Q10 integra un sensor de temperatura que cubre un rango de operación de -40 °C a +85 °C. Este sensor puede conectarse por software a la entrada del ADC, permitiendo su lectura periódica o automática. 6.2. Convertidor Analógico-Digital del PIC18F47Q10 Figura 6.2: Arquitectura del ADC del PIC18F47Q10. Figura 6.3: Circuito de muestreo del ADC. 2025 28 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 6.2.1. Terminales de Entrada Analógica Como se detalló en la sección 3, todos los terminales de los puertos PORTA, PORTB, PORTC y PORTD, así como RE0, RE1 y RE2, pueden configurarse como entradas analógicas para el módulo ADC. Para habilitarlos, deben establecerse como entrada digital (TRISx = 1) y activar su funcionalidad analógica mediante ANSELx = 1. La selección del canal activo se realiza mediante el registro ADPCH, a través de los bits CHS. Es importante tener en cuenta que, tras cada cambio de canal, se requiere un tiempo de espera para la estabilización de la señal, equivalente a (TMUX + TCHS ). 6.2.2. Tensión de Referencia La tensión de referencia del ADC, tanto positiva como negativa, se configura mediante el registro ADREF. La resolución del convertidor, expresada en términos de su bit menos significativo (LSB), se calcula como: LSB = Vr e f + − Vr e f − 2n donde n representa el número de bits de resolución del ADC (en este caso, 10 bits). Para maximizar la resolución efectiva en la medición de una señal de entrada concreta, pueden emplearse las siguientes estrategias: Uso de un circuito de ganancia externa: se adapta la señal de entrada de modo que V I N ,max ≈ Vr e f + . Ajuste de la referencia del ADC: se selecciona un valor de referencia más próximo al rango de la señal de entrada. 6.2.3. Reloj de Conversión El ADC del PIC18F47Q10 opera mediante el método de aproximaciones sucesivas, requiriendo un tiempo TAD por cada bit convertido. Este tiempo depende directamente del reloj de conversión, que se configura a través del bit ADCRC del registro ADCON0 y mediante los bits ADCS del registro ADCLK. El reloj de conversión puede seleccionarse entre diversas fuentes: El reloj principal del sistema, Fosc , Divisores de Fosc , Un oscilador interno dedicado al ADC, FRC. La elección del reloj afecta tanto al consumo energético como a la precisión de la conversión, por lo que debe seleccionarse en función de la aplicación concreta. 6.2.4. Inicio y Fin de Conversión La conversión del ADC puede iniciarse de tres formas principales: por programa, en modo automático o en modo continuo. En el modo por programa, se inicia la conversión al establecer el bit ADGO del registro ADCON0. En el modo de autoconversión, el bit ADGO se activa por hardware ante el flanco de subida del evento definido en el registro ADACT. 2025 29 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 En el modo continuo, habilitado mediante el bit ADCONT de ADCON0, cada conversión finalizada inicia automáticamente una nueva. El fin de la conversión se señala con el borrado del bit ADGO, lo cual puede consultarse por software o bien mediante una interrupción asociada (bit ADIF del registro PIR1). Esta interrupción, además, puede emplearse para despertar al microcontrolador del modo SLEEP, lo que permite una conversión eficiente en condiciones de bajo consumo. El flag de interrupción debe ser limpiado por software. 6.2.5. Formato de Datos El resultado de 10 bits generado por el ADC se almacena en dos registros de 8 bits: ADRESL (parte baja) y ADRESH (parte alta). La disposición de estos bits depende de la configuración del bit ADFM (A/D Result Format Select) del registro ADCON0: Si ADFM = 0, el resultado se justifica a la izquierda, ocupando los bits más significativos de ADRESH y ADRESL. Si ADFM = 1, el resultado se justifica a la derecha, ocupando los bits menos significativos de ADRESH y ADRESL. Figura 6.4: Formato de los datos en el ADC según la justificación seleccionada. 6.3. Secuencia de Operaciones del ADC 6.3.1. Configuración Terminal: configuración el terminal deseado como entrada analógica. Convertidor: selección de reloj (ADCS en ADCON0), tensión de referencia (ADREF), entrada (ADPCH), formato de salida (ADFM en ADCON0), tiempo de adquisición (ADPRE y ADACQ) y habilitación (ADON en ADCON0). Interrupciones: opcionalmente, borrado del flag correspondiente (ADIF en PIR1), habilitación del permiso de interrupción del ADC (ADIE en PIE1) y habilitación de las interrupciones globales. 6.3.2. Inicio de Conversión Activación del ADC: por programa (ADGO), por evento externo o en modo continuo. Espera a fin de conversión: aviso de fin de conversión por consulta de ADGO = 0 o por interrupción (ADIF en PIR1). 2025 30 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Figura 6.5: Tiempo de conversión del ADC. 6.3.3. Fin de Conversión Si ADPSIS = 0 (ADCON2), se copia ADRESL y ADRESH en ADPREV. Carga en ADRESL y ADRESH del resultado de la conversión. Si ADCONT = 0 (ADCON0), reset de ADGO (ADCON0). Activación de ADIF (PIR1). Activación de ADMATH. Si ADDSEN = 1 (ADCON1), cálculo de ADERR y activación de ADTIF si el resultado alcanza el umbral. Si ADDSEN = 1 (ADCON1), realización de las oeraciones en la siguiente conversión. Cualquier conversión se puede detener haciendo reset al bit ADGO de ADCON0. Figura 6.6: Resumen de los registros de control del ADC. 2025 31 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 A. J UEGO DE I NSTRUCCIONES DEL PIC18F47Q10 Los lenguajes de programación pueden clasificarse en función de su cercanía al lenguaje natural. Se denominan lenguajes de alto nivel aquellos más próximos a este, y lenguajes de bajo nivel los más alejados. Los lenguajes de alto nivel presentan semánticas y sintaxis similares al lenguaje humano, además de metodologías de programación características como la estructurada o la orientada a objetos. Gracias a las capas de abstracción, son relativamente independientes del microcontrolador que se esté programando, ya que el código se traduce a lenguaje máquina y optimiza mediante un compilador. El lenguaje máquina es el conjunto de combinaciones binarias asignadas a los códigos de operación y especificación de operandos de un microcontrolador. Es el nivel más bajo, es decir, más cercano al entendimiento directo por parte del hardware. Su principal ventaja es la posibilidad de optimizar enormemente el número de instrucciones necesarias para ejecutar un determinado proceso, al no existir ninguna capa de abstracción intermedia, accediéndose directamente a las posiciones de memoria de programa. No obstante, el lenguaje máquina obliga a programar en posiciones absolutas de memoria, siendo necesario calcular manualmente las direcciones de salto, así como insertar o eliminar instrucciones cuidadosamente. Además, la memorización de los códigos es muy compleja, debido a su lejanía respecto al lenguaje natural. Un nivel por encima del lenguaje máquina se encuentra el lenguaje ensamblador, un lenguaje simbólico (a cada código de operación le corresponde un nemónico o símbolo) directamente relacionado con el juego de instrucciones del procesador. Este lenguaje permite una traducción directa al código máquina, pero, al ser simbólico, simplifica su aprendizaje y memorización. A.1. Lenguaje Ensamblador pic-as (XC8) En lenguaje ensamblador, una línea de programa puede estar compuesta por los siguientes elementos: Instrucciones de programa: especifican el código de las instrucciones que serán traducidas a lenguaje máquina y ejecutadas por el microcontrolador. Directivas del ensamblador: pseudoinstrucciones que proporcionan información para el proceso de ensamblado, pero que no se traducen en código ejecutable. Controles: palabras clave que modifican el comportamiento del ensamblador durante el proceso de traducción. Tampoco generan código ejecutable. Etiquetas: identificadores asociados a líneas de código o posiciones de memoria, que permiten referenciar instrucciones o datos. No generan instrucciones ejecutables. Comentarios: anotaciones destinadas a facilitar la comprensión del código por parte del programador. No afectan al ensamblado ni al código resultante. 2025 32 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Cuadro A.1: Seudoinstrucciones o directivas. Instrucción Descripción DB Especificar el contenido en bytes en la sección activa de memoria de programa para la definición de una constante. DW Especificar el contenido en words (2 bytes) en la sección activa de memoria de programa para la definición de una constante. DS Reservar posiciones en la memoria RAM. CONFIG Especificar bits del registro de configuración del microcontrolador. END Indicación de última línea de código en ensamblador. EQU Asignar un valor a un símbolo o etiqueta. GLOBAL Declarar símbolo o etiqueta como global, permitiendo el acceso por todos los módulos del programa. INCLUDE Añadir al programa el contenido del archivo especificado. ORG Cambiar el valor de la dirección de ensamblado en la sección del programa establecida por psect. PSECT Declarar una sección de programa, acompañado de indicaciones adicionales. SET Definir o modificar símbolos o etiquetas. TITLE Asignar un título al programa. P SEC T : las secciones pueden tener los siguientes nombres: code (memoria de programa), eedata (memoria de datos en EEPROM), data (zona de datos en memoria de programa), udata (zona de memoria de datos en cualquier GPR), udata_acs (zona de memoria de datos en el Access Bank) o udata_bankn (zona de memoria de datos en un banco determinado). A.2. Instrucciones del PIC18F47Q10 Como se abordó en la sección 1.4.1, las instrucciones en los microcontroladores PIC18 están compuestas por dos partes fundamentales: Código de operación: define la operación a ejecutar, como transferencia de datos, operaciones aritmético-lógicas, saltos o rupturas de secuencia, y funciones especiales. Operandos: especifican los datos sobre los que se realiza la operación, incluyendo sus modos de direccionamiento. El PIC18F47Q10 cuenta con 75 instrucciones básicas, junto con 8 instrucciones adicionales orientadas a la recursividad y la gestión de la pila por software. Estas instrucciones ofrecen una elevada ortogonalidad, permitiendo un acceso eficiente y uniforme a los diferentes recursos del hardware. Desde el punto de vista del tamaño, las instrucciones se clasifican en dos tipos: Instrucciones de 16 bits (single-word instructions). Instrucciones de 32 bits (double-word instructions). Como se explicó previamente, un ciclo de instrucción (CI) equivale a 4 ciclos del reloj del sistema. En general: 2025 33 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Las instrucciones de 16 bits se ejecutan en un CI, excepto aquellas que implican una comprobación con resultado positivo o provocan un cambio en el contador de programa (PC), que requieren 2 CIs. Las instrucciones de 32 bits se ejecutan en 2 CIs, salvo las de comprobación con resultado positivo, que pueden requerir hasta 3 CIs. En los apartados siguientes se describirán las principales operaciones que pueden realizarse con el conjunto de instrucciones del PIC18F47Q10. Códigos de Carga o Transferencia de Información Cuadro A.2: Instrucciones para la carga y transferencia de información. Instrucción Operandos CI Descripción BSF/BCF f,b,a 1 Bit Set/Clear File - Establecer (BSF) o limpiar (BCF) el bit b del registro f . SETF/CLRF f,a 1 Set/Clear File - Establecer (SETF) o limpiar (CLRF) todos los bits del registro f . SWAPF f,d,a 1 Swap File - Intercambiar los 4 bits más significativos (MSB) con los 4 menos significativos (LSB) del registro f . LFSR f,k 2 Load FSR - Cargar el valor inmediato k (12 bits) en el registro FSR indicado por f . MOVF f,d,a 1 Move File - Copiar el contenido de f en WREG si d = 0, o en f si d = 1. MOVFF fs,fd 2 Move File to File - Copiar el contenido del registro f s al registro f d . MOVLB k 1 Move Literal to Bank Select Register - Cargar el valor inmediato k en el BSR. MOVLW k 1 Move Literal to WREG - Cargar el valor inmediato k en WREG. MOVWF f,a 1 Move WREG to File - Copiar el contenido de WREG al registro f . POP - 1 Extraer el valor del tope de la pila y lo carga en el PC. PUSH - 1 Insertar el valor actual del PC en la pila. f : dirección de registro. b: índice de bit dentro del registro f . a: tipo de acceso: a (access) = 0 o b (banked) = 1. d : destino del resultado: w (WREG) = 0 o f (registro) = 1. k: valor inmediato. 2025 34 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Códigos de Operaciones Aritméticas Cuadro A.3: Instrucciones para la realización de operaciones aritméticas. Instrucción Operandos CI Descripción ADDLW/SUBLW k 1 Add/Subtract Literal to WREG - Sumar (ADDLW) o restar (SUBLW) el valor inmediato k al contenido de WREG. ADDWF/SUBWF f,d,a 1 Add/Subtract WREG and File - Sumar (ADDWF) o restar (SUBWF) el contenido de f y WREG. ADDWFC/SUBFWB f,d,a 1 Add File with Carry / Subtract File with Borrow Sumar/restar con acarreo el contenido de f y WREG. COMF f,d,a 1 Complement File - Invertir todos los bits del registro f . NEGF f,a 1 Negate File - Obtener el complemento a dos del contenido de f . DAW - 1 Decimal Adjust WREG - Ajustar el valor en WREG al formato BCD después de una suma. INCF/DECF f,d,a 1 Increment/Decrement File - Incrementar (INCF) o decrementar (DECF) el valor del registro f . MULLW k 1 Multiply Literal with WREG - Multiplicar el valor inmediato k por WREG. MULLWF f,a 1 Multiply WREG with File - Multiplicar WREG por el contenido del registro f . Nota: el resultado de MULLW y MULLWF se almacena en los registros PRODH:PRODL (16 bits). f : dirección de registro. a: tipo de acceso: a (access) = 0 o b (banked) = 1. d : destino del resultado: w (WREG) = 0 o f (registro) = 1. k: valor inmediato. 2025 35 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Códigos de Operaciones Lógicas Cuadro A.4: Instrucciones para la realización de operaciones lógicas. Instrucción Operandos CI Descripción ANDLW k 1 AND Literal with WREG - AND lógico entre el valor inmediato k y WREG. ANDWF f,d,a 1 AND WREG with File - AND lógico entre WREG y el contenido de f . IORLW k 1 OR Literal with WREG - OR lógico entre el valor inmediato k y WREG. IORWF f,d,a 1 OR WREG with File - OR lógico entre WREG y el contenido de f . XORLW k 1 XOR Literal with WREG - XOR lógico entre el valor inmediato k y WREG. XORWF f,d,a 1 XOR WREG with File - XOR lógico entre WREG y el contenido de f . BTG f,b,a 1 Bit Toggle - Alternar (invertir) el bit b del registro f . RLCF/RRCF f,d,a 1 Rotate Left/Right through Carry - Rotar el contenido de f a la izquierda/derecha a través del bit de acarreo (C). RLNCF/RRNCF f,d,a 1 Rotate Left/Right without Carry - Rotar el contenido de f a la izquierda/derecha sin utilizar el bit de acarreo. f : dirección de registro. b: índice de bit dentro del registro f . a: tipo de acceso: a (access) = 0 o b (banked) = 1. d : destino del resultado: w (WREG) = 0 o f (registro) = 1. k: valor inmediato. 2025 36 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Códigos de Ruptura de Secuencia: Saltos Incondicionales Cuadro A.5: Instrucciones para la realización de saltos incondicionales. Instrucción Operandos CI Descripción BRA n 2 Branch Relative - Salto relativo incondicional: el PC se incrementa en 2 + 2n (16 bits, Ca2). GOTO k 2 Go To - Salto absoluto incondicional al valor de k (32 bits). CALL k,s 2 Call Subroutine - Llamada absoluta a subrutina k (32 bits). RCALL n 2 Relative Call - Llamada relativa a subrutina, PC incrementado en 2n (16 bits). RETURN s 2 Return from Subroutine - Retorno de subrutina (PC = TOS). RETFIE s 2 Return from Interrupt - Retorno de rutina de interrupción (PC = TOS). RETLW m 2 Return with Literal in WREG - Retorno de subrutina con carga de m en WREG. n: desplazamiento relativo en complemento a dos (Ca2). k: dirección absoluta de salto (32 bits). s: opción FAST : guarda/restaura STATUS, WREG y BSR. m: literal que se carga en WREG al retornar. 2025 37 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Códigos de Ruptura de Secuencia: Saltos Condicionales Cuadro A.6: Instrucciones para la realización de saltos condicionales. Instrucción Operandos CI Descripción BTFSS/BTFSC f,b,a 1 (2 o 3) Bit Test File, Skip if Set/Clear - Comprobar el bit b de f , saltar si es 1/0. TSTFSZ f,a 1 (2 o 3) Test File, Skip if Zero - Saltar si f = 0. CPFSEQ f,a 1 (2 o 3) Compare File, Skip if Equal - Comparar f con WREG, saltar si son iguales. CPFSGT f,a 1 (2 o 3) Compare File, Skip if Greater - Comparar f con WREG, saltar si f > WREG. CPFSLT f,a 1 (2 o 3) Compare File, Skip if Lower - Comparar f con WREG, saltar si f < WREG. DECFSZ f,d,a 1 (2 o 3) Decrement File, Skip if Zero - Decrementar f , saltar si f = 0. DCFSNZ f,d,a 1 (2 o 3) Decrement File, Skip if Not Zero - Decrementar f , saltar si f ̸= 0. INCFSZ f,d,a 1 (2 o 3) Increment File, Skip if Zero - Incrementar f , saltar si f = 0. INFSNZ f,d,a 1 (2 o 3) Increment File, Skip if Not Zero - Incrementar f , saltar si f ̸= 0. BC n 1o2 Branch if Carry - Saltar si STATUS[C] = 1 (PC + 2 + 2n). BNC n 1o2 Branch if No Carry - Saltar si STATUS[C] = 0 (PC + 2 + 2n). BN n 1o2 Branch if Negative - Saltar si STATUS[N] = 1 (PC + 2 + 2n). BNN n 1o2 Branch if Not Negative - Saltar si STATUS[N] = 0 (PC + 2 + 2n). BOV n 1o2 Branch if Overflow - Saltar si STATUS[OV] = 1 (PC + 2 + 2n). BNOV n 1o2 Branch if No Overflow - Saltar si STATUS[OV] = 0 (PC + 2 + 2n). BZ n 1o2 Branch if Zero - Saltar si STATUS[Z] = 1 (PC + 2 + 2n). BNZ n 1o2 Branch if Not Zero - Saltar si STATUS[Z] = 0 (PC + 2 + 2n). Nota 1: en el primer y segundo bloque de instrucciones, si no se produce el salto, la instrucción ocupa 1CI. De producirse, 2CI o 3CI, dependiendo de la instrucción incluida a continuación. Nota 2: en el último bloque de instrucciones, si no se produce el salto, la instrucción ocupa 1CI. De producirse, 2CI. n: desplazamiento relativo (complemento a dos). 2025 38 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Códigos de Especiales de Operaciones Cuadro A.7: Otros códigos especiales de operaciones. Instrucción Operandos Descripción CLRWDT - Clear Watchdog - Reiniciar el watchdog. NOP - No Operation - Operación vacía. RESET - Software Reset - Reiniciar por programa. SLEEP - Sleep Mode - Entrar al modo standby. 2025 39 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 B. M ODOS DE D IRECCIONAMIENTO DE UN MICROCONTROLADOR El modo de direccionamiento es la forma en la que se especifican los datos que intervienen en una operación, generando una dirección efectiva; es decir, la dirección del dato determinada por el modo de direccionamiento. La optimización del programa, favorecida por la existencia de distintas formas de almacenar la información (constantes, tablas, listas dinámicas, etc.), conlleva la necesidad de contar con varios modos de direccionamiento, que se detallan a continuación. Direccionamiento Inmediato o Literal En el direccionamiento inmediato, el dato forma parte de la instrucción, especificándose constantes conocidas. Un caso particular son las instrucciones de salto, en las que se indica directamente la dirección de destino (sin necesidad de calcular la dirección efectiva). Direccionamiento Absoluto o Directo En el direccionamiento directo, junto con la instrucción se especifica la dirección efectiva (DE) en la que se encuentra el dato. El tamaño del campo de dirección debe coincidir con el tamaño del espacio de memoria direccionable. Se distinguen dos posibilidades de direccionamiento: Direccionamiento global: se emplean tantos bits como sean necesarios para acceder directamente a una posición concreta de memoria. Direccionamiento en página: la memoria se divide en páginas, que son conjuntos de posiciones de memoria consecutivas. El tamaño de cada página está determinado por el número de bits asignados para su direccionamiento. El acceso a la información puede realizarse de forma: • Implícita a una página por defecto (modo access), • a través de la especificación definida en el contenido del contador de programa (PC), o • mediante la selección de página por programa a través del banco seleccionado (BSR), en modo banked. Figura B.1: Direccionamiento directo: por banco, implícito y por PC. Direccionamiento Relativo En el direccionamiento relativo, la dirección efectiva se calcula sumando el contenido del campo de dirección de la instrucción al valor actual del contador de programa (PC). Este modo se emplea principalmente en instrucciones de salto relativo, como RCALL, BRA, BZ, entre otras. Direccionamiento Indexado En el direccionamiento indexado, la dirección efectiva se obtiene sumando el contenido del campo de dirección de la instrucción al valor almacenado en un registro interno denominado 2025 40 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 registro índice. Este modo resulta útil para acceder a datos con una estructura espacial, como tablas. Es posible modificar el contenido del registro índice como parte de la instrucción, mediante mecanismos como PreInc, PreDec, PostInc o PostDec. Direccionamiento Indirecto o por Puntero En el direccionamiento indirecto, la instrucción especifica una posición de memoria que contiene la dirección completa del dato. Es decir, se accede a una dirección intermedia que a su vez apunta a la dirección real del dato. Este método puede combinarse con otros modos, dando lugar a variantes como el direccionamiento absoluto indexado o el direccionamiento indirecto postindexado. B.1. Modos de Direccionamiento del PIC18F47Q10 El PIC18F47Q10 admite cuatro modos principales de direccionamiento: implícito (Inherent), literal (Literal), directo (Direct) e indirecto (Indirect). Dentro de algunos de estos, pueden distinguirse subtipos específicos según la forma de acceder a los datos. Implícito (Inherent) En este modo, la instrucción no incluye campo de operando, ya que la operación se realiza de forma implícita sobre registros o flags predefinidos. Literal (Literal) Este modo puede clasificarse en: Inmediato: el operando es una constante (literal) incluida directamente en la instrucción. Absoluto: se especifica una dirección de salto fija, como en instrucciones GOTO. Relativo: se especifica un desplazamiento con respecto al contador de programa (PC), como en instrucciones BRA, BZ, etc. Directo (Direct) Puede subdividirse en: Absoluto: se especifica la dirección completa dentro del espacio de memoria (12 bits). En página: se utilizan 8 bits de dirección combinados con una página seleccionada mediante los registros ACCESS o BSR, dependiendo del bit de acceso a (modo access(a) o banked(b)). Figura B.2: Acceso directo por página. 2025 41 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. a64b0469ff35958ef4ab887a898bd50bdfbbe91a-12016334 Indirecto (Indirect) Este modo permite acceder a una dirección de memoria a través de punteros. Se utilizan los registros FSR0, FSR1 o FSR2 (File Select Registers), de 12 bits. Para ello se emplean instrucciones que utilizan registros virtuales asociados, como: INDFx: acceso a la dirección apuntada por FSRx. POSTINCx: acceso seguido de post-incremento de FSRx. POSTDECx: acceso seguido de post-decremento de FSRx. PREINCx: pre-incremento de FSRx seguido de acceso. PLUSWx: acceso preindexado indirecto: DE = FSRx + WREG. B.2. Códigos de Carga o Transferencia en Memoria para Tablas Cuadro B.1: Códigos para el acceso a tablas. Instrucción Operandos Descripción TBLRD* - Tabular Read - Leer dato. TBLRD*+ - Tabular Read, Post-increment - Leer dato con post-incremento. TBLRD*- - Tabular Read, Post-decrement - Leer dato con post-decremento. TBLRD+* - Tabular Read, Pre-increment - Leer dato con pre-incremento. TBLWT* - Tabular Read - Escribir dato. TBLWT*+ - Tabular Read, Post-increment - Escribir dato con post-incremento. TBLWT*- - Tabular Read, Post-decrement - Escribir dato con post-decremento. TBLWT+* - Tabular Read, Pre-increment - Escribir dato con pre-incremento. Figura B.3: Acceso a tablas. 2025 42 Por Alejandro García Peña Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
0
Puede agregar este documento a su colección de estudio (s)
Iniciar sesión Disponible sólo para usuarios autorizadosPuede agregar este documento a su lista guardada
Iniciar sesión Disponible sólo para usuarios autorizados(Para quejas, use otra forma )