U4 - Microcontroladores

46
Microcontroladores Págin a 4.1 Arquitectura …………………………………………………………………………. 1 4.1.1 Terminales …………………………………………………………………………. 3 4.1.2 CPU …………………………………………………………………………. 4 4.1.3 Espacio de Memoria …………………………………………………………………………. 4 4.1.4 Entrada/Salida …………………………………………………………………………. 5 4.1.5 Características Especiales …………………………………………………………………………. 5 4.2 Programación …………………………………………………………………………. 7 4.2.1 Modelo de Programación …………………………………………………………………………. 9 4.2.2 Conjunto de Instrucciones …………………………………………………………………………. 17 4.2.3 Modos de Direccionamiento …………………………………………………………………………. 17 4.2.3 Lenguaje Ensamblador …………………………………………………………………………. 27 4.3 Aplicaciones …………………………………………………………………………. 31 4.3.1 Como Sistema Independiente …………………………………………………………………………. 31 4.3.2 Como Subsistema de Una Computadora …………………………………………………………………………. 32

Transcript of U4 - Microcontroladores

Page 1: U4 - Microcontroladores

Microcontroladores

Página4.1 Arquitectura …………………………………………………………………………. 1 4.1.1 Terminales …………………………………………………………………………. 3 4.1.2 CPU …………………………………………………………………………. 4 4.1.3 Espacio de Memoria …………………………………………………………………………. 4 4.1.4 Entrada/Salida …………………………………………………………………………. 5 4.1.5 Características

Especiales …………………………………………………………………………. 54.2 Programación …………………………………………………………………………. 7 4.2.1 Modelo de

Programación …………………………………………………………………………. 9 4.2.2 Conjunto de

Instrucciones …………………………………………………………………………. 17 4.2.3 Modos de

Direccionamiento …………………………………………………………………………. 17 4.2.3 Lenguaje Ensamblador …………………………………………………………………………. 274.3 Aplicaciones …………………………………………………………………………. 31 4.3.1 Como Sistema

Independiente …………………………………………………………………………. 31 4.3.2 Como Subsistema de

Una Computadora …………………………………………………………………………. 32

Page 2: U4 - Microcontroladores

Unidad 4 – Microcontroladores

4.1 Arquitectura

Un microcontrolador es un circuito integrado o chip que incluye en su interior las tres unidades funcionales de una computadora: unidad central de procesamiento, memoria y unidades de E/S (entrada/salida).

Características

Son diseñados para reducir el costo económico y el consumo de energía de un sistema en particular. Por eso el tamaño de la unidad central de procesamiento, la cantidad de memoria y los periféricos incluidos dependerán de la aplicación. El control de un electrodoméstico sencillo como una batidora, utilizará un procesador muy pequeño (4 u 8 bit) por que sustituirá a un autómata finito. En cambio un reproductor de música y/o vídeo digital (mp3 o mp4) requerirá de un procesador de 32 bit o de 64 bit y de uno o más Códec de señal digital (audio y/o vídeo). El control de un sistema de frenos ABS (Antilock Brake System) se basa normalmente en un microcontrolador de 16 bit, al igual que el sistema de control electrónico del motor en un automóvil.

Esquema de un microcontrolador

Los microcontroladores representan la inmensa mayoría de los chips de computadoras vendidos, sobre un 50% son controladores "simples" y el restante corresponde a DSPs más especializados. Mientras se pueden tener uno o dos microprocesadores de propósito general en casa (Ud. está usando uno para esto), usted tiene distribuidos seguramente entre los electrodomésticos de su hogar una o dos docenas de microcontroladores. Pueden encontrarse en casi cualquier dispositivo electrónico como automóviles, lavadoras, hornos microondas, teléfonos, etc.

Un microcontrolador difiere de una CPU normal, debido a que es más fácil convertirla en una computadora en funcionamiento, con un mínimo de chips externos de apoyo. La idea es que el chip se coloque en el dispositivo, enganchado a la fuente de energía y de información que necesite, y eso es todo. Un microprocesador tradicional no le permitirá hacer esto, ya que espera que todas estas tareas sean manejadas por otros chips. Hay que agregarle los módulos de entrada/salida (puertos) y la memoria para almacenamiento de información.

Por ejemplo, un microcontrolador típico tendrá un generador de reloj integrado y una pequeña cantidad de memoria RAM y ROM/EPROM/EEPROM/FLASH, significando que para hacerlo funcionar, todo lo que se necesita son unos pocos programas de control y un cristal de sincronización. Los microcontroladores disponen generalmente también de una gran variedad de dispositivos de entrada/salida, como convertidores de analógico a digital, temporizadores, UARTs y buses de interfaz serie especializados, como I2C y CAN. Frecuentemente, estos dispositivos integrados pueden ser controlados por instrucciones de procesadores especializados. Los

1 | P á g i n a

Page 3: U4 - Microcontroladores

modernos microcontroladores frecuentemente incluyen un lenguaje de programación integrado, como el BASIC que se utiliza bastante con este propósito.

Los microcontroladores negocian la velocidad y la flexibilidad para facilitar su uso. Debido a que se utiliza bastante sitio en el chip para incluir funcionalidad, como los dispositivos de entrada/salida o la memoria que incluye el microcontrolador, se ha de prescindir de cualquier otra circuitería.

Básicamente existen dos arquitecturas de computadoras, y por supuesto, están presentes en el mundo de los microcontroladores: Von Neumann y Harvard. Ambas se diferencian en la forma de conexión de la memoria al procesador y en los buses que cada una necesita.

La arquitectura Von Neumann es la que se utiliza en las computadoras personales, para ella existe una sola memoria, donde coexisten las instrucciones de programa y los datos, accedidos con un bus de dirección, uno de datos y uno de control.

Debemos comprender que en una PC, cuando se carga un programa en memoria, a éste se le asigna un espacio de direcciones de la memoria que se divide en segmentos, de los cuales típicamente tenderemos los siguientes: código (programa), datos y pila. Es por ello que podemos hablar de la memoria como un todo, aunque existan distintos dispositivos físicos en el sistema (HDD, RAM, CD, FLASH).

En el caso de los microcontroladores, existen dos tipos de memoria bien definidas: memoria de datos (típicamente algún tipo de SRAM) y memoria de programas (ROM, PROM, EEPROM, FLASH u de otro tipo no volátil). En este caso la organización es distinta a las de las PC, porque hay circuitos distintos para cada memoria y normalmente no se utilizan los registros de segmentos, sino que la memoria está segregada y el acceso a cada tipo de memoria depende de las instrucciones del procesador.

A pesar de que en los sistemas integrados con arquitectura Von Neumann la memoria esté segregada, y existan diferencias con respecto a la definición tradicional de esta arquitectura; los buses para acceder a ambos tipos de memoria son los mismos, del procesador solamente salen el bus de datos, el de direcciones, y el de control. Como conclusión, la arquitectura no ha sido alterada, porque la forma en que se conecta la memoria al procesador sigue el mismo principio definido en la arquitectura básica.

Esta arquitectura es la variante adecuada para las PC, porque permite ahorrar una buena cantidad de líneas de E/S, que son bastante costosas, sobre todo para aquellos sistemas como las PC, donde el procesador se monta en algún tipo de socket alojado en una placa madre (motherboard). También esta organización les ahorra a los diseñadores de motherboards una buena cantidad de problemas y reduce el costo de este tipo de sistemas.

Algunas familias de microcontroladores como la INTEL-51 y la Z80 implementan este tipo de arquitectura, fundamentalmente porque era la utilizada cuando aparecieron los primeros microcontroladores.

2 | P á g i n a

Page 4: U4 - Microcontroladores

La otra variante es la arquitectura Harvard, y por excelencia la utilizada en supercomputadoras, en los microcontroladores, y sistemas integrados en general. En este caso, además de la memoria, el procesador tiene los buses segregados, de modo que cada tipo de memoria tiene un bus de datos, uno de direcciones y uno de control.

La ventaja fundamental de esta arquitectura es que permite adecuar el tamaño de los buses a las características de cada tipo de memoria; además, el procesador puede acceder a cada una de ellas de forma simultánea, lo que se traduce en un aumento significativo de la velocidad de procesamiento, típicamente los sistemas con esta arquitectura pueden ser dos veces más rápidos que sistemas similares con arquitectura Von Neumann.

La desventaja está en que consume muchas líneas de E/S del procesador; por lo que en sistemas donde el procesador está ubicado en su propio encapsulado, solo se utiliza en supercomputadoras. Sin embargo, en los microcontroladores y otros sistemas integrados, donde usualmente la memoria de datos y programas comparten el mismo encapsulado que el procesador, este inconveniente deja de ser un problema serio y es por ello que encontramos la arquitectura Harvard en la mayoría de los microcontroladores.

4.1.1 Terminales

El microprocesador es un circuito integrado que contiene la Unidad Central de Proceso (UCP), también llamada procesador, de un computador. La UCP está formada por la Unidad de Control, que interpreta las instrucciones, y el Camino de Datos, que las ejecuta. Las patitas de un microprocesador sacan al exterior las líneas de sus buses de direcciones, datos y control, para permitir conectarle con la memoria y los Módulos de E/S y configurar un computador implementado por varios circuitos integrados. Se dice que un microprocesador es un sistema abierto porque su configuración es variable de acuerdo con la aplicación a la que se destine.

Si sólo se dispusiese de un modelo de microcontrolador, éste debería tener muy potenciados todos sus recursos para poderse adaptar a las exigencias de las diferentes aplicaciones. Esta potenciación supondría en muchos casos un despilfarro. En la práctica cada fabricante de microcontroladores oferta un elevado número de modelos diferentes, desde los más sencillos hasta los más poderosos. Es posible seleccionar la capacidad de las memorias, el número de líneas de E/S, la cantidad y potencia de los elementos auxiliares, la velocidad de funcionamiento, etc. Por todo ello, un aspecto muy destacado del diseño es la selección del microcontrolador a utilizar.

El microcontrolador es un sistema cerrado. Todas las partes del computador están contenidas en su interior y sólo salen al exterior las líneas que gobiernan los periféricos. Arquitectura básica Aunque inicialmente todos los microcontroladores adoptaron la arquitectura clásica de von Neumann, en el momento presente se impone la arquitectura Harvard. La arquitectura de von Neumann se caracteriza por disponer de una sola memoria principal donde se almacenan datos e instrucciones de forma indistinta. A dicha memoria se accede a través de un sistema de buses

3 | P á g i n a

Page 5: U4 - Microcontroladores

único (direcciones, datos y control). La arquitectura Harvard dispone de dos memorias independientes una, que contiene sólo instrucciones y otra, sólo datos. Ambas disponen de sus respectivos sistemas de buses de acceso y es posible realizar operaciones de acceso (lectura o escritura) simultáneamente en ambas memorias. Figura 1.3.

La arquitectura Harvard dispone de dos memorias independientes para datos y para instrucciones, permitiendo accesos simultáneos.

4.1.2 CPU

Es el elemento más importante del microcontrolador y determina sus principales características, tanto a nivel hardware como software.

Se encarga de direccionar la memoria de instrucciones, recibir el código OP de la instrucción en curso, su decodificación y la ejecución de la operación que implica la instrucción, así como la búsqueda de los operandos y el almacenamiento del resultado. Existen tres orientaciones en cuanto a la arquitectura y funcionalidad de los procesadores actuales. CISC: Un gran número de procesadores usados en los microcontroladores están basados en la filosofía CISC (Computadores de Juego de Instrucciones Complejo). Disponen de más de 80 instrucciones máquina en su repertorio, algunas de las cuales son muy sofisticadas y potentes, requiriendo muchos ciclos para su ejecución. Una ventaja de los procesadores CISC es que ofrecen al programador instrucciones complejas que actúan como macros. RISC: Tanto la industria de los computadores comerciales como la de los microcontroladores están decantándose hacia la filosofía RISC (Computadores de Juego de Instrucciones Reducido). En estos procesadores el repertorio de instrucciones máquina es muy reducido y las instrucciones son simples y, generalmente, se ejecutan en un ciclo. La sencillez y rapidez de las instrucciones permiten optimizar el hardware y el software del procesador. SISC: En los microcontroladores destinados a aplicaciones muy concretas, el juego de instrucciones, además de ser reducido, es "específico", o sea, las instrucciones se adaptan a las necesidades de la aplicación prevista. Esta filosofía se ha bautizado con el nombre de SISC (Computadores de Juego de Instrucciones Específico).

4.1.3 Espacio de Memoria

En los microcontroladores la memoria de instrucciones y datos está integrada en el propio chip. Una parte debe ser no volátil, tipo ROM, y se destina a contener el programa de instrucciones que gobierna la aplicación. Otra parte de memoria será tipo RAM, volátil, y se destina a guardar las variables y los datos. Hay dos peculiaridades que diferencian a los microcontroladores de los computadores personales: 1. No existen sistemas de almacenamiento masivo como disco duro o disquetes. 2. Como el microcontrolador sólo se destina a una tarea en la memoria ROM, sólo hay

4 | P á g i n a

Page 6: U4 - Microcontroladores

que almacenar un único programa de trabajo. La RAM en estos dispositivos es de poca capacidad pues sólo debe contener las variables y los cambios de información que se produzcan en el transcurso del programa. Por otra parte, como sólo existe un programa activo, no se requiere guardar una copia del mismo en la RAM pues se ejecuta directamente desde la ROM.

Los usuarios de computadores personales están habituados a manejar Megabytes de memoria, pero, los diseñadores con microcontroladores trabajan con capacidades de ROM comprendidas entre 512 bytes y 8 k bytes y de RAM comprendidas entre 20 y 512 bytes. Según el tipo de memoria ROM que dispongan los microcontroladores, la aplicación y utilización de los mismos es diferente. Se describen las cinco versiones de memoria no volátil que se pueden encontrar en los microcontroladores del mercado.

4.1.4 Entrada/Salida

La principal utilidad de las patitas que posee la cápsula que contiene un microcontrolador es soportar las líneas de E/S que comunican al computador interno con los periféricos exteriores. Según los controladores de periféricos que posea cada modelo de microcontrolador, las líneas de E/S se destinan a proporcionar el soporte a las señales de entrada, salida y control.

4.1.5 Características especiales

Cada fabricante oferta numerosas versiones de una arquitectura básica de microcontrolador. En algunas amplía las capacidades de las memorias, en otras incorpora nuevos recursos, en otras reduce las prestaciones al mínimo para aplicaciones muy simples, etc. La labor del diseñador es encontrar el modelo mínimo que satisfaga todos los requerimientos de su aplicación. De esta forma, minimizará el costo, el hardware y el software. Los principales recursos específicos que incorporan los microcontroladores son:

• Temporizadores o "Timers". Se emplean para controlar periodos de tiempo (temporizadores) y para llevar la cuenta de acontecimientos que suceden en el exterior (contadores). Para la medida de tiempos se carga un registro con el valor adecuado y a continuación dicho valor se va incrementando o decrementando al ritmo de los impulsos de reloj o algún múltiplo hasta que se desborde y llegue a 0, momento en el que se produce un aviso. Cuando se desean contar acontecimientos que se materializan por cambios de nivel o flancos en alguna de las patitas del microcontrolador, el mencionado registro se va incrementando o decrementando al ritmo de dichos impulsos.

• Perro guardián o "Watchdog". Cuando el computador personal se bloquea por un fallo del software u otra causa, se pulsa el botón del reset y se reinicializa el sistema. Pero un microcontrolador funciona sin el control de un supervisor y de forma continuada las 24

5 | P á g i n a

Page 7: U4 - Microcontroladores

horas del día. El Perro guardián consiste en un temporizador que, cuando se desborda y pasa por 0, provoca un reset automáticamente en el sistema. Se debe diseñar el programa de trabajo que controla la tarea de forma que refresque o inicialice al Perro guardián antes de que provoque el reset. Si falla el programa o se bloquea, no se refrescará al Perro guardián y, al completar su temporización, "ladrará y ladrará" hasta provocar el reset.

• Protección ante fallo de alimentación o "Brownout". Se trata de un circuito que resetea al microcontrolador cuando el voltaje de alimentación (VDD) es inferior a un voltaje mínimo ("brownout"). Mientras el voltaje de alimentación sea inferior al de brownout el dispositivo se mantiene reseteado, comenzando a funcionar normalmente cuando sobrepasa dicho valor.

• Estado de reposo o de bajo consumo. Son abundantes las situaciones reales de trabajo en que el microcontrolador debe esperar, sin hacer nada, a que se produzca algún acontecimiento externo que le ponga de nuevo en funcionamiento. Para ahorrar energía, (factor clave en los aparatos portátiles), los microcontroladores disponen de una instrucción especial (SLEEP en los PIC), que les pasa al estado de reposo o de bajo consumo, en el cual los requerimientos de potencia son mínimos. En dicho estado se detiene el reloj principal y se "congelan" sus circuitos asociados, quedando sumido en un profundo "sueño" el microcontrolador. Al activarse una interrupción ocasionada por el acontecimiento esperado, el microcontrolador se despierta y reanuda su trabajo.

• Conversor A/D. Los microcontroladores que incorporan un Conversor A/D (Analógico/Digital) pueden procesar señales analógicas, tan abundantes en las aplicaciones. Suelen disponer de un multiplexor que permite aplicar a la entrada del CAD diversas señales analógicas desde las patitas del circuito integrado.

• Conversor D/A. Transforma los datos digitales obtenidos del procesamiento del computador en su correspondiente señal analógica que saca al exterior por una de las patitas de la cápsula.

• Comparador analógico. Algunos modelos de microcontroladores disponen internamente de un Amplificador Operacional que actúa como comparador entre una señal fija de referencia y otra variable que se aplica por una de las patitas de la cápsula. La salida del comparador proporciona un nivel lógico 1 ó 0 según una señal sea mayor o menor que la otra. También hay modelos de microcontroladores con un módulo de tensión de referencia que proporciona diversas tensiones de referencia que se pueden aplicar en los comparadores.

• Modulador de anchura de impulsos o PWM. Son circuitos que proporcionan en su salida impulsos de anchura variable, que se ofrecen al exterior a través de las patitas del encapsulado.

• Puertas de E/S digitales. Todos los microcontroladores destinan algunas de sus patitas a soportar líneas de E/S digitales. Por lo general, estas líneas se agrupan de ocho en ocho formando Puertas. Las líneas digitales de las Puertas pueden configurarse como Entrada o como Salida cargando un 1 ó un 0 en el bit correspondiente de un registro destinado a su configuración.

6 | P á g i n a

Page 8: U4 - Microcontroladores

• Puertas de comunicación. Con objeto de dotar al microcontrolador de la posibilidad de comunicarse con otros dispositivos externos, otros buses de microprocesadores, buses de sistemas, buses de redes y poder adaptarlos con otros elementos bajo otras normas y protocolos. 4.2 Programación Unidad de ejecución y unidad de interfaz del bus El procesador se divide en dos unidades lógicas: una unidad de ejecución (EU) y una unidad de interfaz del bus (BIU), como se ilustra en la siguiente figura. El papel de la EU es ejecutar instrucciones, mientras que la BIU envía instrucciones y datos a la EU. La EU contiene una unidad aritmética-lógica (ALU), una unidad de control (CU) y varios registros. Estos elementos ejecutan instrucciones y operaciones aritméticas y lógicas. La función más importante de la BIU es manejar la unidad de control del bus, los registros de segmentos y la cola de instrucciones. La BIU controla los buses que transfieren os datos a la EU, a la memoria y a los dispositivos de entrada/salida externos, mientras que los registros de segmentos controlan el direccionamiento de memoria.

4.2 Programación

Se han desarrollado todo tipo de lenguajes para los microcontroladores, pero los más usados son el Ensamblador, el BASIC y el C.

Los programas escritos en Ensamblador son compactos y rápidos, sin embargo, utiliza neumónicos inteligibles y si no están bien confeccionados resultarán de gran tamaño y lentos. Los lenguajes de alto nivel como el BASIC y el C son más fáciles de comprender y por tanto de diseñar.

Pero como toda máquina digital, el microcontrolador es capaz de entender exclusivamente el lenguaje binario grabado en la memoria. Los compiladores son programas que se encargan de traducir el programa de trabajo escrito en cualquier lenguaje a código máquina para luego grabarlo en la memoria del microcontrolador y ejecutarlo.

4.2.1 Modelo de Programación

Los lenguajes, bien sean de programación, de marcado o de consulta, representan el mascarón de proa de la informática. Sin embargo, antes de proporcionar la secuencia de frases de un lenguaje que constituye el código, que a fin de cuentas es la esencia de toda aplicación informática, cabe preguntarse si es posible, o necesario, dar una caracterización previa de las tareas que conducen a la consecución de dicho objetivo. En aplicaciones simples -aquellas que puede realizar un solo individuo en unas pocas horas- puede no ser necesario, pero cuando se enfrenta el desarrollo de software como un proceso industrial (Booch, 1996) es, sin duda, necesario proporcionar un marco que permita caracterizar cada una de las etapas del proceso de producción de este software. Primero, se debe proporcionar una especificación de requisitos que capture las funciones y

7 | P á g i n a

Page 9: U4 - Microcontroladores

restricciones de la aplicación. Tras esta especificación de requisitos, se debe proporcionar un modelo que sirva como paso intermedio entre las especificaciones y la aplicación final. Este modelo es la base para el diseño de la aplicación. Un modelo permite abstraer las características fundamentales de la aplicación y dar una caracterización de la misma suficientemente detallada como para poder obtener, utilizando algún lenguaje informático, el código que cumpla con los requisitos y especificaciones de partida.

Un lenguaje informático se ajusta siempre a un determinado paradigma de programación -por ejemplo, el paradigma imperativo-, y a un determinado modelo por ejemplo, el modelo de objetos. Un modelo de programación provee un marco abstracto en el que entender la sintaxis de los lenguajes concretos que siguen el modelo, y representa la semántica del mismo, así como una filosofía de uso de dicha semántica. Por ejemplo, algunos lenguajes de programación de propósito general como Java se ajustan al modelo de objetos, cuya filosofía puede simplificarse mediante el siguiente enunciado: el mundo está compuesto de una serie de objetos que se comportan de una forma determinada y que intercambian mensajes entre sí, técnicamente estos objetos exhiben las propiedades de “encapsulación, herencia y polimorfismo” (Deitel, 1995).

Para proporcionar modelos de diseño que permitan caracterizar el desarrollo de aplicaciones utilizando un lenguaje de programación se necesita un lenguaje de modelado que sea capaz de capturar la semántica del modelo al que se ajusta el lenguaje de programación. A su vez, el modelo de diseño proporcionado por el lenguaje de modelado debe ser capaz de capturar la semántica del programa que implementa la especificación de requisitos. De esta forma, el modelo de diseño sirve de nexo entre la especificación de requisitos y el programa final. Así por ejemplo, UML (Unified Modeling Language) (Booch, 1999) es un lenguaje de diseño visual que representa, mediante diagramas, el modelo de programación de objetos. Modelos de diseño concretos descritos con UML sirven como guía para la construcción de programas concretos, especificando detalles arquitectónicos del programa, no recogidos inicialmente en la especificación de requisitos.

Algunas veces, puede no resultar conveniente construir una aplicación utilizando un lenguaje de programación de propósito general. Por ejemplo, para construir una aplicación en el dominio hipermedia se dispone, al menos, de dos opciones. La primera, empezar desde cero construyendo cada elemento de la aplicación utilizando un lenguaje de programación de propósito general. La segunda, abstraer los elementos comunes que aparecen en este tipo de aplicaciones, como son, las anclas, los enlaces y los paneles de presentación de información al usuario, y definir un lenguaje que caracterice estos elementos. Este sería, por ejemplo, el caso del lenguaje HTML, utilizando el metalenguaje SGML. Un intérprete de dicho lenguaje constituye, entonces, el núcleo de la aplicación o sistema hipermedia. Este es el caso de los navegadores web (por ej. Explorer y Netscape) cuyo núcleo está formado por un intérprete del lenguaje HTML y el protocolo de comunicación http. La primera aproximación, que se denominará aproximación abierta, es flexible y potente, pero exige mayor esfuerzo de diseño y desarrollo. La segunda, que se denominará aproximación cerrada, es menos flexible, al restringir los elementos que pueden aparecer en una aplicación hipermedia, pero proporciona una aproximación cercana al paradigma documental de desarrollo de aplicaciones descrito en el apartado anterior. No obstante, en ambos casos resulta

8 | P á g i n a

Page 10: U4 - Microcontroladores

útil proporcionar un modelo de diseño que permita representar la aplicación como un todo. En el caso de la aproximación abierta se requiere un modelo de los procesos computacionales de la aplicación (expresado, por ejemplo, en UML), y un modelo de la propia aplicación hipermedia. En el caso de la aproximación cerrada sólo se precisa el modelo de la aplicación hipermedia, ya que se supone construido el sistema hipermedia (por ejemplo, un navegador que, a su vez, también debería haber sido especificado a través de un modelo en UML).

El problema de dar un modelo de diseño de una aplicación hipermedia es que no hay una semántica fija que modelar (como en el caso de UML y el modelo de objetos), ni siquiera hay un consenso sobre los elementos concretos que hay que modelar. Por ejemplo, se pueden modelar enlaces unarios o enlaces n-arios. Con independencia de este problema, desde los años 80 han surgido distintos Sistemas de Representación Hipermedia (SRH) cuya finalidad es proporcionar modelos de diseño para aplicaciones hipermedia. A pesar de esta finalidad inicial, estos modelos de diseño terminan utilizándose también como verdaderos modelos semánticos, ya que, en última instancia, definen las capacidades de las aplicaciones que pretenden modelar.

Los SRH son de una naturaleza muy heterogénea. Hay modelos hipermedia propiamente dichos (por ej. el Modelo Trellis) que caracterizan a una aplicación de tal manera que incluso especifican cuál va a ser su semántica de navegación (por ej. el modo en que la información va a ser visitada y presentada al usuario (Stotts, 1989)). Otros son modelos de referencia, con los que contrastar los modelos hipermedia (por ej. el modelo Dexter). Finalmente, existen metodologías (por ej. OOHDM) cuya finalidad es proporcionar una serie de diagramas que guíen la construcción de una aplicación hipermedia.

4.2.4 Conjunto de Instrucciones

Un conjunto de instrucciones o repertorio de instrucciones, juego de instrucciones o ISA (del inglés Instruction Set Architecture, Arquitectura del Conjunto de Instrucciones) es una especificación que detalla las instrucciones que una CPU de un ordenador puede entender y ejecutar, o el conjunto de todos los comandos implementados por un diseño particular de una CPU. El término describe los aspectos del procesador generalmente visibles a un programador, incluyendo los tipos de datos nativos, las instrucciones, los registros, la arquitectura de memoria y las interrupciones, entre otros aspectos.

Existen principalmente de 3 tipos: CISC (Complex Instruction Set Computer), RISC (Reduced Instruction Set Computer) y SISC (Specific Instruction Set Computer).

La arquitectura del conjunto de instrucciones (ISA) se emplea a veces para distinguir este conjunto de características de la microarquitectura, que son los elementos y técnicas que se emplean para implementar el conjunto de instrucciones. Entre estos elementos se encuentras las microinstrucciones y los sistemas de caché.

9 | P á g i n a

Page 11: U4 - Microcontroladores

Procesadores con diferentes diseños internos pueden compartir un conjunto de instrucciones; por ejemplo el Intel Pentium y AMD Athlon implementan versiones casi idénticas del conjunto de instrucciones x86, aunque tienen diseños internos completamente opuestos.

El lenguaje máquina

El lenguaje máquina está construido a partir de los estados discretos o instrucciones. En la arquitectura de procesamiento, una instrucción dada puede especificar:

Registros particulares para operaciones aritméticas, de direccionamiento o de control. Ubicaciones particulares de memoria Modos de direccionamiento para interpretar operandos

Las operaciones más complejas se construyen a partir de estas, que (en una máquina Von Neumann) se ejecutan secuencialmente, o según el control de flujo.

Algunas de las operaciones disponibles incluidas en la mayoría de conjuntos son:

Desplazamientoo Establecer un registro a un valor constanteo Mover datos desde una posición de memoria a un registro y viceversa. Esto se

realiza para obtener datos para operaciones matemáticas y su almacenamiento.o Leer y escribir datos desde dispositivos de hardware

Operaciones matemáticaso Sumar, restar, multiplicar o dividir dos registros y colocar el resultado en alguno de

ellos.o Realizar operaciones bit a bit, teniendo el AND y el OR de cada bit en un par de

registros, o el NOT de cada bit en un registro.o Comparar dos valores que se encuentren en registros(por ejemplo, si son iguales o si

uno es mayor que otro) Afectan al flujo de programa

o Saltar a otra posición del programa y ejecutar instrucciones allí.o Saltar a otra posición si se cumple cierta condicióno Saltar a otra posición, pero salvando la posición actual para poder volver (realizar

una llamada, por ejemplo call printf)

Algunos ordenadores incluyen instrucciones "complejas". Dichas instrucciones pueden tomar muchas instrucciones en otros equipos. Estas se caracterizan por instrucciones que necesitan varios pasos, como el control de múltiples unidades funcionales. Algunos ejemplos son:

Ahorro de registros en la pila Mover grandes bloques de memoria Complejas operaciones and/or con aritética de coma flotante, tales como el seno o la raíz

cuadrada.

10 | P á g i n a

Page 12: U4 - Microcontroladores

Instrucciones que combinan ALU con un operando de la memoria mas que de registros.

Un tipo complejo de la instrucción que ha llegado a ser particularmente popular recientemente es SIMD o Simple_Instrucción_Multiplos_Datos, una operación que realice la misma operación aritmética en pedazos múltiples de datos al mismo tiempo. SIMD tienen la capacidad de manipular vectores y matrices grandes en tiempo mínimo. Las instrucciones de SIMD permiten la paralelización fácil de los algoritmos implicados comúnmente en sonido, imagen, y el proceso video. Varias implementaciones de SIMD se han traído al mercado bajo nombres comerciales tales como MMX, 3DNow! y AltiVec.

El diseño de sistemas de instrucción es una edición compleja. Había dos etapas en la historia para el microprocesador. El primer era el CISC (Complex Instruction Set Computer) que tenía muchas instrucciones diferentes. En los años 70 IBM hicieron la investigación y encontraron que muchas instrucciones en el sistema podrían ser eliminadas. El resultado era el RISC (Reduced Instruction Set Computer), una arquitectura que utiliza un sistema más pequeño de instrucciones. Un conjunto de instrucción más simple puede ofrecer el potencial para velocidades más altas, tamaño reducido del procesador, y consumo de energía reducido. Sin embargo, un conjunto más complejo puede optimizar operaciones comunes, mejorar memoria/eficiencia de cache, o simplificar la programación.

Implementación del conjunto de instrucciones

Cualquier conjunto de instrucciones se puede implementar de varias maneras. Todas las maneras de implementar un conjunto de instrucciones dan el mismo modelo programado, y todas pueden hacer funcionar los mismos ejecutables binarios. Las varias maneras de implementar un conjunto de instrucciones dan diversas compensaciones entre el coste, el funcionamiento, el consumo de energía, el tamaño, el etc.

Al diseñar microarquitecturas, los ingenieros usaron bloques de circuitos electrónicos “duramente-conectados” (diseñado a menudo por separado) por ejemplo l, los multiplexores, los contadores, los registros, ALUs etc. Un cierto tipo del lenguaje de transferencia de registros es a menudo usado para describir la codificación y la secuencia de cada instrucción de ISA usando esta microarquitectura física.

Hay también algunos nuevos diseños de CPU que compilan el conjunto de instrucción a una RAM escribible o FLASH dentro de la CPU (tal como el procesador Recursiv y el Imsys Cjip), o FPGA (computación reconfigurable). Western Digital MCP-1600 es un ejemplo antiguo, usando una ROM dedicada, separada del microcódigo.

ISA se puede también emular en software por un intérprete. Naturalmente, debido a la interpretación de “overhead”, es más lento que ejecutar programas directamente sobre el hardware emulado. Hoy, es práctica para los vendedores de nuevos ISAs o microarchitectures poner emuladores del software a disposición de los desarrolladores de programas informáticos antes de que la implementación del hardware esté lista.

11 | P á g i n a

Page 13: U4 - Microcontroladores

Los detalles de la implementación tienen una influencia fuerte en las instrucciones particulares seleccionadas para el conjunto de instrucción. Por ejemplo, muchas implementaciones de la instrucción “pipline” permiten solamente una carga de memoria (load) o almacén en memoria (store) por instrucción, llevando a carga-almacena arquitectura (RISC). Por otro ejemplo, algunas maneras de implementar la instrucción “pipline” llevaron a una ranura de retardo.

La demanda de procesamiento de señal digital de alta velocidad ha empujado en el sentido contrario- forzando la implementación de instrucción de manera particular. Por ejemplo, para realizar los filtros digitales es bastante insuficiente, la instrucción del MAC en un procesador típico de señal digital (DSP) se debe implementar usando una arquitectura de Harvard que pueda traer una instrucción y dos palabras de datos simultáneamente, y requiere un solo ciclo.

Diseño del conjunto de instrucciones

La densidad del código En computadoras antiguas, la memoria del programa era costosa, así que minimizar el tamaño de un programa para asegurar que va a caber en la memoria limitada era a menudo central. Así el tamaño combinado de todas las instrucciones necesitó realizar una tarea particular, la densidad del código, era una característica importante de cualquier sistema de instrucción. Las computadoras con alta densidad del código también tenían a menudo instrucciones complejas para la entrada del procedimiento, los retornos parametrizados, los lazos etc. Sin embargo, " instrucciones CISC" combinan simplemente una operación básica de la ALU, tal como " add", con el acceso de uno o más operandos en memoria (usando modos de dirección tales como directo, indirecto, indexado). Ciertas arquitecturas pueden permitir dos o tres operandos (incluido el resultado) directamente en memoria o pueden permitir realizar funciones tales como el incremento automático del puntero.

Las computadoras mínimas del conjunto de instrucciones (MISC) son una forma de máquina apilada, donde hay pocas instrucciones separadas (16-64), para poder caber instrucciones múltiples en una sola palabra de máquina. Estos tipos de núcleos llevan a menudo poco silicio para implementarse, así que pueden ser observadas fácilmente en un FPGA o en una forma multinúcleo. La densidad del código es similar al RISC; la densidad creciente de la instrucción es compensada requiriendo más de las instrucciones primitivas de hacer una tarea.

Características que debe tener un conjunto de instrucciones

Las características que se pretende que tenga un conjunto de instrucciones son cuatro, principalmente:

Completo: Que se pueda realizar en un tiempo finito cualquier tarea ejecutable con un ordenador (computable o decidible).

Eficiente: Que permita alta velocidad de cálculo sin exigir una elevada complejidad en su UC y ALU y sin consumir excesivos recursos (memoria), es decir, debe cumplir su tarea en un tiempo razonable minimizando el uso de los recursos.

12 | P á g i n a

Page 14: U4 - Microcontroladores

Autocontenidas: Esto es, que contengan en sí mismas toda la información necesaria para ejecutarse.

Independientes: Que no dependan de la ejecución de alguna otra instrucción.

Se puede comprobar que para que un conjunto de instrucciones sea completo solo se necesitan cuatro instrucciones:

-> escritura

-> mover a la izquierda una posición y leer

-> mover a la derecha una posición y leer

-> parar

En esta idea se basan las arquitecturas RISC, no obstante, con este conjunto no se puede conseguir la eficiencia del repertorio de instrucciones por lo que en la práctica el conjunto suele ser más amplio en aras de conseguir un mejor rendimiento, tanto en uso de recursos como en consumo de tiempo.

Tipos de instrucciones

Transferencia de datos: Copian datos de un origen a un destino, sin modificar el origen y normalmente sin afectar a los flags o indicadores de condición. Pueden transferir palabras, fracciones de palabras (bytes, media palabra) o bloques completos de n bytes o palabras.

Estas operaciones pueden ser:

-> registro - registro

-> registro - memoria

-> memoria - registro

-> memoria - memoria

Nemotécnicos más frecuentes:

move: copia el contenido de un registro(o memoria) a otro. store: copia el contenido de un registro a memoria. load: copia el contenido de una posición de memoria a un registro. move block: copia un bloque de datos de una posición de memoria a otra. move multiple: copia del origen en varias posiciones de memoria.

13 | P á g i n a

Page 15: U4 - Microcontroladores

exchange: intercambia el contenido de dos operandos. clear: pone a 0 el destinto. (todos los bits) set: pone a 1 el destino. (todos los bits) push: introduce un dato en la cabecera de la pila. (indicada por el SP) pop: saca un dato de la cabecera de la pila. (indicada por el SP)

Instrucciones aritméticas: Son efectuadas por la ALU y suelen cambiar los flags o indicadores de condición.

Nemotécnicos más frecuentes

add: Suma. add with carry: Suma con acarreo. subtrack: Resta. subtrack with borrow: Resta teniendo en cuenta el adeudo anterior. increment: incrementa en 1 un valor. decrement: decrementa en 1 un valor. multiply: multiplica. divide: divide. extend: aumenta el operando de tamaño. negate: cambia de signo. absolute: valor absoluto.

Pueden tener instrucciones para tratar con números en BCD e incluyen operaciones en coma flotante, lo cual se identifica con una 'f' antes del nombre del nemotécnico como por ejemplo:

fabsolute

Instrucciones de comparación: Suelen preceder a una instrucción de bifurcación condicional y modifican los flags. No hay que pensar que las instrucciones de salto condicional dependen de este repertorio, ya que lo único que hace el salto condicional es consultar los flags y salta si precede, pero no depende de ninguna instrucción de comparación. (de hecho cualquier operación aritmética realizada anteriormente a un salto condicional puede provocar que este "salte").

Nemotécnicos más frecuentes:

compare: Resta los dos operandos pero no almacena el resultado, solo modifica los flags. test: compara un cierto valor especificado con el 0. Instrucciones lógicas: Realizan operaciones booleanas "bit a bit" entre dos operandos. Como

las aritméticas también modifican los flags.

14 | P á g i n a

Page 16: U4 - Microcontroladores

Nemotécnicos más frecuentes:

and: el "y" lógico. or: el "o inclusivo" lógico. xor: el "o exclusivo" lógico. not: la negación lógica. (complemento a 1, no confundir con el cambio de signo "negate"

que es el complemento a 2).

Instrucciones de Desplazamiento: Pueden ser aritmético o lógico y pueden incluir o no rotaciones. Pueden ser de izquierda a derecha.

Nemotécnicos más frecuentes:

shift: desplazamiento aritmético o lógico. rotate: rotación con o sin acarreo.

Instrucciones de bits: Comprueban un bit del operando y su valor lo reflejan en el indicador de cero. Pueden poner un bit a 0 o complementarlo.

Nemotécnicos más frecuentes:

bit test: comprueba un bit. bit clear: comprueba un bit y lo pone a 0. bit set: comprueba un bit y lo pone a 1.

Instrucciones de control: Permiten modificar la secuencia normal de ejecución de un programa, puede hacerse por salto condicional relativo o absoluto.

Se clasifican en cuatro grupos:

salto incondicional salto condicional Llamada a subrutinas Gestión de las interrupciones

saltos: Pueden ser condicionales o incondicionales, se suelen especificar como jump o brantch, y en el caso de los condicionales se suele llamar jcond o bcond donde cond es una o más letras que indican la condición que ha de cumplirse para que el salto se produzca.

Incondicional: salta sin comprobar ninguna condición.

Nemotécnicos más frecuentes: jump o brantch

15 | P á g i n a

Page 17: U4 - Microcontroladores

Condicional: salta si la condición se cumple.

Nemotécnicos más frecuentes: jcond o bcond

Llamadas a subrutinas: Invoca la ejecución de funciones anteriormente definidas.

Nemotécnicos más frecuentes: call (llamada) y ret (retorno)

Gestión de interrupciones: Se usan para llamar a las rutinas de servicio de interrupción y esto se puede hacer por hardware o bien por software. Necesita una instrucción similar a return para retornar al contexto anterior pero restableciendo el estado de la máquina, para no afectar a la aplicación a la cual se interrumpió (iret).

Instrucciones de E/S: Son instrucciones de transferencia salvo que el origen/destino de dicho flujo es un puerto de un dispositivo de E/S. Estas instrucciones pueden darse mediante dos alternativas:

->E/S "mapeada" en memoria: Los periféricos tienen direcciones asignadas de la MP por lo que no se necesitan instrucciones especiales y las operaciones se realizan con las ya vistas, como son: load, store y move.

->E/S independiente: Necesitan unas instrucciones especiales para indicarle al procesador que nos estamos refiriendo al mapa de direcciones de E/S, ya que este mapa y el mapa de memoria son disjuntos.

Nemotécnicos más frecuentes:

input o read: Premite leer información de un puerto y trasladarla a memoria principal. output o write: Permite escribir información en un puerto de un dispositivo. test i/o: Lee información de control de un periférico. control i/o: Envía información de control hacia un periférico.

Instrucciones de control y misceláneas:

Nemoténicos más frecuentes:

halt: Detiene la ejecución del programa hasta que una interrupción arranca otro programa. wait: Sirve para deterner la ejecución de un programa hasta que sucede un determinado

evento que no es una interrupción (otra condición externa al primer programa). nop: No realiza ninguna operación, sirve para rellenar huecos en un programa o temporizar

esperas. enable: Habilita las interrupciones. disable: Deshabilita las interrupciones. test and set: Se utiliza para la implementación de la exclusión mutua, esto es, que un

procesador no pueda acceder a un determinado recurso que está siendo usado por otro procesador en ese mismo momento.

16 | P á g i n a

Page 18: U4 - Microcontroladores

Se usan como semáforos, esto es, se declara una variable entera que tendrá el valor 0 si el recurso esta libre y 1 si está siendo utilizado, de manera que si un procesador comprueba y el semáforo está en 1 tendrá que esperar hasta que este cambie a 0. (1 = s.rojo y 0 = s.verde).

4.2.3 Modos de Direccionamiento

Los llamados modos de direccionamiento son las diferentes maneras de especificar en informática un operando dentro de una instrucción (lenguaje ensamblador). Cómo se especifican e interpretan las direcciones de memoria según las instrucciones.

Un modo de direccionamiento especifica la forma de calcular la dirección de memoria efectiva de un operando mediante el uso de la información contenida en registros y / o constantes, contenida dentro de una instrucción de la máquina o en otra parte.

¿Cuántos modos de direccionamiento existen?

Diferentes arquitecturas de computadores varían mucho en cuanto al número de modos de direccionamiento que ofrecen desde el hardware. Eliminar los modos de direccionamiento más complejos podría presentar una serie de beneficios, aunque podría requerir de instrucciones adicionales, e incluso de otro registro. Se ha comprobado que el diseño de CPUs segmentadas es mucho más fácil si los únicos modos de direccionamiento que proporcionan son simples.

La mayoría de las máquinas RISC disponen de apenas cinco modos de direccionamiento simple, mientras que otras máquinas CISC tales como el DEC VAX tienen más de una docena de modos de direccionamiento, algunos de ellos demasiado complejos. El mainframe IBM System/360 disponía únicamente de tres modos de direccionamiento; algunos más fueron añadidos posteriormente para el System/390.

Cuando existen solo unos cuantos modos, estos van codificados directamente dentro de la propia instrucción (Un ejemplo lo podemos encontrar en el IBM/390, y en la mayoría de los RISC). Sin embargo, cuando hay demasiados modos, a menudo suele reservarse un campo específico en la propia instrucción, para especificar dicho modo de direccionamiento. El DEC VAX permitía múltiples operandos en memoria en la mayoría de sus instrucciones, y reservaba los primeros bits de cada operando para indicar el modo de direccionamiento de ese operando en particular.

Incluso en computadores con muchos modos de direccionamiento, algunas medidas realizadas a programas indican que los modos más simples representan cerca del 90% o más de todos los modos de direccionamiento utilizados. Dado que la mayoría de estas medidas son obtenidas a partir de códigos de alto nivel generados a partir de compiladores, nos da una idea de las limitaciones que presentan los compiladores que se utilizan.

Advertencia

17 | P á g i n a

Page 19: U4 - Microcontroladores

Tenga en cuenta que no existe una forma generalmente aceptada de nombrar a los distintos modos de direccionamiento. En particular, los distintos autores y fabricantes de equipos pueden dar nombres diferentes para el modo de hacer frente al mismo, o los mismos nombres, a los diferentes modos de direccionamiento. Además, un modo de direccionamiento que en una determinada arquitectura se trata como un modo de direccionamiento, puede representar la funcionalidad que en otra arquitectura está cubierto por dos o más modos de direccionamiento.

El término "modo de direccionamiento" está sujeta a interpretaciones diferentes: o bien "dirección de memoria de modo de cálculo" o "modo de acceso operando". Bajo las instrucciones de la primera interpretación, que no puede leer o escribir de la memoria a la memoria (como "añadir literal de registro"), se considerará que no tienen un "modo de direccionamiento". La segunda interpretación permite para las máquinas tales como VAX, que utilizan bits de modo operando para permitir un operando literal. Sólo la primera interpretación se aplica a las instrucciones tales como "carga efectiva de dirección".

Las instrucciones que aparecen a continuación son meramente representativas a fin de ilustrar los modos de direccionamiento, y no necesariamente reflejan los mnemónicos utilizado por cualquier equipo en particular.

Tipos de Direccionamiento

Indirecto: En este modo de direccionamiento no es necesario poner ninguna dirección de forma explícita, ya que en el propio código de operación se conoce la dirección del (de los) operando(s) al (a los) que se desea acceder o con el (los) que se quiere operar.

Supongamos una arquitectura de pila, las operaciones aritméticas no requieren direccionamiento explícito por lo que se ponen como:

- add

- sub

...

¿Por qué? Porque cuando se opera con dos datos en esta arquitectura se sabe que son los dos elementos del tope de la pila:

Ejemplo de una pila

1 2 3 4 5 6 <- pila

top() es 1

18 | P á g i n a

Page 20: U4 - Microcontroladores

ntop() es 2

donde top() representa el tope de la pila y ntop() el siguiente al tope de la pila y son estos argumentos con los que se opera al llamar a una orden en concreto.

Otro ejemplo de este tipo de direccionamiento lo podemos encontrar en la arquitectura de acumulador (AC) donde siempre hay un parámetro implícito y este es el AC.

Para finalizar y dejar este modo de direccionamiento generalizado para las arquitecturas más usuales, remarcamos que también podemos encontrarlo en la arquitectura con registros de propósito general, por ejemplo con órdenes como setc, que pone a 1 el registro c (acarreo).

Inmediato: En la instrucción está incluido directamente el operando.

En este modo el operando es especificado en la instrucción misma. En otras palabras, una instrucción de modo inmediato tiene un campo de operando en vez de un campo de dirección. El campo del operando contiene el operando actual que se debe utilizar en conjunto con la operación especificada en la instrucción. Las instrucciones de modo inmediato son útiles para inicializar los registros en un valor constante.

Cuando el campo de dirección especifica un registro del procesador, la instrucción se dice que está en el modo de registro.

ejemplo:MOV A,#17H

Directo: El campo de operando en la instrucción contiene la dirección en memoria donde se encuentra el operando.

En este modo la dirección efectiva es igual a la parte de dirección de la instrucción. El operando reside en la memoria y su dirección es dada directamente por el campo de dirección de la instrucción. En una instrucción de tipo ramificación el campo de dirección especifica la dirección de la rama actual.

19 | P á g i n a

Page 21: U4 - Microcontroladores

Con este tipo de direccionamiento, la dirección efectiva es contenida en la misma instrucción, tal como los valores de datos inmediatos que son contenidos en la instrucción. Un procesador de 16 bits suma la dirección efectiva al contenido del segmento de datos previamente desplazado en 4 bits para producir la dirección física del operando.

ejemplo:MOV A,17H

Indirecto: El campo de operando contiene una dirección de memoria, en la que se encuentra la dirección efectiva del operando.

20 | P á g i n a

Page 22: U4 - Microcontroladores

ejemplo:MOV A,@17H

Absoluto: El campo de operando contiene una dirección en memoria, en la que se encuentra la instrucción.

De registro: Sirve para especificar operandos que están en registros.

ejemplo:MOV A,R0

21 | P á g i n a

Page 23: U4 - Microcontroladores

Indirecto mediante registros: El campo de operando de la instrucción contiene un identificador de registro en el que se encuentra la dirección efectiva del operando.

En este modo el campo de la dirección de la instrucción da la dirección en donde la dirección efectiva se almacena en la memoria. El control localiza la instrucción de la memoria y utiliza su parte de dirección para accesar la memoria de nuevo para leer una dirección efectiva. Unos pocos modos de direccionamiento requieren que el campo de dirección de la instrucción sea sumado al control de un registro especificado en el procesador. La dirección efectiva en este modo se obtiene del siguiente cálculo:

Dir. efectiva = Dir. de la parte de la instrucción + Contenido del registro del procesador

ejemplo:MOV A,@R0

De desplazamiento: Combina el modo directo e indirecto mediante registros

De pila: Se utiliza cuando el operando está en memoria y en la cabecera de la pila.

Este direccionamiento se basa en las estructuras denominadas Pila(tipo LIFO), las cuales están marcados por el fondo de la pila y el puntero de pila (*SP), El puntero de pila apunta a la última posición ocupada. Así, como puntero de direccionamiento usaremos el SP. El desplazamiento más el valor del SP nos dará la dirección del objeto al que queramos hacer referencia. En ocasiones, si no existe C. de desplazamiento solo se trabajara con la cima de

22 | P á g i n a

Page 24: U4 - Microcontroladores

la pila. Este tipo de direccionamiento nos aporta flexibilidad pero por el contrario, es mucho más complejo que otros tipos estudiados más arriba.

Respecto a un registro base: Este modo de direccionamiento es muy usado por los ensambladores cuando se llaman a las funciones (para acceder a los parámetros apilados en la pila, valga la redundancia). Consiste, al igual que el indirecto a través de registro, en calcular la EA (Effective Address) como la suma del contenido del registro base y un cierto desplazamiento (u offset) que siempre será positivo. Esta técnica permite códigos reentrantes y acceder de forma fácil y rápida a posiciones cercanas de memoria.

EA = RB+offset

RB = registro base

offset = desplazamiento

-> RB se comporta como una dirección de memoria a la que se le sumará el desplazamiento

Respecto a un registro índice: Es similar al anterior, lo único que es el contenido del registro índice el que indica el desplazamiento que se produce a partir de una dirección de memoria que se pasa también como argumento a la orden que utiliza este modo de direccionamiento. Aunque en esencia son dos modos equivalentes. La EA se calcula como la suma del contenido del registro índice y una dirección de memoria:

EA = RI+DM

RI = registro índice

DM = dirección de memoria

-> RI se comporta como un offset

Indexado respecto a una base: Se trata de una combinación de los dos anteriores y consiste en calcular la dirección efectiva como:

EA = RI+RB+DM

23 | P á g i n a

Page 25: U4 - Microcontroladores

-> Las siglas significan lo mismo que en el caso anterior

Respecto al contador de programa: Consiste en dirección una posición de memoria usando como registro base al contador de programa (PC), el funcionamiento es análogo al direccionamiento respecto a registro base con la salvedad de que, en este caso, el offset puede ser también negativo.

Indexado con autoincremento/autodecremento: Es un modo de direccionamiento análogo al indexado, explicado anteriormente. La única diferencia es que permite un incremento o decremento de la dirección final o el registro índice según los siguientes casos:

o Indexado con autopreincremento: Incrementa el registro índice primero (se incrementa un valor, según el tamaño del objeto direccionado) y luego calcula la EA al igual que el direccionamiento indexado.

o Indexado con autoposincremento: Calcula la dirección efectiva y después incrementa esta.

o Indexado con autopredecremento: Decrementa el registro índice y después calcula la dirección efectiva.

o Indexado con autoposdecremento: Calcula la dirección efectiva y después decrementa esta.

Instrucción de salto con direccionamiento absoluto: Consiste en cargar en el PC el valor que se especifica en la orden de salto, p.e:

jmp 0xAB ----> Carga 0xAB en PC

Instrucción de salto con direccionamiento relativo: Es parecida a la especificada anteriormente la diferencia es que el salto es relativo al PC, pongamos un ejemplo:

Supongamos que PC vale = 0x0A, si nosotros interpretamos la instrucción jr +03, saltaremos tres posiciones posteriores a PC (también podría ser -03 y serían posiciones anteriores). Pero, ¡cuidado! si esa instrucción estaba en la posición 0x0A la dirección de PC a incrementar será la inmediatamente posterior (ya que PC se incrementa automáticamente después de leer la instrucción), por lo que quedaría:

PC = 0x0B ---> nuevo PC = 0x0B+0x03 = 0x0E, con lo que el PC quedaría como 0x0E.

Direccionamiento paginado y direccionamiento segmentado

24 | P á g i n a

Page 26: U4 - Microcontroladores

Paginado: La memoria se encuentra actualmente dividida en páginas(bloques de igual longitud).

En este caso, para obtener las direcciones necesitamos: Indicador de página (IP): en un registro específico o de propósito general de la máquina. Dirección de la palabra(DP): en el campo CD de la instrucción.

Así, concatenando ambas partes obtenemos la dirección completa.

Segmentado: En este caso, la memoria se divide en porciones, como en el tipo anterior, pero en este caso los tamaños son variables. Así, para acceder a ellos se tiene una tabla de segmentos que contiene la dirección del comienzo y del final de cada segmento en memoria.

Usar este tipo de direccionamiento tiene como ventajas que se puede definir segmentos de tamaño arbitrario. Por otro lado, esta misma ventaja, el fraccionamiento de memoria es uno de sus problemas.

Ambos modos de direccionamiento facilitan la multiprogramación gracias a la técnica de la memoria virtual que permite que un proceso no tenga que estar cargado íntegramente en memoria, si no que se cargan distintas páginas del mismo (o segmentos). Si se intenta cargar una página o segmento que no se encuentra en la memoria principal se produce una excepción de falta de página o segmento y se accede a la memoria para cargar la información requerida en la memoria principal.

25 | P á g i n a

Page 27: U4 - Microcontroladores

Algunos modos de direccionamiento obsoletos

Estos modos fueron usados durante 1950-1980 y ya no están disponibles en los computadores modernos. Esta lista no es completa, puesto que hubo otros muchos modos de direccionamiento más, algunos más interesantes y peculiares.

Indirecto de multinivel de memoria

Si la longitud de palabra era mayor que la dirección, la palabra era referenciada por este direccionamiento indirecto de multinivel, que podía tener una "bandera" para indicar un ciclo indirecto de memoria. Es necesario tener cuidado para asegurar que una cadena de direcciones indirectas no se refiera a ella misma , si lo hiciera, se llegaría a un bucle infinito mientras trata de encontrar la dirección.

El DEC PDP-10 con 18 bits de direccionamiento y palabras de 36 bits permitían este modo de direccionamiento con la posibilidad de usar un registro principal para cada fase.

Indirecto de memoria con autoincremento

En algunos minicomputadores había normalmente 16 localizaciones especiales de memoria. Cuando se accedía a memoria, la dirección era automáticamente incrementada y decrementada después de su uso. Esto hacía muy fácil acceder a memoria en bucles sin usar ningún registro.

"Página cero

La familia Motorola 6800 y la MOS Technology 6502 fueron unas familias de pobres microprocesadores CISC. Las instrucciones aritméticas y lógicas estaban casi todas hechas en contra de los valores de memoria. Como resultado, las instrucciones necesitaban incluir una localización de dos bytes en memoria.

Los diseñadores de estos procesadores incluían un "remedio" llamado direccionamiento "página cero". Los 256 bytes iniciales de memoria podían ser accedidos usando un byte o una dirección de memoria indexada. Esto reducía el tiempo de ejecución de las instrucciones un ciclo de reloj. Almacenando datos en esta "región" los programas podían ser más pequeños y más rápidos.

Como resultado, la "página cero" fue usada de forma parecía a un archivo de registro. En muchos sistemas, sin embargo, provocó una gran utilización del área de memoria de la página cero por el sistema operativo y por los usuarios de programas. Esto limitó su uso desde que el espacio libre fue limitado.

Direccionamiento absoluto vs Direccionamiento relativo

En esta sección vamos a resaltar las diferencias de estas dos técnicas de direccionamiento y aclarar las ventajas y desventajas que cada una de ellas conlleva.

26 | P á g i n a

Page 28: U4 - Microcontroladores

Direccionamiento absoluto: Consiste en direccionar una posición de memoria de forma directa, esto es, que la dirección hace referencia directamente a dicha posición sin tener que realizar cálculos adicionales para la EA.

Direccionamiento relativo: Cuando para direccionar una posición de memoria se hace referencia a otra sobre la cual se especifica un incremento o decremento, es decir, se requiere otro dato para el cálculo de la dirección efectiva.

Generalmente se usan los direccionamientos relativos ya que, al ejecutar un cierto programa se cumple la proximidad espacial y temporal, lo que implica que datos que ya han sido usados o que se encuentran en posiciones cercanas al PC tendrán una alta probabilidad de ser referenciados próximamente. Otras de las ventajas del direccionamiento relativo es que permite los códigos reentrantes y cambiar ciertas direcciones sin tener que volver a compilar el programa. Es también útil porque nunca se sabe en qué posición de memoria se cargará un determinado programa. Por último reduce el número de bits para especificar las direcciones y se facilita la referencia a datos del programa a través de los registros base.

El problema viene cuando queremos referenciar un dato al que no podemos acceder de forma relativa (p.e porque los registros base no puedan alcanzar dicha posición aun con el incremento más grande que podamos darle), en este caso se requiere el direccionamiento absoluto que sí es capaz de acceder, por lo general, a cualquier dirección de memoria.

4.2.4 Lenguaje Ensamblador

El lenguaje Assembly (a veces mal llamado "Ensamblador" por su traducción literal al español) es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador.

Fue usado principalmente en los inicios del desarrollo de software, cuando aún no se contaba con los potentes lenguajes de alto nivel. Actualmente se utiliza con frecuencia en ambientes académicos y de investigación, especialmente cuando se requiere la manipulación directa de hardware, se pretenden altos rendimientos o un uso de recursos controlado y reducido.

Aunque a veces suele usarse el nombre "Ensamblador" en realidad este nombre corresponde al programa que realiza la interpretación del código en Assembly y genera el código máquina adecuado. Dado que Assembly es un nombre propio, no debería traducirse.

Muchos dispositivos programables (como los microcontroladores) aun cuentan con el lenguaje Assembly como la única manera de ser manipulados.

27 | P á g i n a

Page 29: U4 - Microcontroladores

Características

El código escrito en lenguaje Assembly posee una cierta dificultad de ser entendido directamente por un ser humano ya que su estructura se acerca más bien al lenguaje máquina, es decir, lenguaje de bajo nivel.

El lenguaje Assembly es difícilmente portable, es decir, un código escrito para un microprocesador, suele necesitar ser modificado, muchas veces en su totalidad para poder ser usado en otra máquina distinta, aun con el mismo microprocesador.

Los programas hechos en lenguaje Assembly son generalmente más rápidos y consumen menos recursos del sistema (memoria RAM y ROM). Al programar cuidadosamente en lenguaje Assembly se pueden crear programas que se ejecutan más rápidamente y ocupan menos espacio que con lenguajes de alto nivel.

Con el lenguaje Assembly se tiene un control muy preciso de las tareas realizadas por un microprocesador por lo que se pueden crear segmentos de código difíciles de programar en un lenguaje de alto nivel.

También se puede controlar el tiempo en que tarda una rutina en ejecutarse, e impedir que se interrumpa durante su ejecución.

Ensambladores

Un ensamblador (assembler en inglés) es un programa que crea código objeto traduciendo instrucciones mnemónicas de un programa fuente escrito en Assembly a códigos ejecutables e interpretando los nombres simbólicos para direcciones de memoria y otras entidades (ensamblado). El uso de referencias simbólicas es una característica básica del lenguaje Assembly, evitando tediosos cálculos y direccionamiento manual después de cada modificación del programa. La mayoría de los ensambladores también incluyen facilidades para crear macros, a fin de generar series de instrucciones cortas que se ejecutan en tiempo real, que insertan el código de la macro, en dicha posición, en lugar de utilizar subrutinas.

Los ensambladores han estado disponibles desde la década de 1950. Los ensambladores modernos, especialmente para arquitecturas basadas en RISC que pueden ejecutar varias instrucciones simultáneamente, como por ejemplo MIPS, SPARC y PA-RISC optimizan las instrucciones para explotar al máximo la eficiencia de segmentación de la CPU.

En los compiladores para lenguajes de alto nivel, son el último paso antes de generar el código ejecutable.

Los ensambladores avanzados ofrecen posibilidades de abstracción que incluyen:

Control avanzado de estructuras.

Procedimientos de alto nivel, declaración de funciones.

28 | P á g i n a

Page 30: U4 - Microcontroladores

Tipos de datos que incluyen estructuras, registros, uniones, clases y conjuntos.

Sofisticado procesamiento de macros.

Lenguaje

Un programa escrito en lenguaje Assembly consiste en una serie de instrucciones que corresponden al flujo de órdenes ejecutables que pueden ser cargadas en la memoria de un sistema basado en microprocesador.

Por ejemplo, un procesador x86 puede ejecutar la siguiente instrucción binaria como se expresa en código de máquina:

Binario: 10110000 01100001 (Hexadecimal: 0xb061)

La representación equivalente en lenguaje Assembly es más fácil de recordar:

MOV al, 061h

Esta instrucción significa:

Asigna el valor hexadecimal 61 (97 decimal) al registro "al".

El mnemónico "mov" es un código de operación u "opcode", elegido por los diseñadores de la colección de instrucciones para abreviar "move" (mover, pero en el sentido de copiar valores de un sitio a otro). El opcode es seguido por una lista de argumentos o parámetros, completando una instrucción de Assembly típica.

La transformación del lenguaje Assembly en código máquina la realiza un programa Ensamblador, y la traducción inversa la puede efectuar un desensamblador. A diferencia de los lenguajes de alto nivel, aquí hay usualmente una correspondencia 1 a 1 entre las instrucciones simples del Assembly y el lenguaje de máquina. Sin embargo, en algunos casos, un ensamblador puede proveer "pseudo instrucciones" que se expanden en un código de máquina más extenso a fin de proveer la funcionalidad necesaria. Por ejemplo, para un código máquina condicional como "si X mayor o igual que" , un ensamblador puede utilizar una pseudoinstrucción al grupo "haga si menor que" , y "si = 0" sobre el resultado de la condición anterior. Los Ensambladores más completos también proveen un rico lenguaje de macros que se utiliza para generar código más complejo y secuencias de datos.

El uso del ensamblador no resuelve definitivamente el problema de cómo programar un sistema basado en microprocesador de modo sencillo ya que para hacer un uso eficiente del mismo, hay que conocer a fondo el microprocesador, los registros de trabajo de que dispone, la estructura de la memoria, y muchas cosas más referentes a su estructura básica de funcionamiento.

Cada arquitectura de microprocesadores tiene su propio lenguaje de máquina, y en consecuencia su propio lenguaje Assembly, ya que este se encuentra muy ligado a la estructura del hardware

29 | P á g i n a

Page 31: U4 - Microcontroladores

para el cual se programa, muchas veces dentro de una misma familia de microprocesadores/microcontroladores, la estructura y sintaxis general del Assembly se mantiene, es posible encontrar también similitudes entre lenguajes Assembly de microprocesadores de distintos fabricantes. Los microprocesadores difieren en el tipo y número de operaciones que soportan; también pueden tener diferente cantidad de registros, y distinta representación de los tipos de datos en memoria. Aunque la mayoría de los microprocesadores son capaces de cumplir esencialmente las mismas funciones, la forma en que lo hacen difiere y los respectivos lenguajes Assembly reflejan tal diferencia.

Pueden existir múltiples conjuntos de mnemónicos o sintaxis de lenguaje Assembly para un mismo conjunto de instrucciones, instanciados típicamente en diferentes programas en Assembly. En estos casos, la alternativa más popular es la provista por los fabricantes, y usada en los manuales del programa.

Código máquina

El código máquina, o lenguaje de máquina, está formado por instrucciones sencillas, que -dependiendo de la estructura del procesador- pueden especificar:

Registros específicos para operaciones aritméticas, direccionamiento o control de funciones.

Posiciones de memoria específicas (offset).

Modos de direccionamiento usados para interpretar operandos.

Las operaciones más complejas se realizan combinando estas instrucciones sencillas, que pueden ser ejecutadas secuencialmente o mediante instrucciones de control de flujo.

Las operaciones disponibles en la mayoría de los conjuntos de instrucciones incluyen:

mover

o llenar un registro con un valor constante

o mover datos de una posición de memoria a un registro o viceversa

o escribir y leer datos de dispositivos

computar

o sumar, restar, multiplicar o dividir los valores de dos registros, colocando el resultado en uno de ellos o en otro registro

o realizar operaciones binarias, incluyendo operaciones lógicas (AND/OR/XOR/NOT)

o comparar valores entre registros (mayor, menor, igual)

30 | P á g i n a

Page 32: U4 - Microcontroladores

afectar el flujo del programa

o saltar a otra posición en el programa y ejecutar instrucciones allí

o saltar si se cumplen ciertas condiciones (IF)

o saltar a otra posición, pero guardar el punto de salida para retornar (CALL, llamada a subrutinas)

Algunas computadoras incluyen instrucciones complejas dentro de sus capacidades. Una sola instrucción compleja hace lo mismo que en otras computadoras puede requerir una larga serie de instrucciones, por ejemplo:

salvar varios registros en la pila de una sola vez

mover grandes bloques de memoria

operaciones aritméticas complejas o de punto flotante (seno, coseno, raíz cuadrada)

Mientras que una computadora reconoce la instrucción de máquina IA-32

10110000 01100001

para los programadores de microprocesadores x86 es mucho más fácil reconocer dicha instrucción empleando lenguaje Assembly:

movb 0x61,%al

Este código mueve el valor hexadecimal 61 (97 en decimal) al registro 'al'.

4.3 Aplicaciones

4.3.1 Como sistema independiente

Las aplicaciones específicas de los microcontroladores son tan generalidades sobre microcontroladores enormemente variadas que no se exagera cuando se dice que éstas están limitadas solamente por la imaginación del diseñador.

En cualquier problema en el cual se requiera un instrumento digital compacto que sea capaz de realizar funciones como las siguientes, es posible pensar en sistema basado en un microcontrolador: secuenciamiento, codificación/decodificación, monitoreo, adquisición de datos, señalización, procesamiento de señales, control retroalimentado, temporización, cálculos aritméticos sencillos, comunicaciones, automatización, despliegue digital, control on - off, etc.

31 | P á g i n a

Page 33: U4 - Microcontroladores

4.3.2 Como subsistema de una computadora

Los dispositivos autónomos de la CPU, usan microcontroladores, programados desde fábrica para el funcionamiento del dispositivo, como la unidad de cdrom. el disco duro, la lectograbadora de floppy y dispositivos de entrada salida como las impresoras y los lectores de código de barras. Ninguno de estos, admite actualización de su programación original, aunque en algunos casos es posible flashearlos con el riesgo de inutilizar el dispositivo(algunos microcontroladores traían ventanas para ese fin cubiertas con una faja de seguridad).

En general los dispositivos que traen microcontroladores, no permiten programación, sino una simple elección del usuario, y una calibración como en el caso de dispositivos de medición, y este software que se uso para su programación y que esta guardado en su memoria no volátil, es propiedad del autor e inaccesible desde el exterior.

Los microcontroladores que se usan para distintos fines experimentales, permiten la grabación de un software de ejecución, en algunos casos una sola vez, y en otras reiteradas veces.

No se puede considerar microcontroladores a los chips que componen el sistema en la placa madre, como el sonido, las placas PCI, la aceleradora grafica, porque no tienen memoria propia para conservar su software, sino que dependen de que este sea cargado desde el exterior mediante los llamados "controladores", si bien en todos los demás procesos realizan tareas independientes, pero si podría considerarse un microcontrolador, al BIOS ya que tiene una memoria para su software, para realizar una secuencia de eventos (controles y habilitaciones de los dispositivos) y puede ser actualizado en algunos casos.

32 | P á g i n a