Unidad 5. "Arquitecturas Embebidas y Microcontroladores"
Antes de entrar al tema se explicara lo que es un sistema embebido.
Sistema Embebido Un sistema embebido (anglicismo "embedded") o empotrado es un sistema de computación diseñado para realizar una o algunas pocas funciones dedicadas frecuentemente en un sistema de computación en tiempo real . Al contrario de lo que ocurre con los ordenadores de propósito general (como por ejemplo una computadora una computadora personal o PC) que están diseñados para cubrir un amplio rango de necesidades, los sistemas embebidos se diseñan para cubrir necesidades específicas. En un sistema embebido la mayoría de los componentes se encuentran incluidos en la placa base (la tarjeta (la tarjeta de vídeo , audio, módem audio, módem , etc.). Y también lo que es un microcontrolador: Un microcontrolador (abreviado μC, UC o MCU) es un circuito integrado programable,
capaz de ejecutar las órdenes grabadas en su memoria. Está compuesto de varios bloques funcionales, los cuales cumplen una tarea específica. Un micro controlador incluye en su interior las tres principales unidades funcionales de una computadora: Unidad central de procesamiento , memoria y periféricos de entrada/salida de entrada/salida . Tipos de Microcontroladores Los microcontroladores se pueden clasificar en: Microcontroladores embebidos de 8 bits. Microcontroladores de 16-32 bits Procesadores de señales digitales (DSP)
Fabricantes de microcontroladores • INTEL 8048 – 8051 – 80C196 – 80386 • MOTOROLA 6805 – 68HC11 – 68HC12 • HITACHI HD64180 • PHILIPS 8051 (si es el de Intel…) • SGS-THOMSON ST62XX • NATIONAL Semiconductor COP400 – COP800 • ZILOG Z8 – Z86XX • TEXAS INSTRUMENT TMS370 • TOSHIBA 68HC11 (si, el de Motorola…) • MICROCHIP serie PIC • ATMEL 8051 - AT91SAM - AVR - AVR32
5.1 Organización del Microcontrolador. Microcontroladores Microcontroladores de 8 y 16 bits Los microcontroladores de 8 bits dominan el mercado. La razón de esta tendencia es que los microcontroladores 8 bits son apropiados para la gran mayoría de las aplicaciones, lo que hace absurdo emplear micros más potentes y consecuentemente más caros. Uno de los sectores que más tira del mercado del microcontrolador es el mercado automovilístico Un micro de 8 bits puede hacer operaciones lógicas y aritméticas con operandos (datos) de hasta 8 bits con solo una instrucción, algo análogo sucederá con los otros Por ejemplo: El Motorola MC6800 . En cambio un micro de 16 bits maneja palabras del doble de capacidad, esto te permite manejar valores numéricos más grandes en una sola operación (de 0 a 65535 o FFFFh) haciéndolo un poco más rápido en ese tipo de operaciones, y uno de 32 bits maneja valores hasta de 4,294,967,295 (0 a FFFFFFFFh) en una sola operación
Fabricantes de microcontroladores • INTEL 8048 – 8051 – 80C196 – 80386 • MOTOROLA 6805 – 68HC11 – 68HC12 • HITACHI HD64180 • PHILIPS 8051 (si es el de Intel…) • SGS-THOMSON ST62XX • NATIONAL Semiconductor COP400 – COP800 • ZILOG Z8 – Z86XX • TEXAS INSTRUMENT TMS370 • TOSHIBA 68HC11 (si, el de Motorola…) • MICROCHIP serie PIC • ATMEL 8051 - AT91SAM - AVR - AVR32
5.1 Organización del Microcontrolador. Microcontroladores Microcontroladores de 8 y 16 bits Los microcontroladores de 8 bits dominan el mercado. La razón de esta tendencia es que los microcontroladores 8 bits son apropiados para la gran mayoría de las aplicaciones, lo que hace absurdo emplear micros más potentes y consecuentemente más caros. Uno de los sectores que más tira del mercado del microcontrolador es el mercado automovilístico Un micro de 8 bits puede hacer operaciones lógicas y aritméticas con operandos (datos) de hasta 8 bits con solo una instrucción, algo análogo sucederá con los otros Por ejemplo: El Motorola MC6800 . En cambio un micro de 16 bits maneja palabras del doble de capacidad, esto te permite manejar valores numéricos más grandes en una sola operación (de 0 a 65535 o FFFFh) haciéndolo un poco más rápido en ese tipo de operaciones, y uno de 32 bits maneja valores hasta de 4,294,967,295 (0 a FFFFFFFFh) en una sola operación
La familia PIC se divide en cuatro gamas, gamas que podemos llamar mini, baja, media y alta. Las principales diferencias entre estas gamas radica en el número de instrucciones y su longitud, el número de puertos y funciones, lo cual se refleja en el encapsulado, la complejidad interna y de programación, y en el número de aplicaciones Los modelos 12C5xx pertenecen a esta gama, siendo el tamaño de las instrucciones de 12 bits; mientras que los 12C6xx son de la gama media y sus instrucciones tienen 14 bits. Los modelos 12F6xx poseen memoria Flash para el programa y EEPROM para los datos. Algunos modelos disponen de conversores Analógico/Digital de 8 bits incorporados.
La gama baja o básica consiste en una serie de PIC de recursos limitados, pero con una de la mejores relaciones coste/prestaciones de la familia. f amilia. Sus versiones están encapsuladas con 18 y 28 patitas y pueden alimentarse a partir de una tensión de 2,5 V, lo que les hace ideales en las aplicaciones que funcionan con pilas teniendo en cuenta su bajo consumo (menos de 2 mA a 5 V y 4 MHz). Tienen un repertorio de 33 instrucciones cuyo formato f ormato consta de 12 bits. Al igual i gual que todos los miembros de la familia PIC16/17, los componentes de la gama baja se caracterizan por poseer los siguientes recursos: Sistema “Power On Reset”, Perro guardián
(Watchdog o WDT), Código de protección, etc.
La denominada gama media es la más variada y completa de los PIC. Abarca modelos con encapsulado desde 18 hasta 68 pines, cubriendo varias opciones que integran abundantes periféricos. Dentro de esta gama se halla el famoso PIC16F84, quizás el modelo más utilizado en la historia de los microcontroladores, aunque ya se lo considera obsoleto.
Encuadrado en la gama media también se halla la versión PIC14C000, que soporta el diseño de controladores inteligentes para cargadores de baterías, pilas pequeñas, fuentes de alimentación y UPS y cualquier sistema de adquisición y procesamiento de señales que requiera gestión de la energía de alimentación. Los PIC 14C000 admiten cualquier tecnología de las baterías como Li-Ion, NiMH, NiCd, Ph y Zinc. La gama alta dispone de chips con 58 instrucciones de 16 bits en el repertorio y que disponen de un sistema de gestión de interrupciones vectorizadas muy potente. También incluyen variados controladores de periféricos, puertos de comunicación serie y paralelo con elementos externos, un multiplicador hardware de gran velocidad y mayores capacidades de memoria, que alcanza los 8 k palabras en la memoria de instrucciones y 454 bytes en la memoria de datos. Microcontroladores de 8 bits Microcontroladores § Todos los recursos necesarios están incluidos en el chip. § Solo necesitan alimentación y reloj.
§ Proporcionan control e interfaz con dispositivos externos de manera económica y programable.
§ § § § § § § § § § §
Microcontroladores de 8 bits Disponen de: Reset Reloj Procesador Memoria ROM para el programa e interfaz de programación Memoria RAM para variables. I/O Pins. Adicionalmente pueden incluir: Capacidad de debugging Interrupciones I/O analógica Comunicación serial y/o paralela Interfaz con memoria
FAMILIAS DE INTEL, MOTOROLA Y MICROSYSTEM
Familias Intel:
podemos mencionar como referencia histórica, a la familia MCS®-48 compuesta principalmente por el 8048AH.
Los microcontroladores de esta familia poseen una CPU de 8 bits, 27 líneas de Entrada / Salida, un Temporizador / contador (Timer /Counter) programable. Dependiendo del modelo (8050, 8049,8048) poseen respectivamente 256, 128 o 64 bytes de RAM estática. Existen en versiones ROM, EPROM, Flash. Alguno de los microcontroladores, no poseen memoria para almacenamiento de código ejecutable, entonces se reservan algunas líneas de Entrada / Salida para armar los tres
buses necesarios (direcciones, datos y control), de esta forma el programa puede ser almacenado en cualquier memoria internas (ROM, EPROM, E2PROM, FLASH, NVRAM, etc.) y accedido por estos buses. Más recientemente encontramos a la familia MCS®-51, quizás la más prolífica en su momento, ya que un gran número de fabricantes de hardware y software implementaron sistemas sobre la base de esta familia de microcontroladores y una gran cantidad de herramientas de desarrollo como compiladores de lenguaje “C”, simuladores, emuladores en tiempo real3 ICE’s (In Circuit Emulators), etc. Debido a que este apunte está orientado en particular al estudio de esta familia, no la trataremos en detalle por ahora, lo que podemos agregar es que no existe compatibilidad con su antecesor (MCS®-48) a nivel software o hardware, si bien existe algunos programas (bastante primitivos, por cierto) para convertir código de MCS®-48 a MCS®-51.
Características
| Beneficios |
CPU de 8-bit optimizada para control de eventos | Eficiencia en el diseño de control de eventos | Procesamiento booleano |
| Facilidad.simple manipulación de bit
Memoria on-chip (32K) | Soluciones.Hace posible diseños en una sola pastilla Periféricos on-chip (timer/contador, puerto serial, PCA, etc.) posible diseños de bajo costo con puertos de I/O |
|
| Alta integración. Hace
INTEL (La fam ilia 8051)
8051 es el primer microcontrolador de la familia introducida por Intel Corporation. La familia 8051 de microcontroladores son controladores de 8 bits capaces de direccionar hasta 64 Kbyte de memoria de programa y una separada memoria de datos de 64 Kbyte. El 8031(la versión sin ROM interna del 8051, siendo esta la única diferencia) tiene 128 bytes de RAM interna (el 8032 tiene RAM interna de 256 bytes y un temporizador adicional). El 8031 tiene dos temporizadores/contadores, un puerto serie, cuatro puertos
de entrada/salida paralelas de propósito general (P0, P1, P2 y P3) y una lógica de control de interrupción con cinco fuentes de interrupciones. Al lado de la RAM interna, el 8031 tiene varios Registros de Funciones especiales (SFR) (Special Function Registers) que son para control y registros de datos. Los SFRs también incluyen el registro acumulador, el registro B, y el registro de estado de programa (Program Status Word)(PSW), que contienen los Flags del CPU. Bloques separados de memoria de código y de datos se denomina como la Arquitectura Harvard. El 8051 tiene dos señales de lectura separadas, los pines RD(P3.7, pin 17) y PSEN(pin 29). El primero es activado cuando un byte va ser leído desde memoria de datos externo; el otro, cuando un byte va ser leído desde memoria de programa externo. Ambas de estas señales son señales activas en nivel bajo.
Familias Motorola: Al igual que en el campo de los microprocesadores, existe una batalla comercial y un mercado que se reparten fundamentalmente entre Intel y Motorola en lo que a Microcontroladores se refiere. Motorola posee una familia de microcontroladores 6805 de bajo costo, muy popular y con el que también se han desarrollado infinidad de aplicaciones y herramientas, quizás con más variedad de integrantes en su familia que los Intel. Esta familia cuenta con versiones ROM, EPROM, E2PROM y flash. Una de las particularidades de esta familia es que sus integrantes son autocontenidos, es decir que se deberán utilizar exclusivamente los recursos internos ya que no disponen de buses de expansión y por ende no pueden conectarse memorias ni de datos ni de programa externas. Otra familia importante y más reciente es la de los Microcontroladores 68HC11, razonablemente compatible con sus antecesores, incorporando a diferencia que sus hermanos menores, conversores A/D multiplexados, versiones OTP (One Time Programmable), mayor cantidad de memoria para programas y datos, circuito de Watchdog4, más cantidad de temporizadores y más funcionales, etc. La familia Motorola 68HC11 (abreviado HC11 o 6811) es una familia de microcontroladores de Motorola, derivada del microprocesador Motorola 6800. Los microcontroladores 68HC11 son más potentes y costosos que los de la familia 68HC05 y se utilizan en múltiples dispositivos empotrados. El más ocupado de 32 bits es: El Freescale ColdFire es un microprocesador de arquitectura de 68k fabricado para desarrollo de sistemas integrados por Freescale (anteriormente el sector dedicado a semiconductores de Motorola).
Familias COP de National:
National Semiconductor posee unas familias de Microcontroladores de 4, 8 y 16 bits que denominaron COPS. Una característica interesante de estas familias es la utilización de un bus especial para periféricos compatibles con dicha familia (conversores varios, memorias no volátiles, etc.) llamado bus Microwire®.
Familias Microchip PIC.
La característica principal de esta familia es que el microprocesador de estos microcontroladores es tipo RISC (Reduced Instruction Set Computer) conteniendo algo más de treinta instrucciones simples y rápidas. Esto los hace mucho más rápidos y con un código más compacto (y repertorio de instrucciones más fácil de manejar) que los de tipo CISC (Complex Instruction Set Computer) pertenecientes a otros fabricantes. Existe compatibilidad de código entre los distintos integrantes de la familia, teniendo como atractivo trascendente su muy bajo costo y disponibilidad de compiladores de libre disponibilidad así como programadores fácilmente armables por el usuario. 5.2 CONJUNTO DE INSTRUCCIONES Y LENGUAJE ENSAMBLADOR
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. Existe principalmente de 3 tipos: CISC ( Complex Instruction Set Computer ), RISC (Reduced Instruction Set Computer ) y SISC (Simple Instruction Set Computing). 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 encuentran las microinstrucciones y los sistemas de caché.
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 diferentes.
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 ejem plo, 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. 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 han 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. RISC, fueron los primeros implementados con profundidad en el período de rápido crecimiento de las memorias de subsistemas, se reduce el código con el fin de simplificar el circuito de aplicación y con ello tratar de aumentar el rendimiento a través de las frecuencias de reloj más elevadas y el uso de más registros. Las instrucciones RISC suelen realizar sólo una operación, como una "suma" de registros o una "carga" de una posición de memoria en un registro, también suelen utilizar una longitud de instrucciones fijas, mientras que un conjunto de instrucciones típicas CISC tiene instrucciones muchos más cortas que esta longitud fija. Las instrucciones de longitud fija son menos complicadas de manejar que las instrucciones de ancho variable, por varias razones (por ejemplo: no tener que comprobar si una instrucción se extiende a ambos lados de una línea de caché o el límite de memoria virtual de la página), y por lo tanto algo más fácil de optimizar la velocidad . Sin embargo, como los equipos RISC normalmente requieren más y más para implementar las instrucciones que ejecutan una determinada tarea, hacen menos óptimo el uso del ancho de banda y de la memoria caché. 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. Éstos tipo de núcleos llevan a
menudo poco silicio para implementarse, así que pueden ser observadas fácilmente en un FPGA o en una forma multinucleo. 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. Número de operandos
El conjunto de instrucciones puede ser clasificado por el número máximo de operandos explícitamente especificados en las instrucciones. (en los ejemplos que siguen, a, b y c se refieren a celdas de memoria, mientras que reg1 y sucesivos se refieren a los registros de la máquina).
0-operando, también llamada máquina de pila: todas las operaciones aritméticas se ejecutan en la parte superior de una o dos posiciones de la pila, push y pop son las instrucciones utilizadas para acceder a la memoria: push a, push b, add, pop c. 1-operando (máquinas de una dirección), también llamadas máquinas de acumulador, incluida en la mayoría de las primeras computadoras y muchos microcontroladores pequeños: la mayoría de instrucciones especifican un operando explícito a la derecha (un registro, una posición de memoria, o una constante) y un operando a la izquierda: load a, add b, store c. 2-operando – la mayoría de las máquinas CISC y RISC entran en esta categoría: CISC – load a, reg1, add reg1, b; store reg1, c RISC - cargas que requieren la memoria explícita, las instrucciones serían: load a,reg1; load b,reg2; add reg1,reg2; store reg2,c 3-operando, permite una mejor reutilización de los datos: CISC - bien una sola instrucción: add a, b, c, o más generalmente: move a,reg1; add reg1,b,c como la mayoría de las máquinas se limitan a dos operandos de memoria. RISC - Debido a la gran cantidad de bits necesarios para codificar los tres registros, este esquema no suele estar disponible en los procesadores RISC con pequeñas instrucciones de 16 bits: load a,reg1; load b,reg2; add reg1+reg2->reg3; store reg3,c; más operandos, algunas máquinas CISC permiten una variedad de modos de direccionamiento que permiten más de 3 operandos (registros o accesos a memoria), como el VAX "POLY", instrucción de evaluación de polinomi
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. 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 y ejemplos
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.
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.
subtract: Resta.
subtract 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. 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
-> 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 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: Instrucciones
de
E/S: Son
->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: Pemite 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.
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).
El lenguaje ensamblador
En el lenguaje ensamblador el programador utiliza instrucciones simbólicas en lugar de instrucciones de máquina y nombres descriptivos para los elementos de datos y para las localidades de memoria. Usted escribe un programa en ensamblador de acuerdo con un conjunto estricto de reglas que después utiliza el programa traductor de ensamblador para convertir el programa ensamblador en código máquina. Existen 2 clases de lenguajes de programación: de alto nivel y de bajo nivel. Los programadores que escriben en un lenguaje de alto nivel (como C y Pascal), codifican comandos poderosos, cada uno de los cuales puede generar muchas instrucciones en lenguaje de máquina. Por otro lado, los programadores que escriben en un lenguaje ensamblador de bajo nivel codifican instrucciones simbólicas, cada una de las cuales genera una instrucción en lenguaje máquina. A pesar del hecho de que codificar en un lenguaje de alto nivel es más productivo, algunas ventajas de codificar en lenguaje ensamblador son:
Proporciona más control sobre el manejo particular de los requerimientos de hardware.
Genera módulos ejecutables más pequeños y más compactos.
Con mayor probabilidad tiene una ejecución más rápida.
Una práctica común es combinar los beneficios de ambos niveles de programación. Un lenguaje de alto nivel utiliza un compilador para traducir el código fuente a lenguaje máquina. Un lenguaje de bajo nivel utiliza un ensamblador para realizar la traducción. Un programa en lenguaje ensamblador consiste en un conjunto de enunciados. Los dos tipos de enunciados o líneas de programación son: 1.- Instrucción, tal como MOV y ADD, que el ensamblador traduce a código objeto 2.- Directiva, que indican al ensamblador que realice una acción específica, como definir un elemento de dato.
El único lenguaje que entienden los microcontroladores es el código máquina formado por ceros y unos del sistema binario. El lenguaje ensamblador expresa las instrucciones de una forma más natural al hombre a la vez que muy cercana al microcontrolador, ya que cada una de esas instrucciones se corresponde con otra en código máquina. El lenguaje ensamblador trabaja con nemónicos, que son grupos de caracteres alfanuméricos que simbolizan las órdenes o tareas a realizar.
La traducción de los nemónicos a código máquina entendible por el microcontrolador la lleva a cabo un programa ensamblador. El programa escrito en lenguaje ensamblador se denomina código fuente (*.asm). El programa ensamblador proporciona a partir de este fichero el correspondiente código máquina, que suele tener la extensión *.hex.
LENGUAJE ENSAMBLADOR
En el lenguaje ensamblador el programador utiliza instrucciones simbólicas en lugar de instrucciones de máquina y nombres descriptivos para los elementos de datos y para las localidades de memoria. Usted escribe un programa en ensamblador de acuerdo con un conjunto estricto de reglas que después utiliza el programa traductor de ensamblador para convertir el programa ensamblador en código máquina. Existen 2 clases de lenguajes de programación: de alto nivel y de bajo nivel. Los programadores que escriben en un lenguaje de alto nivel (como C y Pascal), codifican comandos poderosos, cada uno de los cuales puede generar muchas instrucciones en lenguaje de máquina. Por otro lado, los programadores que escriben en un lenguaje ensamblador de bajo nivel codifican instrucciones simbólicas, cada una de las cuales genera una instrucción en lenguaje máquina. A pesar del hecho de que codificar en un lenguaje de alto nivel es más productivo, algunas ventajas de codificar en lenguaje ensamblador son:
Proporciona más control sobre el manejo particular de los requerimientos de hardware. Genera módulos ejecutables más pequeños y más compactos. Con mayor probabilidad tiene una ejecución más rápida. Una práctica común es combinar los beneficios de ambos niveles de programación. Un lenguaje de alto nivel utiliza un compilador para traducir el código fuente a lenguaje máquina. Un lenguaje de bajo nivel utiliza un ensamblador para realizar la traducción. Un programa en lenguaje ensamblador consiste en un conjunto de enunciados. Los dos tipos de enunciados o líneas de programación son:
1.- Instrucción, tal como MOV y ADD, que el ensamblador traduce a código objeto 2.- Directiva, que indican al ensamblador que realice una acción específica, como definir un elemento de dato. CONJUNTO DE INSTRUCCIONES EN LENGUAJE ENSAMBLADOR ACALL
Llamar Absoluto
AÑADIR
Añadir Acumulador
ADDC
Añadir acumulador con Carry
AJMP
Salto Absoluto
ANL
Y lógico para las variables byte
ANL bits
Y lógico para las variables de bit
CJNE
Comparar y salta si no es igual
CLR A
Borrar Acumulador
Poco CLR
Claro bits
CPL A
Complementar Acumulador
Poco CPL
Poco Complemento
DA
Decimal Ajuste del acumulador
Diciembre
Disminuye el Registro
DIV
Divide Acumulador por B
DJNZ
Disminuye el Registro y Salta si no es cero
INC
Incrementa el Registro
JB
Saltar si Set Bit
JBC
Saltar si Bit Set y Clear Bit
JC
Saltar si Set Carry
JMP @
Saltar indirecta para abordar
JNB
Saltar si Bit no activado
JNC
Saltar si Lleve Not Set
JNZ
Saltar si Acumulador No Zero
JZ
Saltar si Acumulador Zero
LCALL
Long Call
LJMP
Salto de longitud
MOV
Mueva la variable byte
Poco MOV
Poco Move
MOVC
Mueva Memoria Código
MOVX
Mueva Memoria externa
MUL
Multiplicar por acumulador B
NOP
No Operación
ORL
OR lógico de variables de tipo Byte
ORL bits
OR lógico de variables de bit
POP
Pop De Pila
PUSH
Empuje en la pila
RET
Regresa de la subrutina
RETI
Regreso de la interrupción
RL
Gire Acumulador Izquierda
RLC
Gire Acumulador Izquierda través Carry
RR
Gire Acumulador Derecha
RRC
Gire Acumulador derecha a través de Carry
SETB
Bit Set
SJMP
Corto Jump
SUBB
Restar de acumulador con Borrow
SWAP
Cambie los acumuladores Nibbles
XCH
Tipo Bytes
XCHD
Dígitos Tipo
XRL
OR exclusivo
??
Instrucción Indefinido
Ventajas y desventajas del Lenguaje Ensamblador Una vez que hemos visto la evolución de los lenguajes, cabe preguntarse: ¿En estos tiempos "modernos", para qué quiero el Lenguaje Ensamblador? El proceso de evolución trajo consigo algunas desventajas, que ahora veremos cómo las ventajas de usar el Lenguaje Ensamblador, respecto a un lenguaje de alto nivel:
Eficiencia de tamaño
Flexibilidad
Por otro lado, al ser un lenguaje más primitivo, el Ensamblador tiene ciertas desventajas respecto a los lenguajes de alto nivel:
Tiempo de programación
Programas fuente grandes
Peligro de afectar recursos inesperadamente
Falta de portabilidad
Velocidad
El proceso de traducción que realizan los intérpretes, implica un proceso de cómputo adicional al que el programador quiere realizar. Por ello, nos encontraremos con que un intérprete es siempre más lento que realizar la misma acción en Lenguaje Ensamblador, simplemente porque tiene el costoadicional de estar traduciendo el programa, cada vez que lo ejecutamos. De ahí nacieron los compiladores, que son mucho más rápidos que los intérpretes, pues hacen la traducción una vez y dejan el código objeto, que ya es Lenguaje de Máquina, y se puede ejecutar muy rápidamente. Aunque el proceso de traducción es más complejo y costoso que el de ensamblar un programa, normalmente podemos despreciarlo, contra las ventajas de codificar el programa más rápidamente. Sin embargo, la mayor parte de las veces, el código generado por un compilador es menos eficiente que el código equivalente que un programador escribiría. La razón es que el compilador no tiene tanta inteligencia, y requiere ser capaz de crear código genérico, que sirva tanto para un programa como para otro; en cambio, un programador humano puede aprovechar las características específicas del problema, reduciendo la generalidad pero al mismo tiempo, no desperdicia ninguna instrucción, no hace ningún proceso que no sea necesario. Para darnos una idea, en una PC, y suponiendo que todos son buenos programadores, un programa para ordenar una lista tardará cerca de 20 veces más en Visual Basic (un intérprete), y 2 veces más en C (un compilador), que el equivalente en Ensamblador. Por ello, cuando es crítica la velocidad del programa, Ensamblador se vuelve un candidato lógico como lenguaje. Ahora bien, esto no es un absoluto; un programa bien hecho en C puede ser muchas veces más rápido que un programa mal hecho en Ensamblador; sigue siendo sumamente importante la elección apropiada de algoritmos y estructuras de datos. Por ello, se recomienda buscar optimizar primero estos aspectos, en el lenguaje que se desee, y solamente usar Ensamblador cuando se requiere más optimización y no se puede lograr por estos medios. Tamaño
Por las mismas razones que vimos en el aspecto de velocidad, los compiladores e intérpretes generan más código máquina del necesario; por ello, el programa ejecutable crece. Así, cuando es importante reducir el tamaño del ejecutable, mejorando el uso de la memoria y teniendo también
beneficios en velocidad, puede convenir usar el lenguaje Ensamblador. Entre los programas que es crítico el uso mínimo de memoria, tenemos a los virus y manejadores de dispositivos (drivers). Muchos de ellos, por supuesto, están escritos en lenguaje Ensamblador. Flexibilidad
Las razones anteriores son cuestión de grado: podemos hacer las cosas en otro lenguaje, pero queremos hacerlas más eficientemente. Pero todos los lenguajes de alto nivel tienen limitantes en el control; al hacer abstracciones, limitan su propia capacidad. Es decir, existen tareas que la máquina puede hacer, pero que un lenguaje de alto nivel no permite. Por ejemplo, en Visual Basic no es posible cambiar la resolución del monitor a medio programa; es una limitante, impuesta por la abstracción del GUI Windows. En cambio, en ensamblador es sumamente sencillo, pues tenemos el acceso directo al hardware del monitor. Tiempo de programación
Al ser de bajo nivel, el Lenguaje Ensamblador requiere más instrucciones para realizar el mismo proceso, en comparación con un lenguaje de alto nivel. Por otro lado, requiere de más cuidado por parte del programador, pues es propenso a que los errores de lógica se reflejen más fuertemente en la ejecución. Por todo esto, es más lento el desarrollo de programas comparables en Lenguaje Ensamblador que en un lenguaje de alto nivel, pues el programador goza de una menor abstracción. Programas fuente grandes
Por las mismas razones que aumenta el tiempo, crecen los programas fuentes; simplemente, requerimos más instrucciones primitivas para describirprocesos equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los programas, y nuevamente reduce la productividad de los programadores. Peligro de afectar recursos inesperadamente
Tenemos la ventaja de que todo lo que se puede hacer en la máquina, se puede hacer con el Lenguaje Ensamblador (flexibilidad). El problema es que todo error que podamos cometer, o todo riesgo que podamos tener, podemos tenerlo también en este Lenguaje. Dicho de otra forma, tener muchopoder es útil pero también es peligroso. En la vida práctica, afortunadamente no ocurre mucho; sin embargo, al programar en este lenguaje verán que es mucho más común que la máquina se "cuelgue", "bloquee" o "se le vaya el avión"; y que se reinicialize. ¿Por qué?, porque con este lenguaje es perfectamente posible (y sencillo) realizar secuencias de instrucciones inválidas, que normalmente no aparecen al usar un lenguaje de alto nivel.
En ciertos casos extremos, puede llegarse a sobrescribir información del CMOS de la máquina (no he visto efectos más riesgosos); pero, si no la conservamos, esto puede causar que dejemos de "ver" el disco duro, junto con toda su información. Falta de portabilidad
Como ya se mencionó, existe un lenguaje ensamblador para cada máquina; por ello, evidentemente no es una selección apropiada de lenguaje cuando deseamos codificar en una máquina y luego llevar los programas a otros sistemas operativos o modelos de computadoras. Si bien esto es un problema general a todos los lenguajes, es mucho más notorio en ensamblador: yo puedo reutilizar un 90% o más del código que desarrollo en "C", en una PC, al llevarlo a una RS/6000 con UNIX, y lo mismo si después lo llevo a una Macintosh, siempre y cuando esté bien hecho y siga los estándares de "C", y losprincipios de la programación estructurada. En cambio, si escribimos el programa en Ensamblador de la PC, por bien que lo desarrollemos y muchos estándares que sigamos, tendremos prácticamente que reescribir el 100 % del código al llevarlo a UNIX, y otra vez lo mismo al llevarlo a Mac.
Veamos ahora como se organizan y una breve descripción de los mismos: Registro de R de 16 b al que 8 bits pertenece
Descripción
A
AF
Acumulador. El registro más usado J .
F
AF
Flags. Indicadores de estado.
B
BC
Normalmente usado como contador.
C
BC
D
DE
E
DE
H
HL
L
HL
HL es ideal para acceder a memoria J .
A’
AF’
A alternativo.
F’
AF’
F alternativo.
B’
BC’
B alternativo.
C’
BC’
C alternativo.
D’
DE’
D alternativo.
E’
DE’
E alternativo.
H’
HL’
H alternativo.
L’
HL’
L alternativo.
Xh
IX
IX vale para direccionamiento indexado.
Xl
IX
Yh
IY
Yl
IY
I
"IR"
Registro de interrupción.
R
"IR"
Registro de refresco.
PC
Contador del programa.
SP
Contador de la pila.
IY vale para direccionamiento indexado.
A parte de esos, tiene otro dos que son boléanos (1 sólo bit), llamados iff0 y iff1 (y al m enos otro registro interno de 8 bits para cálculos internos suyos). Los registros con un <’> son alternativos. Digamos que están en el banquillo esperando que salga del juego su homólogo para entrar él. No se les puede acceder directamente (habría más jugadores de los reglamentarios), pero siempre se puede hacer el cambio (aquí son ilimitados). Siempre que se produce uno de éstos cambios, se intercambia un registro de 16 bits enterito. No vale cambiar sólo uno de 8.
Xh, Yh, Xl, Yl son los registros de 8 bits que conforman IX e IY. Oficialmente, las instrucciones que operan sobre ellos están indocumentadas, pero me parece una tontería el no hablar de ellos desde el principio. PC contiene el "contador del programa", es decir, la dirección de memoria en la cual el procesador leerá su próxima instrucción Modos de direccionamiento
Se les llama modos de direccionamiento a las distintas formas de combinar los operadores según el acceso que se hace a memoria. Dicho de otra manera, un modo de direccionamiento será una forma de parámetro para las instrucciones. Una instrucción que lleve un parámetro, por lo tanto, usará un modo de direccionamiento, que dependerá de cómo direccionará (accesará) al parámetro; una instrucción de dos parámetros, combinará dos modos de direccionamiento.
Modo registro
Usa solamente registros como operadores Es el más rápido, pues minimiza los recursos necesarios (toda la información fluye dentro del EU del CPU).
Modo inmediato
Tiene dos operandos: un registro y una constante que se usa por su valor. El valor constante no se tiene que buscar en memoria, pues ya se obtuvo al hacer el "fetch" de la instrucción. Por tanto, es rápido aunque no tanto como el modo registro; requiere ir al BIU por el dato.
Modo directo
Uno de los operandos involucra una localidad específica de memoria El valor constante se tiene que buscar en memoria, en la localidad especificada. Es más lento que los anteriores, pero es el más rápido para ir a memoria, pues ya "sabe" la localidad, la toma de la instrucción y no la tiene que calcular.
Modo indirecto
Se usan los registros SI, DI como apuntadores El operando indica una localidad de memoria, cuya dirección (sólo la parte desplazamiento) está en SI o DI.
Es más lento que los anteriores, pues tiene que "calcular" la localidad.
Modo indexado de base
Formato: [ BX o BP + SI o DI (opcionales) + constante (opcional) ] BX o BP indica una localidad base de la memoria A partir de BX o BP, se puede tener un desplazamiento variable y uno constante La diferencia es el segmento sobre el que trabajan por defecto: BX por defecto en el segmento de datos BP por defecto en el segmento de pila.
5.3 Características y uso de elementos del microcontrolador. Los micro-controlador son diseñados para reducir el costo económico y el consumo de energía de un sistema en particular. El tamaño de la unidad central de procesamiento, la cantidad de memoria y los periféricos incluidos dependerán de la aplicación.
Puertos de comunicación. Puerto serie Este periférico está presente en casi cualquier microcontrolador, normalmente en forma de UART (Universal Asynchronous Receiver Transmitter) o USART (Universal Synchronous Asynchronous Receiver Transmitter) dependiendo de si permiten o no el modo sincrónico de comunicación.
El destino común de este periférico es la comunicación con otro microcontrolador o con una PC y en la mayoría de los casos hay que agregar circuitos externos para completar la interfaz de comunicación. La forma más común de completar el puerto serie es para comunicarlo con una PC mediante la interfaz EIA-232 (más conocida como RS-232), es por ello que muchas personas se refieren a la UART o USART como puerto serie RS-232, pero esto constituye un error, puesto que este periférico se puede utilizar para interconectar dispositivos mediante otros estándares de comunicación. SPI Este tipo de periférico se utiliza para comunicar al microcontrolador con otros microcontroladores o con periféricos externos conectados a él, por medio de una interfaz muy sencilla. Hay solo un nodo controlador que permite iniciar cualquier transacción, lo cual es una desventaja en sistemas complejos, pero su sencillez permite el aislamiento galvánico de forma directa por medio de opto acopladores. I2C Cumple las mismas funciones que el SPI, pero requiere menos señales de comunicación y cualquier nodo puede iniciar una transacción. Es muy utilizado para conectar las tarjetas gráficas de las computadoras personales con los monitores, para que estos últimos informen de sus prestaciones y permitir la autoconfiguración del sistema de vídeo.
USB Los microcontroladores son los que han permitido la existencia de este sistema de comunicación. Es un sistema que trabaja por polling (monitorización) de un conjunto de periféricos inteligentes por parte de un amo, que es normalmente un computador personal. Cada modo inteligente está gobernado inevitablemente por un microcontrolador. Temporizadores y contadores Son circuitos sincrónicos para el conteo de los pulsos que llegan a su poder para conseguir la entrada de reloj. Si la fuente de un gran conteo es el oscilador interno del microcontrolador es común que no tengan un pin asociado, y en este caso trabajan como temporizadores. Por otra parte, cuando la fuente de conteo es externa, entonces tienen asociado un pin configurado como entrada, este es el modo contador.
Los temporizadores son uno de los periféricos más habituales en los microcontroladores y se utilizan para muchas tareas, como por ejemplo, la medición de frecuencia, implementación de relojes, para el trabajo de conjunto con otros periféricos que requieren una base estable de tiempo entre otras funcionalidades. Es frecuente que un microcontrolador típico incorpore más de un temporizador/contador e incluso algunos tienen arreglos de contadores. Como veremos más adelante este periférico es un elemento casi imprescindible y es habitual que tengan asociada alguna interrupción. Los tamaños típicos de los registros de conteo son 8 y 16 bits, pudiendo encontrar dispositivos
que solo tienen temporizadores de un tamaño o con más frecuencia con ambos tipos de registro de conteo. Conversor analógico/digital Como es muy frecuente el trabajo con señales analógicas, éstas deben ser convertidas a digital y por ello muchos microcontroladores incorporan un conversor analógico-digital, el cual se utiliza para tomar datos de varias entradas diferentes que se seleccionan mediante un multiplexor.
Las resoluciones más frecuentes son 8 y 10 bits, que son suficientes para aplicaciones sencillas. Para aplicaciones en control e instrumentación están disponibles resoluciones de 12bit, 16bit y 24bit.También es posible conectar un convertidor externo, en caso de necesidad. 5.4 APLICACIONES DE LOS MICROCONTROLADORES
Cada vez existen más productos que incorporan un microcontrolador con el fin de aumentar sustancialmente sus prestaciones, reducir su tamaño y coste, mejorar su fiabilidad y disminuir el consumo. Algunos fabricantes de microcontroladores superan el millón de unidades de un modelo determinado producidas en una semana. Este dato puede dar una idea de la masiva utilización de estos componentes. Los microcontroladores están siendo empleados en multitud de sistemas presentes en nuestra vida diaria, como pueden ser juguetes, horno microondas, frigoríficos, televisores, computadoras, impresoras, módems, el sistema de arranque de nuestro automovil, etc. Y otras aplicaciones con las que seguramente no estaremos tan familiarizados como instrumentación electrónica, control de sistemas en una nave espacial, etc. Una aplicación típica podría emplear varios microcontroladores para controlar pequeñas partes del sistema. Estos pequeños controladores podrían comunicarse entre ellos y con un procesador central, probablemente más potente, para compartir la información y coordinar sus acciones, como, de hecho, ocurre ya habitualmente en cualquier PC
.
Los microcontroladores se encuentran por todas partes:
Sistemas de comunicación: en grandes automatismos como centrales y en teléfonos fijos, móviles, fax, etc. Electrodomésticos: lavadoras, hornos, frigoríficos, lavavajillas, batidoras, televisores, vídeos, reproductores DVD, equipos de música, mandos a distancia, consolas, etc. Industria informática: Se encuentran en casi todos los periféricos; ratones, teclados, impresoras, escáner, etc. Automoción: climatización, seguridad, ABS, etc. Industria: Autómatas, control de procesos, etc Sistemas de supervisión, vigilancia y alarma: ascensores, calefacción, aire acondicionado, alarmas de incendio, robo, etc. Otros: Instrumentación, electromedicina, tarjetas (smartcard), sistemas de navegación, etc.