F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Técnicas Digitales 2 – Año 2021 Memorias – Sistemas de Microcómputo Introducción Estructura básica de una microcomputadora Las microcomputadoras se construyen a base de microcontroladores y microprocesadores conformando así computadoras de pequeña escala que son utilizadas para aplicaciones específicas, conformando lo que se denomina “sistemas embebidos”. Estas microcomputadoras se componen de una Unidad Central de Proceso (CPU), memorias: Memoria de Programa (ROM) y Memoria de Datos (RAM), y una Unidad de Entrada/Salida que permite el intercambio de información de la microcomputadora con el mundo exterior. Además, a la micromputadora se conectan una serie de periféricos que pueden ser: pulsadores, teclado, display, relé, etc. Dentro de la microcomputadora: • • • • • La CPU contiene una Unidad Aritmético-Lógica (ALU) que es la encargada de realizar operaciones de este tipo. Y, a su vez, posee una serie de registros especiales que operan con dicha unidad. La Memoria de Programa se encarga, como su nombre lo dice, del almacenamiento del programa. Contiene el código que se ejecuta secuencialmente y es el encargado de hacer que el sistema opere de una forma particular. Esta memoria de programa puede ser del tipo ROM, EPROM, FLASH, OTP (PROM). También existe una Memoria de Datos, generalmente constituida por una SRAM, que es del tipo "volátil", es decir que, si se corta la energía se pierde la información. A veces también puede contener una memoria del tipo no volátil constituida a partir de una EEPROM. La Unidad de Entrada/Salida es la interface con el mundo exterior. Tiene múltiples pines que pueden ser configurados como entradas o salidas, comúnmente llamados “puertos”. La arquitectura mostrada en la figura une a todas las partes interiores de la microcomputadora con una serie de buses compartidos. Esta arquitectura, conocida como Arquitectura Von Neumann, es la denominada arquitectura clásica de microcomputadoras y es la más antigua de ellas. Los buses compartidos se pueden utilizar gracias a la Pryszczuk, Sabrina Daiana Página 1 de 106 F.I. U.Na.M. • • • Técnicas Digitales II (ET 446) Año 2021 tecnología de tres estados (Tristate), en la que existe un tercer estado que pone en alta impedancia la salida del dispositivo que no está habilitado. Bus de Datos: permite intercambiar información (datos e instrucciones) entre la CPU y los demás dispositivos (memoria de programa, memoria de datos y unidad de entrada/salida). Es bidireccional. Bus de Direcciones: es mediante el cual la CPU puede seleccionar direcciones, relacionadas con memorias o dispositivos de E/S, en las cuales deba leer o escribir información. Es unidireccional, solamente es la CPU quien entrega información a través de este bus. Bus de Control: está constituido por una serie de líneas individuales salientes o entrantes a la CPU. Llevan señales tales como: lectura/escritura en memoria, reloj, reset, etc. Cuando hablamos de una microcomputadora constituida a través de un microprocesador, hablamos de una microcomputadora con arquitectura abierta, es decir que se puede ampliar la cantidad de dispositivos en su mapa de memoria. En cambio, en una microcomputadora constituida a través de un microcontrolador se tiene una arquitectura cerrada, es decir que no se puede ampliar la cantidad de dispositivos en su mapa de memoria. El microcontrolador encapsula a todos los componentes (CPU, buses, memorias, unidad de E/S) y no permite el agregado de otros dispositivos. Dispositivos de Memoria Estructura de una Memoria Las memorias son dispositivos que se utilizan para almacenar información en forma binaria. El circuito elemental donde una memoria almacena 1 bit, se denomina “celda”. El conjunto de celdas forma una matriz de “m” filas por “n” columnas, con una profundidad de “N” bits para representar cada palabra a almacenar. De esta forma, en la matriz cada palabra posee una dirección (locación o posición de memoria). Este arreglo tridimensional se asemeja a una estantería donde cada estante contiene una palabra almacenada. Bus de Direcciones: Está constituido por el conjunto de conexiones eléctricas vinculado a la posición de cada palabra almacenada (número del estante donde está). A través de este bus se puede ubicar una palabra en la memoria. Una parte del bus de direcciones que tiene la memoria se asocia a las filas y otra parte a las columnas. Bus de Datos: Está constituido por el conjunto de conexiones eléctricas vinculado a los bits de las palabras almacenadas. A través de este bus se lee o escribe una palabra en la memoria. Pryszczuk, Sabrina Daiana Página 2 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Las memorias también tienen dos líneas de control que son: • CS (Chip Select – Selección de Chip): habilita el funcionamiento de la memoria. La memoria no es operativa si esta línea no tiene el estado lógico adecuado. ̅̅̅̅̅̅̅̅̅̅): 1 – habilita la lectura ̅ (Read/Write ̅̅̅̅̅̅̅̅ – Leer/Escribir • R/W de la memoria. 0 – habilita la escritura en la memoria. La capacidad de una memoria expresa la cantidad de bytes que puede almacenar. Pryszczuk, Sabrina Daiana Página 3 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Clasificación Memorias Volátiles Las más conocidas son las denominadas Memorias de Acceso Aleatorio (RAM – Random Access Memory). En las mismas se puede realizar las operaciones de lectura y escritura de datos binarios. Debido a que son volátiles, en los sistemas computacionales (computadoras y/o microcomputadoras) las memorias RAM se utilizan para el almacenamiento de datos temporales (no la utilizaríamos para guardar el programa de una microcomputadora, por ejemplo). Estas memorias se clasifican de la siguiente forma: • • SRAM (Static RAM): Almacenan sus bits en celdas constituidas por latchs. Cada conjunto de latchs constituye el registro que permite almacenar una palabra, reteniendo el estado lógico de cada bit de la misma en forma indefinida mientras se encuentre energizado el dispositivo de memoria. DRAM (Dynamic RAM): Estos dispositivos están constituidos por celdas que almacenan los datos binarios como cargas eléctricas en capacitores. La presencia o ausencia de carga en un capacitor se interpreta como el “1” o el “0” binario. Debido a que los capacitores tienden a descargarse en forma natural, las memorias DRAM requieren el refresco periódico de sus celdas para mantener memorizados los datos (incluso manteniéndolas siempre alimentadas). De ahí que el término “dinámica” hace referencia a la necesidad de refresco permanente. SRAM vs. DRAM Debido al circuito simple que poseen las celdas de memorias DRAM con respecto a las de memorias SRAM, las primeras son más pequeñas y permiten una mayor densidad de fabricación (más celdas por unidad de superficie), resultando esto en memorias más económicas que las SRAM. Como desventaja, las memorias DRAM requieren un circuito extra para realizar el refresco. El costo fijo de este circuito se ve compensado por el menor costo de las celdas, es por esto que las memorias DRAM tienden a ser las preferidas para memorias con grandes capacidades (por ejemplo, las usadas en los módulos DIMM en PCs). Debido al circuito que posee la celda de una memoria SRAM, estas generalmente son más rápidas que las DRAM. Estas características hacen que las memorias SRAM se utilicen en aplicaciones con poca capacidad de almacenamiento y alta velocidad de acceso (por ejemplo, microcomputadoras, memorias cachés de PCs, etc.). Pryszczuk, Sabrina Daiana Página 4 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Estructura de una Memoria SRAM También existen dos versiones de memorias SRAM, asincrónicas y sincrónicas. EN el caso de las SRAM sincrónicas, su operación de lectura/escritura está sincronizada con el reloj del sistema (clock de la CPU); se las utiliza como memoria caché en las PCs. Las SRAM asincrónicas no poseen señal de reloj para sincronización de la operación. Matriz de Memoria: Esta matriz define la capacidad de almacenamiento que posee el dispositivo. La matriz de una memoria SRAM puede diseñarse para almacenar palabras binarias en registros con un ancho de 1 bit, 1 nibble (4 bits), 1 byte o múltiplos de bytes. Una vez habilitada la memoria (/CS=0), con cada dirección que la CPU inyecta al bus de direcciones, los decodificadores internos del dispositivo seleccionan un registro de la matriz y mediante el bus de datos se puede leer o escribir una palabra. Cabe mencionar que la operación de lectura no borra la palabra del registro. Si /CS se encuentra en estado alto, los buffers de entrada y salida se encuentran en estado de alta impedancia e impiden que se acceda a las palabras de la memoria. Habilitación: La CPU puede acceder a la memoria si: /CS=0. Escritura: La CPU puede escribir en la memoria si: /CS=0 y /WE=0 (/OE=1). Lectura: La CPU puede leer la memoria si: /CS=0 y /OE=0 (/WE=1). Pryszczuk, Sabrina Daiana Página 5 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Estructura de una Memoria DRAM Estos dispositivos que almacenan cada bit de datos en un capacitor en lugar de un latch. La ventaja de este tipo de celda es que su sencillez permite construir matrices de memoria muy grandes en un chip, esto a un costo por bit más bajo que en el caso de las memorias SRAM. La desventaja radica en que los capacitores de las celdas requieren un circuito adicional que permita el “refresco de la carga” de los capacitores. Existen diversos tipos de memorias dinámicas, las más difundidas son las DRAM sincrónicas (SDRAM), ampliamente usadas para conformar módulos DIMM (tipo DDRx) para PCs. Cuando se desea almacenar un dato en una celda, la llave SW permite que se energice el capacitor logrando así que este se cargue a través de una tensión que es compatible con un estado lógico alto. Caso contrario, si quiero almacenar un bajo, se abre SW para así descargar al capacitor. Con respecto al refresco, este se hace mediante el buffer/amplificador de salida realizando una realimentación de tensión. Esto permite que el capacitor periódicamente se recargue. Pryszczuk, Sabrina Daiana Página 6 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Ejemplos comerciales Para leer un dato: Se debe colocar en el bus de direcciones la posición de la celda de memoria que se quiere leer, se habilita el chip y luego de un cierto tiempo se obtiene el dato. Para escribir un dato: Se realiza un procedimiento similar pero también se trabaja con la línea de escritura. Se coloca la dirección de la posición de memoria donde se quiere escribir, luego se habilita el chip y seguidamente se habilita la línea de escritura y con esto, el dato se escribe en la memoria (para ello, dicho dato debe estar presente en el bus de datos). Pryszczuk, Sabrina Daiana Página 7 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Memorias No Volátiles Estas memorias son denominadas así debido a que pueden almacenar información binaria en forma permanente, sin necesidad de energía. Es decir, la información escrita en el dispositivo de memoria no se pierde ante una falta de energía en el mismo, en los sistemas de microcómputo, este tipo de memorias se utiliza para el almacenamiento del programa y en algunas aplicaciones de datos permanentes. El siguiente diagrama muestra cómo se clasifican este tipo de memorias. Mask ROM: Estas memorias se escriben en el momento que son fabricadas. Las mismas son escritas con información permanente a pedido del usuario, quien luego solo puede leerla en la aplicación donde se la utiliza. Por una cuestión del alto costo de la máscara, este tipo de memorias son utilizadas solo en circuitos que serán producidos en forma masiva (donde el costo de la máscara se amortiza fácilmente) y que requieren un programa o datos que no serán modificados nunca más. Pryszczuk, Sabrina Daiana Página 8 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Consiste en una celda que contiene un transistor y una conexión que lo excita. Esa conexión está asociada a la fila mientras que la salida de datos de la celda está asociada a la columna. La “mascara fotográfica” utilizada en el proceso de fabricación, controla la realización de la conexión en la puerta de cada transistor. Si queda la conexión se almacena un “1” y si no queda almacena un “0”. El dato almacenado se obtiene en cada línea de columna, cuando la fila correspondiente es seleccionada (con un “1”). Ese tipo de máscara depende de la información que se quiera almacenar, por eso, este tipo de memorias se utilizan en casos muy específicos, por ejemplo, cuando el programa de la microcomputadora es fijo, ya se encuentra bien depurado y se sabe que siempre será el mismo. Si el dispositivo está habilitado (/E1=/E0=0), el bus de datos permite la lectura de una palabra de 4 bits con cada dirección que se inyecta al bus de direcciones. En este caso, la memoria está organizada en una matriz de 32 filas x 32 columnas (1024 celdas). Para seleccionar las filas se utilizan 5 líneas del bus de direcciones. Mientras que con las 3 líneas restantes y 4 decodificadores (que reciben el mismo código de entrada), se seleccionan las columnas de la matriz. PROM: Una vez fabricadas, las memorias PROM pueden escribirse una sola vez por el usuario. La escritura de estos dispositivos se efectúa eléctricamente “quemando” sus fusibles internos. Una vez que los fusibles son quemados, ya no se puede restablecer. Por este motivo, a las memorias PROM también se las denomina “programables una sola vez” OTP (One Time Programmable). Para programar (fundir los fusibles) de cada celda, se utiliza una tensión de programación Vpp que es bastante mayor a la tensión de alimentación del dispositivo Vcc. Con esa tensión y la dirección adecuada funde el fusible, de esa manera el circuito queda abierto en la celda y, posteriormente es leído como un “0”. Aquellos circuitos donde el fusible de la celda no ha sido fundido, se van a leer como “1”. Pryszczuk, Sabrina Daiana Página 9 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Ejemplo comercial: EPROM: Estas memorias pueden programarse y borrarse varias veces. La escritura es realizada eléctricamente y el borrado a través de la exposición a luz ultravioleta. El borrado es lento (puede durar de 15 a 20 minutos) e incómodo ya que se debe extraer el dispositivo del circuito para efectuar este proceso. La posibilidad de borrado/escritura que presentan estas memorias, hicieron que las mismas fueran de los primeros dispositivos utilizados para la implementación de circuitos digitales programables en su fase de prototipo. Los dispositivos tienen una especie de ventana que se debe exponer a luz ultravioleta para borrarse. La memoria se borra en su totalidad. Pryszczuk, Sabrina Daiana Página 10 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 EEPROM: Para salvar el inconveniente del borrado lento que aparece en los dispositivos EPROM, se han desarrollado las memorias EEPROM donde los procesos de borrado y escritura se efectúan eléctricamente. En estos dispositivos es posible borrar registros (palabras) en forma individual, lo cual permite que sean muy utilizados como memoria de datos permanentes. El proceso de escritura es bastante más lento al de lectura, debiéndose esto a que, para escribir una palabra, el circuito interno del dispositivo primero realiza su borrado. Otra característica a favor que presentan las memorias EEPROM, es que no requieren un voltaje externo Vpp para el proceso de escritura, el mismo se genera internamente a partir de la tensión de alimentación Vcc. FLASH: Estas memorias se pueden escribir y borrar eléctricamente, las mismas surgen como una evolución tecnológica de las EEPROM. Sus celdas son más pequeñas y estas construidas a partir de transistores MOS de puerta flotante. Esto permite la fabricación de dispositivos de memoria con alta densidad de almacenamiento (muchas celdas en poco espacio). El hecho de que puedan borrarse eléctricamente, permite realizar la escritura del dispositivo sobre el circuito (in-circuit) en el cual operan, siendo esto muy útil para el desarrollo de sistemas electrónicos en fase de prototipo. Este tipo de transistor (MOS de PF) incorpora un capacitor que al ser cargado se obtiene la escritura de la celda y al ser descargado se produce el borrado. Lectura de la celda: Al seleccionar la celda mediante las líneas de columna (LC) y de palabra (LP), siendo 0V la línea de fuente (LF), se puede leer: Pryszczuk, Sabrina Daiana Página 11 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Escritura de la celda: Consiste en cargar con electrones la PF correspondiente a la celda. Esto se logra aplicando una tensión positiva mayor a la tensión de selección en su línea de palabra (LP) y manteniendo la línea de fuente (LF) en 0V. Escribir una celda implica que la misma será leída como “0”. Borrado de la celda: Consiste en descargar los electrones de la PF correspondiente a la celda. Esto se logra aplicando una tensión positiva de borrado en su línea de fuente (LF) y manteniendo la línea de palabra (LP) sin seleccionar. Borrar una celda implica que la misma será leída como “1”. Existen dos variantes para este tipo de memorias, la FLASH tipo NOR y la FLASH tipo NAND. Estas variantes tienen que ver con la estructura con la que están conectadas las celdas en su interior. En el caso de las NOR todas las celdas se encuentran en paralelo, mientras que en las NAND se encuentran en serie. En este ultimo caso, con ese tipo de conexión se logra que el espacio entre las celdas sea mucho menor y, por lo tanto, la densidad de fabricacion mucho mas alta. La contra de esto es que para escribir palabras, se debe hacer por grupos de palabras o “páginas”, o grupos de páginas o “bloques”. Pryszczuk, Sabrina Daiana Página 12 de 106 F.I. U.Na.M. Pryszczuk, Sabrina Daiana Técnicas Digitales II (ET 446) Año 2021 Página 13 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Expansión del Ancho de Palabra Muchas veces se requiere ampliar el ancho de palabra del bus de datos de una memoria. Tal es este caso, por ejemplo, en que se tienen dos memorias ROM de 64K x 4, es decir con bus de datos de 4 bits cada una. En determinadas aplicaciones, se requieren 8 bits en el bus de datos. Para ampliar el ancho de palabra lo que se hace es conectar las dos memorias compartiendo el bus de direcciones y utilizando cada bus de datos como lo muestra la figura. De esta forma, cada vez que se direcciona un dato se accede a los 4 bits de una memoria y a los 4 bits de la otra simultaneamente, así obtenemos datos de 8 bits a la salida. Memorias Seriales Los dispositivos de memoria que se han visto anteriormente, se comunican con otros dispositivos (por ejemplo con la CPU) a través de una transmisión de datos en paralelo. En este tipo de transmisión, las palabras (direcciones y datos) intercambiadas con otros dispositivos son transferidas en forma completa y con todos sus bits en paralelo. Si bien esta tecnología de transmisión de datos presenta ventajas en cuanto a la velocidad, los sistemas electrónicos digitales obtenidos a partir de su uso resultan de un tamaño importante y que depende directamente del ancho de las palabras (N° de bits en paralelo) que se manejan. Por otra parte, debido a la presencia de interferencias (entre las líneas en paralelo), este tipo de transmisión de datos presentan limitaciones en la distancia que hay entre quienes intercambian los datos. El incremento en la velocidad de operación de los circuitos integrados que ha proporcionado el desarrollo de la tecnología, permitió el avance de la transmisión de datos en serie, donde cada palabra se transmite bit a bit (uno seguido de otro). Esta tecnología de comunicación cubre los inconvenientes mencionados para la transmisión de datos en paralelo y se aplica en numerosos dispositivos, donde la velocidad de transmision no es un factor crítico. Actualmente, en el mercado se consiguen varios dispositivos de memoria que utilizan diversos protocolos de comunicación serie, algunos de ellos se muestran a continuación. Pryszczuk, Sabrina Daiana Página 14 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Estos dispositivos trabajan con distintos tipos de bus serie, es decir donde las palabras (direcciones y datos) se transfieren a través de un par de cables en forma serie, es decir un bit detrás de otros. En las microcomputadoras se suele utilizar para expandir el sistema. Por ejemplo, si hablamos de microcomputadoras constituidas a partir de microcontroladores, una manera de ampliar la capacidad de memoria sería utilizando uno de estos dispositivos conectados a su puerto serie. Resumen Pryszczuk, Sabrina Daiana Página 15 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Unidades de Entrada – Salida Interface Adaptadora de Periféricos (PIA) Contiene dos puertos: puerto A y puerto B, cuyos pines pueden ser configurados como entrada o salida. También cada puerto tiene asociado un hardware para generar señales de interrupción que permiten interrumpir el procesamiento del programa principal. Registros de la PIA: Este dispositivo contiene una serie de registros internos a partir de los cuales se lo puede configuar. Es decir, estos registros permiten la configuración y el acceso a los puertos de la interface. Los registros DDRA y DDRB son los que se cargan con un código y de esta manera, se puede configurar cada una de las líneas del puerto (los puertos son de 8 bits) como entrada o como salida. Si se pone un “0” en el bit asociado a la línea correspondiente se transforma en una entrada y, si se pone un “1” se transforma en una salida. Los registros PRA y PRB son los que permiten la escritura o lectura de los puertos, estos dispositivos van a conectados al bus de direcciones en sus líneas de menor peso y son las que permiten seleccionar a través de las entradas RS1 y RS0 los registros correspondientes y a su vez, controlar si se va a escribir, leer o configurar el dispositivo. El bus de datos de la PIA (las 8 líneas desde D0 hasta D7) está conectado al bus de datos de la microcomputadora. La selección del dispositivo de entrada/salida se hace a través de un decodificador. Pryszczuk, Sabrina Daiana Página 16 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Interface Adaptadora de Versátil Características: • • • 2 puertos de 8 bits bidireccionales. 2 temporizadores/contadores de 16 bits programables (el temporizador usa la señal de reloj CLK=Φ2, que proviene de la CPU). 1 puerta entrada/salida serial bidireccional. Por tener más prestaciones, su configuración es más compleja. Se hace a través de 4 líneas que se conectan al bus de direcciones. Pryszczuk, Sabrina Daiana Página 17 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Microprocesadores Un microprocesador es el cerebro de una microcomputadora y conforma la Unidad Central de Procesos (CPU). Estructura Interna Un microprocesador está compuesto por tres circuitos o bloques principales: 1- Unidad Aritmético - Lógica (ALU): Realiza las operaciones lógicas y aritméticas requeridas por las instrucciones ejecutadas. 2- Decodificador de Instrucciones (ID): Decodifica el código operacional de la instrucción y envía las señales necesarias a la unidad de temporización y control para ejecutar la instrucción en curso. 3- Unidad de Temporización y Control: Sincroniza la operación del microprocesador según los pulsos del reloj del sistema y genera las señales de control necesarias para la comunicación con memorias y periféricos. También, un microprocesador, contiene una serie de registros: 1- Registro de Instrucciones (IR): Almacena la instrucción que se está ejecutando en el microprocesador. 2- Contador de Programa (PC): Almacena la dirección de la próxima instrucción que debe ejecutar el microprocesador. Una vez que la ejecución de la instrucción actual es completada, el microprocesador busca en la memoria la instrucción indicada por la dirección cargada en el PC. 3- Registros de Trabajo (R0, …, R4): Almacenan en forma temporaria datos, resultados de operaciones y también direcciones, durante la operación en curso. 4- Puntero de Pila (SP): La Pila (Stack) es un bloque de memoria LIFO (el último dato en entrar es el primero en salir) que utiliza el programa para almacenar temporalmente valores particulares durante su ejecución (generalmente, se usa una memoria RAM para esto). El SP registra la dirección del último valor cargado en la Pila. 5- Registro de Estado (SR): Este registro contiene una serie de bits denominados “banderas” (flags), los cuales indican el estado de la ALU ante la ejecución de una instrucción. Estos bits indican si hubo un resultado cero, negativo o con desbordamiento, por ejemplo. El estado de las banderas es usado en instrucciones de salto condicional para modificar el flujo de ejecución del programa. 6- Registro de Dato de Memoria (MDR) y de Dirección de Memoria (MAR): El registro MDR contiene el dato leído o que se va a escribir. La dirección del mismo corresponde al valor cargado en el registro MAR. Pryszczuk, Sabrina Daiana Página 18 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Microprocesador de 8 bits Se dice que es de 8 bits porque su bus de datos tiene 8 bits y está diseñar para operar con datos de 8 bits. Actualmente, existen microprocesadores que pueden trabajar hasta con 64 bits, son los que se usan, por ejemplo, en las computadoras. Este microprocesador tiene un bus de direcciones de 16 bits, por lo cual es capaz de direccionar 64K posiciones de memorias, es decir desde 0 hasta 65535 direcciones. Pryszczuk, Sabrina Daiana Página 19 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Mapeo de Memoria – Diseño del Decodificador En las microcomputadoras de arquitectura abierta, el diseño del decodificador de direcciones permite ubicar a los dispositivos en el espacio de memoria direccionable por el microcontrolador. De esta forma se efectúa el mapeo de su memoria, donde se puede acceder a cada dispositivo mediante el rango de direcciones asignado por el decodificador. Estos dispositivos pueden ser memorias o unidades de entrada/salida (puertos). En este caso, vamos a diseñar el decodificador de direcciones de una microcomputadora conformada por un microprocesador, el cual debe acceder a los distintos dispositivos de memoria y una unidad de entrada/salida. La función del decodificador es activar el CS (Chip Select) de cada dispositivo según la dirección que el microprocesador ponga en el bus de direcciones. De esa forma, se puede ubicar en el mapa de memoria direccionable por la CPU los distintos dispositivos que utilizará la microcomputadora. Como en este caso, se pueden ubicar una RAM, una unidad de entrada/salida, una EEPROM y una FLASH en distintos lugares de la memoria. Hay espacios que se pueden dejar libres para ser utilizados en otro momento por otros dispositivos. Ejemplo Considerando un microprocesador que posee un bus de direcciones de 16 bits, diseñar el decodificador que permite ubicar en el mapa de memoria los siguientes dispositivos: - Memoria de programa EPROM (16kB), al final del mapa. Memoria RAM (8kB), a partir de la posición 1000h. Memoria RAM (8kB), a continuación de la siguiente. Unidad de E/S (16 registros), al inicio del mapa. Teniendo esta información, primeramente, tenemos que determinar el rango de posiciones de memoria que ocupará cada dispositivo. Teniendo en cuenta la capacidad de memoria de cada dispositivo, cada uno de estos ocupará el siguiente espacio en el mapa de memoria: - EPROM (16kB): 4000h posiciones, de C000h a FFFFh. RAM1 (8kB): 2000h posiciones, de 1000h a 2FFFh. Pryszczuk, Sabrina Daiana Página 20 de 106 F.I. U.Na.M. - Técnicas Digitales II (ET 446) Año 2021 RAM2 (8kB): 2000h posiciones, de 3000h a 4FFFh. Unidad de E/S: 16 posiciones, se puede tomar de 0000h a 0FFFh (las 4K posiciones de memoria iniciales). Este tipo de suposiciones permiten simplificar el circuito del decodificador. Se podría hacer que el decodificador active solamente en las 16 primeras posiciones, pero en ese caso el circuito queda bastante más complejo y tal vez no tiene sentido. La contra de esta suposición es que se pierde espacio de memoria, porque la unidad de E/S queda utilizando toda esa porción de memoria siendo que solamente requiere 16 posiciones. A partir de haber determinado el rango de direcciones de cada dispositivo, el mapa de memoria direccionable por el microcontrolador queda como lo muestra la siguiente figura: Al principio la unidad de E/S, seguidamente la RAM1, después la RAM2 y al final, la memoria de programa. Considerando los rangos de direcciones que utilizará cada dispositivo podemos analizar las direcciones involucradas en los mismos. Teniendo en cuenta los 4 bits más significativos para este caso. De esta manera, podemos observar que existen variaciones en esos 4 bits más significativos para los 4 dispositivos, por lo tanto, es conveniente diseñar un decodificador que active esas salidas en porciones de 4K, es decir, 16 porciones de 4. De esa forma, llegamos al siguiente circuito. Pryszczuk, Sabrina Daiana Página 21 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Este circuito está compuesto por dos decodificadores 74LS138, donde, a través de la conexión al bus de direcciones (A12, A13, A14 y A15) cada salida pone un “0” con un rango de 4K posiciones de memoria. De esta manera, la unidad E/S estará en la primera de las salidas y será activa en las direcciones que van desde 0000h hasta 0FFFh (es decir, se activa solo en ese rango). Cuando el microcontrolador ponga en su bus de direcciones, alguna dirección desde 1000h hasta 2FFFh, lo que hará es activar, en una primera mitad la salida O1 y en una segunda mitad la salida O2, la suma de las dos nos da 8K direcciones. Con una compuerta AND se pueden unificar esas dos salidas en una sola y la salida del AND va a poner un “0” cuando el microprocesador ponga alguna dirección dentro del rango seleccionado. Los CS son activos en bajo, por eso es que se busca poner un “0” en las salidas. Para la salida de CS2 (RAM2), es exactamente lo mismo que en el caso de CS1 (RAM1). Para el caso de la memoria de programa (CS3), su capacidad es mayor y utiliza 16K, por lo tanto, se deben unificar 4 salidas del decodificador, esto se hace mediante una configuración de compuertas AND. De esta forma, cada vez que el microprocesador ponga una dirección correspondiente a uno de los rangos, los CS correspondientes serán activados. Siempre un solo dispositivo a la vez, nunca pueden operar dos porque la idea es que cada dispositivo tenga acceso a los buses uno a la vez. Finalmente, la interconexión entre el decodificador diseñado y los dispositivos seleccionables queda como lo indica la siguiente figura: El decodificador que hemos diseñado está conectado a las líneas más significativas del bus de direcciones y cada una de sus salidas va a los CS de los 4 dispositivos. Pryszczuk, Sabrina Daiana Página 22 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 En el caso de la unidad de E/S las líneas que permiten el direccionamiento de su registro, estarán conectadas a las 4 líneas menos significativas del bus de direcciones. Mientras que, en el caso de la RAM1 y la RAM2, como son cada una de 8K es suficiente usar las 13 primeras líneas del bus de direcciones. En cambio, con la memoria de programa, como tiene el doble de capacidad requiere utilizar las 14 primeras líneas del bus de direcciones. Pryszczuk, Sabrina Daiana Página 23 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Técnicas Digitales 2 – Año 2021 Microcontroladores – Atmega2560 Introducción Estructura básica de un microcontrolador Un microcontrolador constituye una microcomputadora de arquitectura cerrada, es decir que no se puede ampliar su capacidad interna. Vienen encapsulados en un chip y no hay posibilidades de expansión. Está constituido por una CPU, memoria de programa, memoria de datos y unidad de entrada-salida. Los dispositivos de memoria y la unidad de entrada-salida se interconectan con la CPU mediante buses. Existe un bus de datos, un bus de direcciones y un bus de control. Éstos son de acceso compartido. El programa se encuentra en la memoria de programa y éste es ejecutado gracias a la señal de reloj o siguiendo la señal de reloj que posee la CPU. A través de su unidad E/S se puede conectar con periféricos como teclado, display, motores, buses, leds, tarjetas SD, etc. Pryszczuk, Sabrina Daiana Página 24 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Arquitectura de los microcontroladores Arquitectura Von Neumann: • Arquitectura clásica, solo tres buses (sencilla). • Los dispositivos ubicados en un solo mapa de memoria. • Bus de datos compartido para instrucciones y datos. • Ancho de palabra de instrucción limitada al ancho de palabra de datos o múltiplo de la misma. • No se puede acceder a datos e instrucciones en forma simultánea (un solo bus de datos). • Reducción en la velocidad de procesamiento de las instrucciones. CISC (Complex Instruction Set Computer): Instrucciones potentes (efectúan operaciones complejas), esto optimiza el uso de memoria. Instrucciones complejas utilizan varios ciclos de reloj para la ejecución. Varios modos de direccionamiento, esto dificulta el aprendizaje de la programación. Arquitectura Harvard: • • Arquitectura con múltiples buses (más compleja). • Los dispositivos ubicados en distintos mapas de memoria. • Bus de datos independientes para instrucciones y datos. • Ancho de palabra de instrucción diferente al ancho de palabra de datos. Permite que las instrucciones puedan ocupar una sola palabra en la memoria de programa (más fácil de ejecutar y pudiéndose hacer esto en un solo ciclo). • Puede acceder a datos e instrucciones en forma simultánea (procesamiento paralelo, pipeline). Aumento en la velocidad de procesamiento de las instrucciones. RISC (Reduced Instruction Set Computer): Instrucciones sencillas que pueden ser ejecutadas en un solo ciclo de máquina. Esto aumenta velocidad de procesamiento, pero los programas ocupan más memoria debido a la mayor cantidad de instrucciones para una tarea determinada. Pocos modos de direccionamiento, lo cual facilita el aprendizaje de la programación. Hoy en día, prácticamente todos los microcontroladores utilizan arquitectura Harvard. Pryszczuk, Sabrina Daiana Página 25 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Arduino MEGA El Arduino MEGA es una placa que contiene un microcontrolador ATmega2560. Este microcontrolador internamente posee un bus de datos de 8 bits y una unidad aritmético-lógica que está diseñada para manejar con datos de tamaño de palabra, por lo tanto, se dice que es un microcontrolador de 8 bits. La placa se puede alimentar con tensiones de 7 – 12 V, pero el microcontrolador requiere una tensión de 5 V, es por ello que en el interior de la placa hay reguladores de tensión. Los pines de E/S también operan con 5 V, es decir que para poner un “1” en la entrada tenemos que ponerle 5 V, por ejemplo. El microcontrolador funciona con un cristal externo de 16 MHz (clock). También posee una memoria FLASH de 256 KB de los cuales 8 KB en el Arduino está pregrabado un programa “bootloader”. Este programa lo que hace es gestionar la información que viene desde la PC donde el usuario hace el programa y la transfiere a la memoria FLASH. También tiene una memoria RAM estática de 8 KB, una memoria EEPROM de 4 KB, múltiples pines de E/S (digitales y analógicos) y tiene una gran capacidad de corriente, de hasta 20 mA por pin de E/S. Hay que ser cuidadosos igual, porque esto no quiere decir que en un puerto que, por lo general, tienen 8 pines, se puede inyectar 20 mA en cada pin. Hay que revisar las hojas de datos donde dice la cantidad de corriente por puerto. Pryszczuk, Sabrina Daiana Página 26 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 El siguiente esquema nos muestra la distribución de pines de la placa Arduino. Todos los cuadros en gris oscuro y tienen numeración de dos dígitos son los números de pines propios de la placa Arduino. Después se pueden ver otras etiquetas donde aparecen nombres como “PF0”, “PF1”, estos corresponden a los pines del puerto “F”. También se puede ver etiquetas en verde que indican que esos pines son parte de las entradas analógicas. Y así sucesivamente. ATmega2560 Es un microcontrolador de 8 bits construido con tecnología CMOS de baja potencia, basado en la arquitectura AVR RISC mejorada. Es fabricado por la firma ATMEL (actualmente de MICROCHIP). Pryszczuk, Sabrina Daiana Página 27 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Arquitectura de la CPU ALU – Unidad Aritmética Lógica: La ALU soporta operaciones aritméticas y lógicas entre registros o entre una constante y un registro. Esta unidad también puede ejecutar operaciones de registro único. La ALU funciona en conexión directa con los 32 registros de trabajo de propósito general (R0 a R31). En un solo ciclo de reloj se puede ejecutar operaciones aritméticas entre registros de propósito general o entre un registro y un valor inmediato. Las operaciones que puede efectuar la ALU se dividen en tres categorías principales: Aritmética, Lógica, y Funciones de Bit. Después de una operación aritmética, el registro de estado (SREG) actualiza sus flags para reflejar información sobre el resultado de la operación. PC – Contador de Programa: El registro PC es el encargado de alojar la dirección de la próxima instrucción que ejecutará el microcontrolador. Es decir, siempre “apunta” a la parte del programa que se ejecutará próximamente. Pryszczuk, Sabrina Daiana Página 28 de 106 F.I. U.Na.M. Pryszczuk, Sabrina Daiana Técnicas Digitales II (ET 446) Año 2021 Página 29 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 SREG – Registro de Estado: El registro de estado contiene información sobre el resultado de instrucción aritmética que se ha ejecutado por ultimo. Esta información puede utilizarse para alterar el flujo del programa realizándose saltos condicionales en el mismo. Nota: Cuando ocurre una interrupción, SREG no se almacena automáticamente al ejecutarse la rutina de servicio a la interrupción y tampoco es restablecido al volver de esta rutina. Por tal motivo, el almacenamiento de SREG debe ser manejado por el programa del usuario. R0 … R31 – Registros de Trabajo de Propósito General: Estos registros permiten optimizar el conjunto de instrucciones que utilizan los microcontroladores AVR. La mayoría de las instrucciones que operan con estos registros tienen acceso directo a los mismos y se ejecutan en un solo ciclo. Para lograr mayor rendimiento y flexibilidad, estos registros pueden operar como: - Un operando de salida de 8 bits y una entrada de resultado de 8 bits. Dos operandos de salida de 8 bits y una entrada de resultado de 8 bits. Dos operandos de salida de 8 bits y una entrada de resultado de 16 bits. Un operando de salida de 16 bits y una entrada de resultado de 16 bits. Cada registro de trabajo posee una dirección en la memoria de datos, mapeándose directamente en las primeras 32 ubicaciones. Aunque no se implementan físicamente como ubicaciones de memoria SRAM, esta organización proporciona una gran flexibilidad de acceso a los datos, ya que los registros R26 … R31 pueden utilizarse como punteros de direcciones de 16 bits para direccionamiento indirecto de la memoria de datos. Los tres registros utilizados para direcciones indirectas surgen de las siguientes concatenaciones: Pryszczuk, Sabrina Daiana Página 30 de 106 F.I. U.Na.M. Pryszczuk, Sabrina Daiana Técnicas Digitales II (ET 446) Año 2021 Página 31 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 SP (SPH:SPL) – Puntero de Pila (Stack Pointer): Pila (Stack): Es un bloque de memoria (generalmente de la SRAM) organizado en forma de pila LIFO (el último dato que entra es el primero que sale). Es utilizada para el control interno del microcontrolador, almacenando direcciones de retorno (valores del registro PC) después de interrupciones y de llamadas a subrutinas. También se la puede usar para almacenar temporalmente datos del usuario, por ejemplo, registros de trabajo, el registro SREG, entre otros. En los microcontroladores ATmega, este bloque es una porción de la SRAM. Si bien, esto permite una pila de gran tamaño, hay que tener cuidado de que la misma no “pise” los datos de usuario. Puntero de Pila (Stack Pointer, SP): Este registro siempre almacena la dirección del tope de la pila. Ejemplo: Apilamiento/Desapilamiento del registro PC (de 3 bytes) en un ATmega2560 Apilamiento: en el primer caso la pila esta vacía y el puntero está apuntando a la posición de memoria 21FF, luego de que sucede algo en el microcontrolador como por ejemplo un salto a una subrutina, se almacena en la pila el valor del contador de programa que en este caso es una palabra de 3 bytes. Cuando sucede esto, el SP se incrementó en 3 posiciones quedando en la posición 21FC. Desapilamiento: Cuando se retorna de la subrutina, se produce el desapilamiento automático. Se extraen los datos y el SP vuelve a 21FF. Es decir, el SP siempre apunta al tope de la pila. En los ATmega el SP toma un valor por defecto (ante un RESET) que corresponde a la dirección de la última posición de memoria SRAM. Este registro se encuentra implementado en dos partes de 8 bits (SPH y SPL) como se muestra a continuación. Pryszczuk, Sabrina Daiana Página 32 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 La operación de carga/descarga de la pila, puede ser automática al producirse una interrupción o bien cuando el programa ejecuta alguna de las siguientes instrucciones: Pryszczuk, Sabrina Daiana Página 33 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Memoria de Programa (FLASH) Pryszczuk, Sabrina Daiana Página 34 de 106 F.I. U.Na.M. Pryszczuk, Sabrina Daiana Técnicas Digitales II (ET 446) Año 2021 Página 35 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Memoria de Datos (SRAM) Registros de Trabajo: Estos registros de los microcontroladores AVR cumplen las mismas funciones que los acumuladores en otros microcontroladores. Son utilizados por todas las instrucciones para almacenar información temporalmente. Esta información puede ser datos (de 8 bits) o direcciones de datos a la cual se apunta (en caso de los punteros X, Y y Z). Registros de E/S Estándar: Estos registros almacenan información de configuración y control tanto del microcontrolador como de sus periféricos. Algunos ejemplos de estos son: - Registros Puntero de Pila (SP) y Contador de Programa (PC). Manejo de la memoria EEPROM. Configuración y acceso a los puertos. Registros de E/S Extendido: Ídem anterior, pero para otros periféricos (ADC, USART, etc.). SRAM Interna: Es el espacio de memoria donde el usuario puede almacenar datos temporales que utilizara el programa alojado en la memoria FLASH. Constituye la memoria de datos del usuario. SRAM Externa: Esta porción de memoria forma parte de la Interfaz de Memoria Externa que posee el dispositivo (sólo en algunos dispositivos ATmega). Permite agregar al mapa de memoria dispositivos externos tales como: memorias (SRAM y FLASH), periféricos como ser display LCD, ADCs y DACs. Es decir, posibilita expandir la arquitectura del microcontrolador, agregando otros dispositivos. Nota: Los registros de E/S estándar y extendido, pueden apreciarse en la hoja de datos de los dispositivos (ATmega328P – Pág. 428; ATmega2560 – Pág. 399). Pryszczuk, Sabrina Daiana Página 36 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Programación La programación de un microcontrolador consiste en grabar su memoria de programa, con la secuencia de instrucciones que deberá ejecutar para que realice una tarea determinada. Esta secuencia de instrucciones constituye el programa o algoritmo lógico del microcontrolador (firmware). Ejecución de las Instrucciones Pryszczuk, Sabrina Daiana Página 37 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Instrucciones Estructura de una Instrucción Las instrucciones son “códigos binarios” que al ejecutarse hacen que el microcontrolador efectúe una operación determinada. Las instrucciones poseen dos campos: Pryszczuk, Sabrina Daiana Página 38 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Lenguaje Assembler Para no trabajar con los códigos binarios de las instrucciones, los fabricantes de microcontroladores disponen del lenguaje ASSEMBLER o ENSAMBLADOR, donde a cada código operacional se le asigna un “apodo” denominado “MNEMONICO”. CLR Rd =borrar registro destino LDI Rd,K = cargar un valor inmediato en un registro ADD Rd,Rr = sumar el contenido de dos registros Grupos de Instrucciones 1. 2. 3. 4. 5. Instrucciones Aritméticas y Lógicas Instrucciones para Transferencia de Datos Instrucciones de Salto Instrucciones para Modificar Bits Instrucciones para Controlar el MCU. Nota: En el “AVR Instruction Set Manual” se explica en detalle la operación y el formato de cada una de las instrucciones. Pryszczuk, Sabrina Daiana Página 39 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Instrucciones Aritméticas y Lógicas Estas instrucciones pueden utilizarse para efectuar operaciones aritméticas y lógicas con el contenido de un registro, entre un valor constante y el contenido de un registro y también con el contenido de dos registros de trabajo. A continuación, vemos algunas instrucciones: Cabe destacar que es una suma aritmética con datos de 8 bits. Se tiene en cuenta el bit de acarreo que está presente en el registro código de condiciones o registro de estado. Si C=1 indica que la suma superó el máximo permisible con 8 bits. Pryszczuk, Sabrina Daiana Página 40 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Instrucciones para Transferencias de Datos Estas instrucciones se utilizan para intercambiar datos entre los registros de trabajo y la memoria del dispositivo (SRAM y FLASH). Algunas instrucciones de este grupo sólo pueden operar con direcciones dentro de los “Registros E/S Estándar”, mientras que otras instrucciones con estas posiciones de memoria y también las incluidas en los “Registros de E/S Extendido”. A continuación, vemos algunas instrucciones: Pryszczuk, Sabrina Daiana Página 41 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Instrucciones de Saltos Estas instrucciones son utilizadas para modificar el flujo del programa. Es decir, para realizar “saltos” a distintas partes del mismo. Todos los saltos se efectúan modificando el registro contador de programa (PC). Dentro de este grupo de instrucciones también existen algunas que efectúan operaciones solo para afectar al registro de estado (SREG) y así luego se podrá realizar un salto en base al estado de los flags de dicho registro. Existen distintos tipos de saltos: A) Incondicionales: Se produce el salto al ejecutar la instrucción. B) Condicionales: El salto se produce si se cumple una condición. Esta ultima es verificada por la instrucción, testeando el estado de los flags del registro SREG. C) Absolutos: Son aquellos saltos donde la instrucción sustituye directamente el contenido del PC por la dirección del salto. D) Relativos: En este caso, la dirección destino del salto se obtiene sumando un offset “k” al registro PC. En el ejemplo: el programa carga (LDI) dos registros de la CPU (R16 y R17) con valores distintos (00 y FF), luego decrementa en 1 (DEC) a R17, después efectúa una comparación (CPSE) entre los dos registros: si son iguales, se saltea la siguiente instrucción (RJMP) y se pasa a la instrucción JMP que es un salto absoluto que se va hacia el principio (etiqueta “loop”) y vuelve a ejecutar todo el programa; si no son iguales, se ejecuta la instrucción siguiente RJMP que es un salto relativo que hace que la siguiente instrucción a ejecutarse sea la que está etiquetada con “menos1”, es decir, DEC R17. Como se pudo observar, en este caso, las direcciones tanto del salto relativo como del salto absoluto están sustituidas por etiquetas. Cuando uno ensambla el programa, es decir, lo traduce de código fuente a código máquina, el programa ensamblador computa y sustituye las etiquetas por cada valor correspondiente. Pryszczuk, Sabrina Daiana Página 42 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Subrutina: Es una porción del programa utilizada para efectuar tareas repetitivas (equivale a una función en lenguaje “C”). Además de colaborar con una estructura de programa ordenada, el uso de subrutinas reduce el tamaño del programa haciendo que se utilice menos cantidad de memoria para almacenarlo. Para trabajar con subrutinas debe utilizarse las instrucciones CALL y RET indicadas a continuación. CALL = salto absoluto. Cuando se ejecuta esta instrucción suceden dos cosas más aparte de modificarse el contador del programa: se almacena en pila (stack) la dirección de la próxima instrucción que se ejecutaría antes del salto y el contenido del SP se decrementa en una cantidad de posiciones de manera tal de que quede almacenado dicho contador de programa. RET: En este caso se desapila el contador de programa (PC), se transfiere la direccion que esta en la pila hacia el contador de programa. De esta manera el microcontrolador vuelve a ejecutar la siguiente instrucción desde donde se había realizado el salto a la subrutina. El desapilamiento tambien genera un incremento en el SP. BRNE: es un salto condicional pero también es un salto relativo. Lo que hace es sumarle un offset al PC para obtener la proxima direccion de la instrucción que se debe ejecutar, ese offset es un numero entre -64 y +63 en sistema de complemento a 2. En este ejemplo, el programa lo que hace es togglear el MSB de un dato de la posición 200. Cada vez que lo togglea, se salta a una subrutina para demorar el dato con ese valor dutante un instante de tiempo determinado. Se carga el valor 01 en el registro 16. Se almacena ese valor en la posición 200. Se llama a la subrutina “delay”, se produce un salto. En este salto, el registro R17 se carga con el valor decimal 255, se decrementa en 1. En BRNE se testea el bit cero: si despues de haber decrementado en 1 el valor es distinto de 0, el bit Z se pone en 0 por lo tanto, se produce un salto a loop1 y nuevamente decrementa el registro. Así se queda en un bucle decrementando el registro 17 hasta que el mismo se hace 0. En ese momento el bit Z del SREG se pone en 1 y ya la condición que produce el salto no se verifica, por lo tanto se continua y se ejecuta la instrucción RET. Es decir, se vuelve a la siguiente instrucción del programa principal después del salto, en este caso CLR que borra el registro 16. Nuevamente con STS se almacena ese valor en la posicion 200. Se vuelve a llamar a la rutina de retardo “delay”. Se vuelve ejecutar el bucle hasta que R17 se hace 0, se ejecuta la instrucción de retorno y vuelve a la ultima instrucción del progrma principal RJMP la cual hace un salto relativo al inicio del progrma y se vuelve a ejecutar todo nuevamente. Pryszczuk, Sabrina Daiana Página 43 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Instrucciones de Salto Condicional: Una instrucción que permite determinar el mayor de dos números se denomina BRSH. BRGE hace lo mismo, pero considera el bit de signo. Pryszczuk, Sabrina Daiana Página 44 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Instrucciones para Modificar Bits Estas instrucciones se utilizan para cambiar el estado de un bit en un registro, en el registro SREG y también para efectuar corrimientos de bits en un registro. A continuación, vemos algunas instrucciones: Pryszczuk, Sabrina Daiana Página 45 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Instrucciones para Controlar el MCU Este grupo de instrucciones para controlar al microcontrolador, se emplea para activar o influir sobre algunas de las características del mismo. Modos de Direccionamiento Los modos de direccionamiento constituyen las diferentes formas en que la CPU accede a la memoria de datos (registros de trabajo, registros de E/S estándar y extendido) y a la memoria de programa (FLASH), para ejecutar las instrucciones. En los microcontroladores ATmegaXXXX, se tienen los siguientes modos de direccionamiento: Pryszczuk, Sabrina Daiana Página 46 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Direccionamiento Inherente o Implícito En este modo de direccionamiento el operando de la instrucción se encuentra implícito en el opcode de la misma. Las instrucciones con este modo de direccionamiento ocupan 16 bits. En estos casos, en la instrucción no se aprecia un operando explicito. El mismo mnemónico de la instrucción es el que tiene toda la información necesaria para que el microcontrolador realice una tarea. Direccionamiento Inmediato En este modo de direccionamiento el operando de la instrucción esta constituido por un registro de trabajo destino (Rd) y un valor constante (K). Al ejecutarse la instrucción, el resultado de la operación entre el contenido de Rd y K es almacenado en el registro Rd. Direccionamiento Directo a Registro C1) Directo a un registro: En este modo de direccionamiento, el operando de la instrucción es un registro de trabajo (Rd o Rr) o un bit (b) del mismo. Las instrucciones utilizan este modo para modificar el contenido del registro o uno de sus bits del mismo. Pryszczuk, Sabrina Daiana Página 47 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 C2) Directo a dos registros: En este modo de direccionamiento el operando esta conformado por dos registros de trabajo (Rd y Rr) entre los cuales la instrucción realizara la operación. Un registro es la fuente Rr y el otro el destino Rd. El resultado de la operación efectuada por la instrucción es almacenado en el registro de destino Rd. Direccionamiento Directo a Registro de E/S En este modo de direccionamiento, el operando de la instrucción esta constituido por un registro de trabajo (Rr o Rd) y la dirección (A) de un registro de E/S estándar o bien dicha dirección y el numero de uno de sus bits (b). Las instrucciones utilizan este modo de direccionamiento para acceder a los registros de E/S estándar, por lo cual las direcciones utilizadas pueden ser 0 ≤ A ≤ 63 (un total de 64 registros de E/S). Solo las instrucciones IN y OUT permiten acceder a todos los registros de E/S estándar. Nota: Los registros de E/S extendido, se acceden a través de modos de direccionamiento a datos. Pryszczuk, Sabrina Daiana Página 48 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Direccionamiento Directo a Dato (Datos de Usuario) En este modo de direccionamiento el operando de la instrucción esta constituido por un registro de trabajo (Rr o Rd) y la dirección (k) de una posición de memoria de dato (incluyendo registros de E/S extendido). La dirección k puede ser de 8 o 16 bits. Cuando la dirección es de 16 bits, las instrucciones que utilizan este modo de direccionamiento pueden acceder a los registros de trabajo, registros de E/S estándar y extendido, y también a la memoria de datos de usuario. Pryszczuk, Sabrina Daiana Página 49 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Direccionamiento Indirecto a Dato (Datos de Usuario) Este modo de direccionamiento generalmente es utilizado cuando debe operarse con bloques de datos (tablas). La dirección del dato en memoria SRAM no está explícitamente en la instrucción, sino que la misma se encuentra almacenada en uno de los registros punteros X (R27:R26), Y (R29:R28) o Z (R31:R30) que se obtienen por la concatenación de los registros de trabajo correspondientes. Las variantes de este modo de direccionamiento son: F1) Indirecto: En este caso la dirección del dato al que se quiere acceder, deber estar previamente cargado en X, Y o Z. Con esto la instrucción accede al dato al que apuntan los registros mencionados. F2) Indirecto con desplazamiento: En este modo, la instrucción posee un desplazamiento “q” y el registro puntero Y o Z (no se utiliza X) contiene la dirección correspondiente al dato. Al ejecutar la instrucción con este modo, la dirección del dato al que se va a acceder es obtenida a través de la suma entre el desplazamiento “q” y la dirección residente en el registro puntero utilizado (Y o Z). Ejecutada la instrucción, el contenido del registro puntero no cambia. F3) Indirecto con pre-incremento: Para este modo, el acceso al dato se hace a través de la dirección obtenida decrementando en 1 la dirección contenida en el registro puntero X, Y o Z. El decremento mencionado se efectúa antes de ejecutar la instrucción. Luego que la instrucción se ejecuta, el registro puntero utilizado queda decrementado en 1. F4) Indirecto con post-incremento: En este caso, el acceso al dato se hace a través de la dirección presente en el puntero utilizado. Luego de que la instrucción es ejecutada, su contenido se incrementa en 1. Direccionamiento Directo a Memoria de Programa (FLASH) Este modo de direccionamiento lo utilizan las instrucciones CALL (llamado a subrutina) y JMP (salto incondicional), para acceder a instrucciones en la memoria de programa. Al ejecutar cualquiera de las dos instrucciones, el registro contador de programa (PC) se carga con una dirección de memoria de programa “k”, incluida en la instrucción. Ambas instrucciones constituyen saltos “absolutos”. Pryszczuk, Sabrina Daiana Página 50 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Direccionamiento Relativo a Memoria de Programa (FLASH) Este modo de direccionamiento lo utilizan las instrucciones RCALL (llamado relativo a subrutina) y RJMP (salto incondicional relativo), para acceder a instrucciones en la memoria de programa. Al ejecutarse cualquiera de las dos instrucciones, al contenido actual del registro PC (es decir PC+1) se le suma un offset “k” de 12 bits con signo. Esto permite modificar en forma relativa el contenido de dicho registro en -2048 o +2048 posiciones de memoria hacia atrás o hacia adelante respectivamente. Ambas instrucciones constituyen saltos “relativos”. Direccionamiento Indirecto a Memoria de Programa (FLASH) Este modo de direccionamiento lo utilizan las instrucciones ICALL (llamado indirecto a subrutina) e IJMP (salto incondicional indirecto), para acceder a instrucciones en la memoria de programa. Al ejecutar cualquiera de las dos instrucciones, el PC se carga con la dirección almacenada en el puntero Z (R31:R30). Pryszczuk, Sabrina Daiana Página 51 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Direccionamiento a Constante en Memoria de Programa (FLASH) Este modo de direccionamiento lo utilizan las instrucciones LPM (carga desde memoria de programa) y SPM (almacena en memoria de programa) para acceder a los bytes de la memoria de programa. La dirección de la posición de memoria a la que se desea acceder debe almacenarse previamente en los 15 bits mas significativos del puntero Z, mientras que (solo para LPM) el estado lógico del bit menos significativo del puntero (Z0) se usa para definir si se accederá al byte mas alto o bajo como lo muestra la figura 1. En el caso de la instrucción SPM, el bit Z0 debe ser “cero”. Direccionamiento a Constante con Post-incremento a Memoria de Programa (FLASH) Este modo de direccionamiento lo utiliza la instrucción LPM (carga desde memoria de programa) para acceder a los bytes de la memoria de programa. La dirección de la posición de memoria a la que se desea acceder, debe alojarse en los 15 bits más significativos del puntero Z, mientras que el estado lógico del bit menos significativo del puntero (Z0) se usa para definir si se accederá al bit alto o bajo como lo muestra la figura 2. Luego de ejecutarse la instrucción, la dirección en Z se incrementa en 1. Pryszczuk, Sabrina Daiana Página 52 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Memoria de Programa (FLASH) Memoria Flash: Almacena las instrucciones (palabras de 16 o 32 bits). Vectores: Alojan instrucciones relacionadas con la ocurrencia de un evento (reset e interrupciones). Cada vector posee una dirección particular (vector) en la memoria de programa. De esta forma, cuando se produce el evento, el registro PC se carga con la dirección asociada al mismo. La siguiente tabla muestra la dirección de los vectores y los eventos asociados: Pryszczuk, Sabrina Daiana Página 53 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Nota: La lista anterior determina los niveles de prioridad de las diferentes interrupciones ante el suceso simultaneo de las mismas. Cuanto menor sea la dirección, mayor será el nivel de prioridad. RESET tiene la prioridad más alta. Sección Bootloader: Esta porción de memoria flash permite almacenar el programa bootloader (no incluido de fabrica), el cual se ejecuta por unos instantes al resetearse el microcontrolador. Gracias a la capacidad de auto programación que posee la memoria flash de estos dispositivos, el bootloader puede escribir y leer código en la memoria de programa, sin la necesidad de herramientas externa complejas (solo se requiere un conversor USB a TTL, la placa Arduino MEGA ya lo tiene incorporado). Pryszczuk, Sabrina Daiana Página 54 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Memoria de Datos Señales y Opciones de Clock Señales de Reloj Señal de Clock CPU (clkCPU): Es la señal de reloj que utiliza la CPU para ejecutar las instrucciones. Por lo cual, inhibir esta señal impide que el dispositivo realice operaciones generales y cálculos. Señal de Clock I/O (clkI/O): Esta señal de reloj es utilizada por la mayoría de los módulos de E/S, como ser TIMERS, SPI y USART. El módulo de Interrupción Externa también utiliza esta señal de reloj, pero debe considerarse que algunas alarmas externas son detectadas por lógica asíncrona, permitiendo que tales interrupciones sean detectadas incluso si la señal de reloj de E/S se detiene. Señal de Clock FLASH (clkFLASH): Esta señal de reloj controla la operación de la memoria flash y esta activa simultáneamente con la señal “clkCPU”. Señal de Clock ASY (clkASY): Esta señal permite que los TIMERs sean sincronizados directamente desde un reloj externo que puede ser de 32.768 kHz. Esto posibilita que los TIMERs se utilicen como reloj de tiempo real, incluso cuando el dispositivo esta en modo de reposo (sleep). Señal de Clock ADC (clkADC): El ADC esta provisto de un reloj dedicado, lo cual permite realizar la operación de conversión reduciendo el ruido generado por los circuitos digitales internos. Esto proporciona resultados de conversión ADC más precisos. Pryszczuk, Sabrina Daiana Página 55 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Opciones de Reloj del Sistema Oscilador a cristal de baja potencia: Los pines XTAL1 y XTAL2 permiten la conexión de un resonador cerámico o un cristal de cuarzo a un amplificador inverso interno del microcontrolador, el cual puede utilizarse como oscilador para generar la señal de reloj del sistema clkSYS. El valor de C1 y C2 depende de la frecuencia del resonador o cristal utilizado, de la capacitancia parasita de la conexión y el ruido electromagnético del entorno. Para resonadores cerámicos con Fosc de 0,4 MHz a 0,9 MHz, C1=C2 deben ser los recomendados por el fabricante. Para cristales con Fosc de 0,9 MHz a 16 MHz, C1=C2 deben ser de 12 pF a 22 pF. Pryszczuk, Sabrina Daiana Página 56 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Oscilador a cristal en rango completo: En esta configuración también se utilizan los pines XTAL1 (entrada) y XTAL2 (salida) para conectar un cristal que forma parte del oscilador interno del microcontrolador y que genera la señal de reloj del sistema clkSYS. En este caso, la configuración permite operar al microcontrolador en entornos ruidosos y la salida XTAL2 también puede manejar otras entradas de reloj. El consumo de corriente es mayor que en el caso anterior. Esta configuración puede utilizarse solo la cuando la tensión de alimentación del dispositivo es de 2,7 V a 5,5 V. El valor de C1 y C2 depende de la frecuencia de cristal utilizado, la capacitancia parasita de la conexión y el ruido electromagnético del entorno. Para cristales con Fosc de 0,4 MHz a 16 MHz, C1=C2 deben ser de 12 pF a 22 pF. Oscilador a cristal de baja frecuencia: Se utiliza generalmente cuando se quiere tener una señal de reloj de tiempo real. El dispositivo puede utilizar un cristal de 32.768 kHz como parte del oscilador baja frecuencia que posee el dispositivo. Este cristal puede conectar a los pines XTAL, cuando se desea que el mismo forme parte del oscilador que proporciona la señal de reloj del sistema clkSYS, o bien los pines TOSC cuando se dese que el mismo forme parte del oscilador para el modulo TIMER 2 que posee. El valor de los capacitores externos “Ce” puede obtenerse a través de: Oscilador RC interno calibrado: El microcontrolador posee un oscilador RC interno que puede utilizarse para generar la señal de reloj del sistema clkSYS, sin necesidad de componentes externos. Este oscilador proporciona una señal con frecuencia entre 7,3 MHz y 8,1 MHz, la cual es calibrada a 8 MHz (en condiciones: Vcc=3V; tamb=25°C; precisión +/-10%) durante el reset del dispositivo, cuando el hardware interno carga el valor de calibración preprogramado de fabrica en el registro OSCCAL (posición 0x66). El valor preprogramado de fabrica reside en la posición 0x000 correspondiente a los “Signature Bytes”. Durante la operación del microcontrolador, el valor del registro OSCCAL puede ser modificado por el programa del usuario para ajustar la frecuencia de oscilación según el rango indicado anteriormente. Oscilador RC interno de 128 kHz: Es un oscilador RC interno de baja potencia que proporciona una señal de reloj de sistema de 128 kHz. La frecuencia es nominal a Vcc=3V y 25°C. Este oscilador también es usado para generar la señal de reloj del “perro guardián (WDT)”. Señal de reloj externa: El dispositivo también permite la inyección de una señal de reloj externa a través del pin XTAL1, la cual puede ser de una frecuencia no mayor a 16 MHz. Cuando se utiliza esta configuración de reloj, debe evitarse cambios bruscos en la frecuencia de la señal aplicada para asegurar un funcionamiento estable de la MCU. Una variación en la frecuencia de mas del 2% puede conducir a un comportamiento impredecible. Si se requieren cambios de mas del 2%, asegurarse de que el dispositivo se mantenga en estado de RESET durante los cambios. Pryszczuk, Sabrina Daiana Página 57 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Prescaler del reloj del sistema: Como lo muestra la figura, el ATmega2560 posee un prescaler para reloj del sistema. El mismo puede configurarse a través del registro CLKPR (0x61). Este recurso puede utilizarse para disminuir la frecuencia del reloj del sistema y así bajar el consumo de energía del dispositivo (cuando esto sea un requisito de diseño). El prescaler afecta solo a algunas de las opciones de fuente de reloj utilizadas en el microcontrolador. Fuentes de Reset ¿Qué sucede cuando se resetea el ATmega2560? Cuando se produce el reinicio del dispositivo, todos los registros de E/S (de configuración/uso de los módulos internos) se cargan con valores predeterminados y el programa inicia la ejecución desde el Vector de Reset (0x0000). Si el programa embebido en el microcontrolador utiliza interrupciones, el Vector de Reset debe alojar una instrucción de salto (por ejemplo, JMP, salto absoluto) a la rutina principal para poder saltear los vectores de interrupciones de las fuentes de interrupción utilizadas en el programa. Una vez que ha se ha reseteado el dispositivo, se produce un retardo (tTOUT) que provoca una prolongación del estado de reset interno para permitir que sucedan algunos eventos. Por ejemplo, que la tensión de alimentación del dispositivo alcance un nivel estable antes de que comience la operación normal del mismo o que estabilice la señal del oscilador que proporciona CLKSYS. Este tiempo de prolongación del reset interno es definido por el usuario a través de los fusibles SUT y CKSEL. Por otra parte, existen diferentes fuentes que ocasionan el reset del dispositivo, estas pueden ser de origen interno o externo al mismo como se muestra a continuación. El diagrama del circuito indicado en la siguiente figura muestra la lógica de reset. Pryszczuk, Sabrina Daiana Página 58 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Watchdog Reset Este temporizador posee un contador que cuenta los pulsos generados por un oscilador interno de 128kHz. Si el perro guardián (WDT) está habilitado, puede producir un reset, una interrupción o bien ambos. Esto cada vez que su temporización finaliza (desborda su contador). De esta forma, en funcionamiento normal del WDT, se requiere que el programa ejecutado utilice la instrucción WDR (Watchdog Timer Reset) para borrar al contador del WDT antes que se desborde. Si esto no sucede, se producirá un reset, una interrupción del sistema o bien ambos. Según esto, el WDT puede operar de tres formas: - - Modo interrupción: El WDT proporciona una interrupción cuando expira su temporizado. Esta interrupción puede utilizarse para despertar al dispositivo de algunos de los modos SLEEP, y también como un temporizador general del sistema. Modo reset: El WDT proporciona un reset cuando expira su temporizado. Normalmente este modo se utiliza para evitar que el dispositivo se “cuelgue” al quedar ejecutando el programa en un bucle infinito. Pryszczuk, Sabrina Daiana Página 59 de 106 F.I. U.Na.M. - Técnicas Digitales II (ET 446) Año 2021 Modo interrupción-reset: Combina los modos anteriores, generando primero una interrupción y luego el reset. Este modo permite, por ejemplo, un apagado seguro al guardar (en memoria no volátil) datos críticos durante la interrupción, antes de reiniciar el dispositivo. Cuando el temporizado del WDT expira, genera un pulso de reinicio corto con duración de 1 ciclo de reloj, como se aprecia en la figura. En el flanco descendente de este pulso, produce un estado de reset durante un tiempo de espera tTOUT que depende de la configuración de los fusibles SUTx. Pryszczuk, Sabrina Daiana Página 60 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Power-On Reset El microcontrolador posee un circuito interno que monitorea su tensión de alimentación VCC. Este circuito denominado de POR, puede utilizarse para activar el reset de arranque, así como para detectar un fallo en la tensión de alimentación. Al energizar el microcontrolador, el circuito POR detecta cuando VCC alcanza el voltaje umbral VPOT (rising) e inicia el estado de reset interno hasta que se cumple el tiempo de espera tTOUT, cuyo valor depende de la configuración de los fusibles SUTx. Este proceso también se genera (sin la presencia del retardo tTOUT) cuando la tensión VCC disminuye por debajo del valor del voltaje umbral VPOT (falling). Ambos valores de la tensión umbral figuran en la siguiente tabla. Pryszczuk, Sabrina Daiana Página 61 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Esta temporización permite que tanto la tensión de alimentación como la señal de reloj generada por el oscilador del sistema se estabilicen. Muchas veces la tensión de alimentación demora mucho en estabilizarse por lo tanto en esa situación se utilizan circuito para extender el estado de reset. En este caso, el capacitor proporciona un retraso a la desactivación del reset. De esta manera la tensión de alimentación tiene un tiempo mayor al tiempo tTOUT para estabilizarse. El tiempo tTOUT también es configurable a través de los bits de configuración que tienen los fusibles del microcontrolador. External Reset Este reset se genera por un nivel bajo en el pin RESET. Este pin puede recibir un pulso que cumpla con las características indicadas en la siguiente tabla. Cuando la señal aplicada al pin alcanza el voltaje de reposición del umbral VRST (en su flanco ascendente), se produce un estado de reset durante un tiempo de espera tTOUT que depende de la configuración de los fusibles SUTx. El reset externo se genera, incluso si el reloj del sistema no está funcionando. Pryszczuk, Sabrina Daiana Página 62 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Brown-Out Reset El dispositivo posee un circuito para detección de apagado (BOD) que supervisa el nivel de tensión en AVCC (no pin VCC) durante el funcionamiento, comparándolo con un nivel de disparo fijo VBOT, Este nivel puede ser seleccionado con los fusibles BODLEVEL. Cuando el BOD está habilitado y la tensión en AVCC disminuye a un valor por debajo del nivel de disparo VBOT-, el Reset de Brown-Out se activa inmediatamente. Cuando la tensión en AVCC aumenta por encima del nivel de disparo VBOT+, se produce un estado de reset durante un tiempo de espera tTOUT que depende de la configuración de los fusibles SUTx. El circuito BOD sólo detecta una caída en AVCC si la tensión permanece por debajo del nivel de disparo VBOT- durante un tiempo mayor que tBOD. El nivel de activación del circuito BOD posee una histéresis para asegurar la detección libre de picos. La histéresis mencionada, está dada por: donde VBOT depende de los fusibles BODLEVEL. Fusibles de Configuración Los fusibles de configuración (ubicados en la memoria Flash) permiten modificar ciertas características de operación del dispositivo. Estos se “queman o programan” al grabar la memoria flash del dispositivo. Los mismos están agrupados en tres palabras de un byte cada una, como se muestra a continuación: Pryszczuk, Sabrina Daiana Página 63 de 106 F.I. U.Na.M. Pryszczuk, Sabrina Daiana Técnicas Digitales II (ET 446) Año 2021 Página 64 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Programación en Assembler Partes del programa Encabezado: Posee información referente al autor, fecha de desarrollo, versión del programa, tarea que realiza el mismo, etc. Pryszczuk, Sabrina Daiana Página 65 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Inclusión: La directiva include le dice al ensamblador que lea y ensamble un archivo especificado. En este caso m2560def.inc contiene la especificación del microcontrolador utilizado (a través de la directiva device), las definiciones de sus registros de E/S (y sus respectivos bits), de los fusibles de configuración, las delimitaciones de las memorias de datos y de programa, etc. Comentarios: Describen las tareas realizadas para documentar la operación del programa. Se escriben seguido de “;” o bien de “//”. Definiciones: En esta parte se definen, direcciones, constantes y registros. También se puede definir bits. La directiva equ asigna un valor (constante que no puede cambiarse o redefinir posteriormente) a una etiqueta, la cual será utilizada en las instrucciones del programa. En este caso, la directiva mencionada se usa para dar un nombre a las posiciones (direcciones) de memoria SRAM y también a algunas constantes. La directiva def es para referenciar a los registros mediante etiquetas que pueden utilizarse en el resto del programa para referirse a los mismos. En este caso se usa para asignar un nombre a los registros de trabajo que se utilizan en el programa. Origen: La directiva org establece el origen del programa en la memoria de programa. Es decir, en qué dirección de esta memoria se encontrará su primera instrucción. En este caso recibe la dirección 0x0000, coincidente con el vector de reset del microcontrolador utilizado. De esta forma, cada vez que se produce un reset, el dispositivo ejecutará la instrucción alojada en dicho vector (LDI temp1, val_1). Rutina principal: Contiene el conjunto de instrucciones que se ejecuta de forma cíclica, para efectuar la tarea deseada por el usuario. Pryszczuk, Sabrina Daiana Página 66 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Técnicas Digitales 2 – Año 2021 Uso de los Puertos, Programación en C, Manejo de Interrupciones Puertos del Microcontrolador Los puertos del microcontrolador son los periféricos que utiliza el dispositivo para poder comunicarse con el exterior. Los mismos permiten el ingreso y salida de información. Los puertos están constituidos por una serie de líneas o pines que generalmente pueden configurarse individualmente como salida o entrada digital. En algunos casos pueden configurarse como entradas analógicas. A continuación, explicaremos el procedimiento para utilizar los puertos incluidos en el ATmega2560. Pryszczuk, Sabrina Daiana Página 67 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Pines compartidos: Como se puede ver en el diagrama de pines, los puertos poseen líneas de E/S compartidas con otras funciones que corresponden a otros módulos internos del microcontrolador. El manejo de los puertos requiere la utilización de los tres registros indicados a continuación. Estos están ubicados en la zona correspondiente a los Registros de E/S de la memoria SRAM. • • • DDRx (Data Direction Register): Escribiendo un código adecuado en este registro, se configuran (individualmente) como entrada (bit=0) o salida (bit=1) los pines del puerto. Cada bit de este registro se denomina DDxn. PORTx (Port Register): Escribiendo un código adecuado en este registro, los pines del puerto se ponen en “0” o “1”. Cada bit de este registro se denomina PORTxn. PINx (Port Input Pins): Leyendo este registro se puede saber el estado lógico que tienen los pines del puerto. Cada bit de este registro se denomina PINxn. La siguiente tabla muestra la configuración de los pines de cada puerto a través de los bits indicados. Nota: “x” corresponde a uno de los puertos (A, B, C, etc.), mientras que “n” a uno de sus pines (de 0 a 7). PUD es un bit del registro MCUCR. Cada pin del puerto posee una resistencia pull-up que puede ser habilitada a través del bit PUD que se encuentra en el registro MCUCR. Pryszczuk, Sabrina Daiana Página 68 de 106 F.I. U.Na.M. Pryszczuk, Sabrina Daiana Técnicas Digitales II (ET 446) Año 2021 Página 69 de 106 F.I. U.Na.M. Pryszczuk, Sabrina Daiana Técnicas Digitales II (ET 446) Año 2021 Página 70 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 La tensión de entrada para un pin digital en bajo (Vil) va desde -0,5 V hasta 0,3 Vcc, siendo Vcc de 3 a 5 V. En el caso de la placa Arduino, el ATmega2560 se encuentra alimentado a través de un regulador de voltaje de 5V. La tensión de entrada para un pin digital en alto (Vih) puede estar entre un 0,6 Vcc y Vcc + 0,5 V. Respecto a la tensión de salida en bajo (Vol), sin superar los límites de corriente de carga de 20mA, la salida máxima para un “0” es de 0,9 V. Mientras que para un “1” (Voh), la salida mínima es de 4,2 V para una corriente de 20 mA. Las corrientes de entrada, tanto en bajo como en alto, son muy bajas y del orden de 1uA. En cuanto a los límites de corriente de salida, cada pin puede operar con hasta 20 mA tanto en entrada como en salida, pero hay que tener cuidado por que se deben cumplir las condiciones dadas en los puntos 3 y 4. Programación en C – Compilador AVR-GCC El entorno de desarrollo del software “Atmel Studio” posee el compilador AVR-GCC que permite traducir el código fuente desarrollado en C al código máquina que se descarga en el dispositivo. Ahora veremos algunas reglas para utilizar este compilador. Identificadores Los identificadores corresponden a los nombres o etiquetas que pueden darse a constantes, variables y funciones que posee el programa escrito en lenguaje C. Las reglas para definir estos nombres son: • • • Los identificadores son sensitivos a mayúsculas y minúsculas. Los identificadores pueden ser de cualquier longitud, pero algunos compiladores pueden reconocer sólo un número limitado de caracteres, como los primeros treinta y dos. Existen palabras reservadas que no pueden usarse como identificadores. Estas palabras deben escribirse en minúsculas. La siguiente tabla indica las palabras reservadas en este compilador. Pryszczuk, Sabrina Daiana Página 71 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Variables y Constantes Las variables y constantes son almacenadas en la memoria limitada del microcontrolador. Por lo cual, el compilador necesita saber cuánta memoria reservar para cada variable sin perder el espacio de memoria innecesariamente. En consecuencia, debe declarar las variables, especificando tanto el tipo como su tamaño. La siguiente tabla indica los tipos de variables y sus tamaños asociados: Variables Locales: Son posiciones de memoria asignadas por el compilador. Estas variables no son accesibles desde otras funciones, lo que significa que su alcance se limita a las funciones en las que se declaran. Variables Globales: Son posiciones de memoria asignadas por el compilador que pueden ser accedidas y modificadas por cualquier función del programa. Estas variables normalmente se borran cuando se inicia el main() del programa. Pryszczuk, Sabrina Daiana Página 72 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Operadores Los operadores son símbolos que indican al compilador qué tipo de operación debe realizarse usando sus identificadores circundantes. Nota: En el desplazamiento lógico se completa con “0”. Pryszczuk, Sabrina Daiana Página 73 de 106 F.I. U.Na.M. Pryszczuk, Sabrina Daiana Técnicas Digitales II (ET 446) Año 2021 Página 74 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Arreglos Los arreglos son variables que corresponden a un agrupamiento de datos de un mismo tipo. Los arreglos permiten representar vectores (arrays unidimensionales) y matrices (arrays multidimensionales). Los elementos de los arreglos se almacenan secuencialmente en la memoria del dispositivo, siendo identificada cada posición mediante un índice. El primer elemento del arreglo posee el índice “cero”. Punteros Los punteros son variables utilizadas para guardar la dirección de una variable, constante o función. Un puntero se declara anteponiendo a su identificador el operador “*”: El operador “&” se utiliza para obtener acceso a la dirección de una variable. Esta dirección puede asignarse al puntero y es el valor del puntero. Pryszczuk, Sabrina Daiana Página 75 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Funciones Una función es un encapsulamiento de un bloque de sentencias que se puede utilizar mas de una vez en un programa (como si fueran subrutinas). Las funciones se escriben generalmente para dividir los elementos operativos de un programa en sus partes fundamentales. Esto permite que el programador depure cada elemento (función) y luego utilice ese elemento una y otra vez en el programa desarrollado. Una de las principales ventajas en el uso de funciones es el desarrollo de “bibliotecas”. A medida que se desarrollan funciones que realizan una determinada tarea, pueden ser guardadas y utilizadas posteriormente por una aplicación diferente. Esto ahorra tiempo, ya que las funciones desarrolladas pueden ser reutilizadas. Un programa está constituido por una función principal (rutina principal) y a veces por una o mas funciones secundarias (subrutinas). La función principal contiene la estructura principal del programa, desde la cual puede llamarse a una o mas funciones secundarias. Las funciones secundarias pueden o no permitir el pasaje de parámetros entre la misma y la función principal, como se indica en los siguientes ejemplos. Pryszczuk, Sabrina Daiana Página 76 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Control del Flujo del Programa Pryszczuk, Sabrina Daiana Página 77 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Uso de los Puertos – Ejemplo A modo de ejemplo de uso de los puertos del microcontrolador, a continuación, mostramos una aplicación donde se pretende el encendido secuencial de 8 leds conectados al puerto A del mismo. El estado de la llave asociado al pin PC0, permitirá habilitar la secuencia de encendido mencionada. Secuencia de inicio: • • • • Encendido secuencial de LED7 a LED0 (se enciende sólo un LED a la vez). Encendido secuencial de LED0 a LED7 (se enciende solo un LED a la vez). Se enciende solo el nibble bajo del puerto A (LED3 a LED0). Se enciende solo el nibble alto del puerto A (LED7 a LED4). Durante operación: • • Si la llave SWITCH está abierta, los leds se mantienen apagados. Si la llave SWITCH está cerrada, los leds se encienden uno a uno desde el LED7 al LED0 y del LED0 al LED7 y así sucesivamente con esta secuencia. Programa en lenguaje Assembler: Pryszczuk, Sabrina Daiana Página 78 de 106 F.I. U.Na.M. Pryszczuk, Sabrina Daiana Técnicas Digitales II (ET 446) Año 2021 Página 79 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Programa en lenguaje C: Pryszczuk, Sabrina Daiana Página 80 de 106 F.I. U.Na.M. Pryszczuk, Sabrina Daiana Técnicas Digitales II (ET 446) Año 2021 Página 81 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Manejo de Interrupciones Concepto Las interrupciones son mecanismos o recursos que posee el microcontrolador para atender a eventos originados por alguna fuente interna o externa al mismo. Ante una interrupción, el dispositivo deja la rutina principal y realiza un salto para ejecutar la rutina de servicio a la interrupción (RSI) para atender al evento que originó la interrupción. Cuando se completa la RSI, la CPU retorna a la rutina principal ejecutando la siguiente instrucción a la que se dejó para atender a la interrupción. Atención a Eventos Mediante Encuesta o Polling: La rutina principal del programa que es ejecutado en el dispositivo verifica el estado del evento (por ejemplo: lectura de su flag correspondiente) y actúa en consecuencia cuando el mismo se activa. Es decir, la rutina principal encuesta en forma periódica el estado del evento. Mediante Interrupciones: La rutina principal no requiere verificar el estado del evento. Cuando se usan interrupciones, el hardware del dispositivo es “sensibilizado” al estado activo del evento en cuestión, pudiéndose ejecutar la rutina principal sin necesidad de que la misma realice una encuesta periódica. De esta forma, cuando el evento se genera, interrumpe a la rutina principal y esta deja de ejecutarse para atender a dicho evento (ejecuta la rutina de servicio a la interrupción RSI). • • La interrupción puede producirse en cualquier parte de la rutina principal (es de origen aleatorio). Por lo cual, el dispositivo debe finalizar la ejecución de la instrucción en curso y también debe resguardarse el contexto (algunos registros importantes) de la tarea que se está realizando para luego continuar con la misma. Para retornar a la rutina principal y ejecutar la siguiente instrucción desde donde se produjo la interrupción, al finalizar la SRI debe recuperarse el contexto resguardado (algunos registros importantes). Con esto el dispositivo puede continuar con la tarea interrumpida. Pryszczuk, Sabrina Daiana Página 82 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Vector de Interrupción Es una posición de memoria de programa predefinida que se carga en el registro PC al producirse una interrupción habilitada. Es decir, corresponde a la dirección a la que apunta el programa cuando sucede la interrupción. Gestión de Interrupciones en los Microcontroladores Jerarquizada: El dispositivo posee un único vector de interrupciones. Entonces cada vez que sucede una interrupción, el registro PC se carga con la dirección de este vector y comienza a ejecutarse la RSI. Al principio de esta rutina, debe testearse los flags de las interrupciones habilitadas y con el resultado de eso saltar a la RSI correspondiente. De esta forma, se identifica el evento que ocasionó la interrupción. El orden en que se efectúa el testeo de los flags, permite establecer una prioridad en la atención de interrupciones, que se produzcan en forma simultanea (prioridad por software). Algunos dispositivos con este tipo de gestión: PIC12Fxxx, PIC16Fxxx, etc. Sectorizada: El dispositivo posee un vector de interrupción por cada evento. De esta forma, cuando sucede el evento que ocasiona la interrupción habilitada, el registro PC se carga con la dirección del vector correspondiente y comienza a ejecutarse su RSI (no debe testearse flag para identificar el evento que interrumpe). En este tipo de gestión de interrupciones, la prioridad de atención a las interrupciones está dada por el fabricante a través de una tabla de prioridades (tabla de vectores de interrupción) que es fija y no puede modificarse. Cuando dos o más eventos producen la interrupción simultánea, el dispositivo apunta a la interrupción de mayor prioridad en la tabla mencionada. Algunos dispositivos con este tipo de gestión: ATmega2560, ATmega328P, etc. Mixta: El dispositivo posee dos vectores de interrupción, uno para eventos de alta prioridad y otro para eventos de baja prioridad. Los eventos que provocan interrupciones son configurables como de alta o baja prioridad. De esta forma, pueden existir varias interrupciones de alta y varias de baja prioridad, cada una con una RSI donde se testean los flags correspondientes para determinar el evento que interrumpió y así saltar a su RSI correspondiente. Es la combinación de las gestiones jerarquizada y sectorizada. Algunos dispositivos con este tipo de gestión: PIC18Fxxx, PIC24Fxxx, etc. Pryszczuk, Sabrina Daiana Página 83 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Proceso de Interrupción en el ATmega2560 Ocurre la interrupción y sucede lo siguiente: 1) En forma automática finaliza la ejecución de la instrucción en proceso y en la “pila” se almacena el contenido del registro PC (dirección de la próxima instrucción que se debería ejecutar). El registro PC es cargado con la dirección del vector de interrupción correspondiente, produciéndose un salto a ejecutar la instrucción que se encuentra en esta dirección. También el bit de habilitación global de interrupciones “I” pasa al estado lógico “cero” a modo de inhibir la atención a cualquier otro evento de interrupción durante la ejecución de la RSI actual. 2) La dirección correspondiente al vector de interrupción debe alojar una instrucción de salto a modo de que se direccione la ejecución del programa hacia la RSI correspondiente. 3) Se ejecuta la RSI correspondiente. Dentro de la misma debe realizarse lo siguiente: • Inicialmente es necesario almacenar el contexto. Es decir, realizar una copia de algunos registros que son importantes para continuar la ejecución de la rutina principal del programa (por ej.: SREG, algunos registros de los puertos en uso, etc.) El contexto puede almacenarse en algunos registros de trabajo (R0, R1, …) o bien en la “pila”. • Luego debe ejecutarse la rutina que efectúa la tarea correspondiente a la atención de la interrupción. • A continuación, debe restablecerse el contexto. Es decir, hay que volver a cargar los registros importantes con los valores almacenados en el inicio de la RSI. 4) La ultima instrucción a ejecutar en la rutina de servicio a la interrupción debe ser RETI (Return from Interrupt). Esto permite volver a habilitar las interrupciones en forma global (se pone I en “uno”) y también actualiza el registro PC con la dirección que se había “apilado” al producirse la interrupción. De esta forma, el dispositivo retorna a la rutina principal para ejecutar la instrucción seguida a la de ocurrencia de la interrupción. Nota: Si uno o más eventos de interrupción habilitados se producen mientras el microcontrolador está ejecutando una RSI, estas interrupciones originadas quedarán pendientes hasta que finalice la RSI mencionada. Al finalizar esta última, se atenderán las interrupciones pendientes, siguiendo la prioridad indicada por la tabla de vectores que presenta el fabricante en la hoja de datos. Pryszczuk, Sabrina Daiana Página 84 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Algunas Fuentes de Interrupción en el ATmega2560 Manejo de Interrupciones – Ejemplo A modo de ejemplo sobre el manejo de interrupciones en el microcontrolador, a continuación, se muestra una aplicación donde el dispositivo cuenta en binario mostrando el resultado en 8 leds conectados al puerto A. La cuenta puede detenerse o proseguir mediante el accionamiento de la llave “S”. El dispositivo posee la interrupción externa INT0 configurada para detectar flancos ascendentes. De esta forma, cada vez que S se cierra detiene/continúa el conteo. Secuencia de Inicio: Al iniciar el programa • • • • Encendido de todos los leds durante 500 ms. Apagado de todos los leds durante 500 ms. Encendido de todos los leds durante 500 ms. Apagado de todos los leds durante 500 ms. Durante operación: • • Primeramente, si la llave S se cierra, inicia el conteo. Luego si la llave se cierra nuevamente, el conteo se detiene La secuencia anterior permite cambiar entre los estados de conteo y detenido. Pryszczuk, Sabrina Daiana Página 85 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Programa en Assembler: Con el registro EICRA seleccionamos a qué tipo de flanco será sensible la interrupción, en este caso flanco ascendente. Luego se habilita la interrupción correspondiente con “out EIMSK, temp” y se borra el flag de esa interrupción para evitar alguna interrupción espuria. Y, con la instrucción “sei” habilitamos globalmente las interrupciones. Es decir, para habilitar la interrupción tenemos dos llaves: una llave que habilita la instrucción en particular (“out EIMSK, temp”) y otra llave maestra (“sei”) que habilita globalmente las interrupciones modificando el bit I del SREG. Pryszczuk, Sabrina Daiana Página 86 de 106 F.I. U.Na.M. Pryszczuk, Sabrina Daiana Técnicas Digitales II (ET 446) Año 2021 Página 87 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Programa en C: Se debe incluir el archivo “avr/interrupt.h” que contiene las macros correspondientes para gestionar las interrupciones. También, si tenemos variables globales que van a ser utilizadas dentro de las SRI se deben declara como “volatile” como en este caso la variable “FLAG”. En este compilador, siempre la RSI debe estar arriba del programa principal. Pryszczuk, Sabrina Daiana Página 88 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Si no se habilitan las interrupciones con la instrucción “sei” tanto en Assembler como en C, no se podrán ejecutar interrupciones. Pryszczuk, Sabrina Daiana Página 89 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Técnicas Digitales 2 – Año 2021 Uso de Temporizadores y PWM Temporizadores del Microcontrolador El ATmega2560 cuenta con seis temporizadores, dos de ellos de 8 bits y los cuatro restantes de 16 bits. Vamos a describir en detalle uno de ellos, los otros son semejantes en su funcionamiento. El siguiente es el timer/counter0, el cual es un temporizador o contador de 8 bits, cuenta con una señal de reloj que puede pasar a través de un prescaler de hasta 10 bits. Puede cumplir con las funciones de modulación de ancho de pulso (PWM), es decir generar en una o dos salidas del microcontrolador una señal de frecuencia fija y ancho de pulso variable. También puede cumplir con la función de Output Compare (OC) [comparación de salida] que lo que permite es comparar el temporizador con valores precargados en su interior y conmutar una salida cuando el temporizador alcanza ese valor. Además, tiene una función de generación de frecuencia que es semejante a la anterior, pero en este caso, la salida togglea. Y, por último, una función de contador de eventos que permite utilizar el contador del temporizador como un contador de pulsos a través de un pin (T0) de entrada al microcontrolador. Dentro del funcionamiento como temporizador, hay dos modos de operación: Normal o Free Running y CTC o por comparación. Dentro del funcionamiento como PWM también hay dos modos de operación: Fast o Modo Rápido y Phase Correct o Fase Correcta. Pryszczuk, Sabrina Daiana Página 90 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 También, este temporizador cuenta con tres fuentes de interrupción independientes: • • • Por desbordamiento (TOV0): cuando el timer supera su cuenta máxima Por igualación de comparación en OC0A: se carga un valor en el registro OC0A que se denomina “canal A”. Por igualación de comparación en OC0B: ídem anterior, pero en el registro del canal B. La estructura de este módulo es la siguiente: Pryszczuk, Sabrina Daiana Página 91 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Modos de operación Modo Normal (Timer Free-Running) En este modo el conteo de pulsos de la señal de reloj (en este caso del oscilador de cristal del microcontrolador) es siempre ascendente. El valor de la señal de reloj puede pasar por un prescaler y esto introduce un cambio en la temporización. Cuando el contador del timer alcanza el valor MAX=0xFF, se resetea pasando a 0x00. Cuando esto sucede, el flag de desbordamiento del timer se hace TOV0=1. La temporización se calcula a través de: Modo CTC (Timer con Comparación) En este modo también el conteo de pulsos de reloj es ascendente. Cuando el contador del timer alcanza el valor TOP=OCR0A se reinicia pasando a 0x00. Cuando esto sucede, el flag de la unidad Output Comparte se hace OCF0A=1. La temporización se calcula a través de: Pryszczuk, Sabrina Daiana Página 92 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Modo Fast PWM En este modo el conteo de pulsos de reloj es ascendente. Cuando el contador del timer alcanza el valor TOP se reinicia pasando a 0x00. Según la configuración, el TOP puede ser 0xFF o el valor cargado en OCR0A. En este último caso de configuración, el valor del ciclo útil se debe cargar en el registro OCR0B. El pin OC0x puede configurarse para operar no invertido, invertido o togglear. En caso de que TOP=OCR0A, el pin OC0A no puede usarse para generar la señal PWM, debe usarse el pin OC0B. Pryszczuk, Sabrina Daiana Página 93 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Modo Phase Correct PWM En este modo el conteo de pulsos de reloj primero es ascendente de 0x00 hasta el valor de TOP y luego descendente de TOP a 0x00. Según la configuración, el TOP puede ser 0xFF o el valor cargado en OCR0A. El pin OC0x puede configurarse para operar NO invertido, invertido o togglear. Pryszczuk, Sabrina Daiana Página 94 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Registros Para configurar las características de funcionamiento del módulo timer0, se deben tener en cuenta dos registros: Los tres bits marcados permiten configurar el modo de operación. Esto se muestra en la siguiente tabla: A su vez, los cuatro pines MSB del registro TCCR0A permiten modificar el estado activo de los pines de cada canal. Como son cuatro bits, son dos por cada canal. Esto se puede ver en la siguiente tabla donde cada columna corresponde a un modo de operación distinto: Pryszczuk, Sabrina Daiana Página 95 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 También hay que tener en cuenta que los tres bits LSB del registro TCCR0B nos permiten determinar el prescaler. Hay que tener cuidado porque inicialmente, cada vez que se resetea el microcontrolador, estos tres bits están en 0. Lo cual indica que el timer0 se encuentra parado, es decir que la señal de reloj que llega está inhibida. Para que empiece a contar como mínimo debe estar seteado en 1. Pryszczuk, Sabrina Daiana Página 96 de 106 F.I. U.Na.M. Pryszczuk, Sabrina Daiana Técnicas Digitales II (ET 446) Año 2021 Página 97 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Técnicas Digitales 2 – Año 2021 Uso del Conversor Analógico Digital Introducción Un Conversor Analógico – Digital (ADC) es un dispositivo que permite convertir una variable analógica en un valor digital, representado por un numero binario con cierta cantidad de bits. La variable analógica puede provenir de una variable física como ser temperatura, presión, voltaje, etc. El valor digital no solo depende de la variable analógica, sino que también está en función del voltaje de referencia utilizado por el conversor A/D y de la cantidad de bits de este. Módulo ADC del ATmega2560 Hay un único conversor analógico – digital de 10 bits de aproximaciones sucesivas y un multiplexor que permite seleccionar diferentes pines de entrada como canales. Cabe aclarar que estos pines son compartidos con las entradas digitales. También se tiene la posibilidad de adoptar distintos voltajes de referencia. Pryszczuk, Sabrina Daiana Página 98 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Hay dos registros que permiten configurar ciertas características de operación del conversor analógico – digital. En el registro ADMUX, los dos bits MSB están destinados para la selección del voltaje de referencia que usa el conversor para su operación. Hay cuatro opciones posibles que se muestran en la siguiente tabla. La primera es utilizar la tensión aplicada al pin AREF del dispositivo. La segunda es utilizar la fuente de alimentación del conversor A/D que también es un pin del microcontrolador que en la placa Arduino se encuentra conectado a la tensión VCC de alimentación de este, es decir 5 V. Y las ultimas dos opciones son voltajes de referencia internos, uno de 1,1 V y otro de 2,56 V. El bit número 5 (ADLAR) es el que permite seleccionar si la conversión será de 10 u 8 bits. En realidad, la conversión siempre es de 10 bits, pero lo que hace este bit es determinar como se carga el resultado de la conversión en los registros ADCH y ADCL. Pryszczuk, Sabrina Daiana Página 99 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Luego, en el registro ADCSRB, tenemos el bit ACME que lo que hace es determinar qué modulo interno va a utilizar el multiplexor, si lo va a utilizar el conversor A/D o el comparador analógico (AC). Por defecto, se encuentra en 0, lo que significa que el multiplexor lo utiliza el conversor A/D. Si se pone en 1, se habilita el multiplexor para el AC. Los tres bits LSB del registro ADCSRB determinan el modo de operación. Los modos de operación posibles se muestran en la siguiente tabla. Si se utiliza el modo free running se puede realizar lo que se denomina conversión única. El resto de las conversiones se realizan mediante un “auto disparo”, es decir mediante un inicio automático de la conversión. Puede ser ante una comparación, ante una interrupción externa, cuando el temporizador 0 iguala al valor cargado en el canal A, o cuando hay un desbordamiento del temporizador, etc. Estos modos de auto disparo solo se pueden utilizar si el bit ADATE del registro ADCSRA se encuentra en 1. Por otro lado, los 5 bits LSB del registro ADMUX y el bit 3 del registro ADCSRB, son los que permiten operar con el multiplexor. Es decir que son aquellos que permiten seleccionar los canales que se van a convertir. Y la configuración del multiplexor sigue lo determinado en la siguiente tabla. Pryszczuk, Sabrina Daiana Página 100 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 El valor digital tiene las siguientes dimensiones en modo común y en modo diferencial: Pryszczuk, Sabrina Daiana Página 101 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 La siguiente tabla muestra otras opciones para la conversión en modo diferencial, donde el código correspondiente en los bits indicados permite seleccionar otros modos diferenciales multiplicados por 1. Otro registro importante para la configuración del conversor A/D del ATmega2560 es el registro ADCSRA. El bit MSB (ADEN) es el que permite habilitar el funcionamiento del ADC. Si se pone en 1, se habilita el funcionamiento. Si se pone en 0 durante el transcurso de una conversión, la misma finaliza. El bit ADSC se denomina el bit de inicio de conversión. Se debe poner en 1 para poder iniciar la conversión. En el modo de conversión única, cada vez que se escribe un 1 inicia la conversión. Al finalizar la conversión, el bit vuelve a 0 de forma automática. En el modo de conversión automática (auto triggering o auto disparo), este bit debe ponerse a 1 para iniciar la primera conversión, luego de esto, el bit permanece en 1 de forma permanente. Pryszczuk, Sabrina Daiana Página 102 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 El bit ADATE es que el permite habilitar las opciones de disparo automático en el ADC. Si se escribe un 1 en este bit se habilita el disparo automático de la conversión a través de la fuente seleccionada por los bits ADTS del registro ADSCRB. El bit ADIF es el flag de finalización de conversión que se pone en 1 cuando esto sucede y se actualiza el resultado de la conversión. Si están habilitadas globalmente las interrupciones y la interrupción del ADC está habilitada también, se produce la interrupción ejecutando la instrucción que posee el vector correspondiente. Con esto último, el flag se pone automáticamente en 0. Sino se usa la interrupción del ADC, este flag debe borrar escribiéndose un 1 en el mismo. El bit ADIE es el que permite la interrupción por finalización de conversión en el ADC. Si se pone en 1 este bit y el bit 1 del SREG (es decir que se habilitan globalmente las interrupciones), queda habilitada la interrupción por finalización de conversión. Los tres bits LSB del registro ADCSRA permiten seleccionar el prescaler de la señal de reloj con la que opera el ADC. Las opciones de selección son las que se muestran en la siguiente tabla. El prescaler permite adecuar el periodo de la señal de reloj del conversor AD a las distintas posibilidades de frecuencia de reloj del sistema que puede tener el microcontrolador (recordando que este microcontrolador puede operar con distintos tipos de señales de reloj). Pryszczuk, Sabrina Daiana Página 103 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 El proceso de conversión tiene tres etapas: la primera es la selección del canal que se desea convertir a través del multiplexor; la segunda es la de muestreo y retención donde inicialmente se cierra la llave S y el capacitor se carga con la tensión que se desea convertir, luego de esta carga se abre automáticamente la llave y comienza el proceso de conversión AD propiamente dicho. El tiempo total de conversión (descontando el tiempo que se demora en seleccionar el canal) está dado por un tiempo de adquisición más un tiempo de conversión. Pryszczuk, Sabrina Daiana Página 104 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Dependiendo del modo en el que esta operando el conversor AD, tanto el tiempo de adquisición como el tiempo de conversión toman diferentes valores que se muestran en la siguiente tabla. El periodo del reloj que utiliza el conversor AD se calcula a través de la siguiente expresión: Donde el numerador corresponde al valor del prescaler seleccionado y el denominador a la frecuencia de la señal de reloj del microcontrolador. La frecuencia que determina este periodo debe cumplir la siguiente condición para que el conversor AD del dispositivo opere correctamente. Como los microcontroladores ATmega2560 tienen la posibilidad de utilizar diferentes señales de reloj, la frecuencia del denominador de Tad puede tomar distintos valores, por lo tanto, el prescaler permite ajustar el periodo y hacer que se pueda cumplir la condición mencionada. Los registros donde se almacena la conversión se denominan ADCH y ADCL, uno almacena la parte alta y el otro la parte baja, dependiendo si la conversión es de 10 u 8 bits. Si se usa 10 bits, primero debe leerse ADCL y luego ADCH. En cambio, si se usa 8 bits, solo debe leerse ADCH. Pryszczuk, Sabrina Daiana Página 105 de 106 F.I. U.Na.M. Técnicas Digitales II (ET 446) Año 2021 Si se usan los canales del ADC en modo diferencial, estos registros almacenan el resultado en complemento a 2. También se encuentran los registros DIDR0 y DIDR2 que son los que permiten desconectar la parte digital de cada pin asociado a cada canal del ADC (escribiendo un 1 en cada bit), dejando habilitada solamente la entrada analógica. Pryszczuk, Sabrina Daiana Página 106 de 106
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )