3. INTRODUCCIÓN
Todos los días, desde que nos levantamos hasta acostarnos,
interactuamos con dispositivos electrónicos: despertadores, cafeteras,
secadoras, hornos microondas, licuadoras, ascensores, alarmas de vehículos,
puertas electrónicas, computadores, móviles, etc. Todos estos dispositivos,
que hacen nuestra vida más cómoda y sencilla, poseen dentro de su
electrónica a varios microcontroladores. Hoy hablaremos de estos circuitos
electrónicos y cómo programarlos.
Todas estas tecnologías involucran el uso de microcontroladores,
dispositivos que poseen la capacidad de interactuar con sensores y
actuadores del entorno físico que los rodea, es por ello que es de
importancia el aprender las bases de su funcionamiento y así poder
comprender cómo funcionan e interactúan con nosotros los usuarios.
4. ¿QUÉ ES UN MICROCONTROLADOR?
Cuando compras un computador, ya sea de escritorio o un laptop, dentro de
las características más importantes de comparación básicas siempre
consideraras:
• El procesador o CPU: El centro de procesamiento del computador, ya sea
de la Gama Intel o AMD, siempre comparando el numero de núcleos y la
velocidad en GHz.
• Memoria Ram: Con navegadores como Chrome, siempre necesitarás esos
Gbytes altos.
• Disco Duro: Para almacenar tus series y películas favoritas en 1080p, sin
duda se necesitaras 1 terabyte.
5. ¿QUÉ ES UN MICROCONTROLADOR?
Ahora imagina tener todo esto en un pequeño chip, sin duda no con las mismas
prestaciones, pero las suficientes para cumplir una tarea en específico, cómo calentar tu
café a la temperatura que prefieres. ¿Lo imaginaste? Esto es lo que define a un
Microcontrolador.
Al igual que un computador, posee dispositivos de entrada (mouse, teclado) y
salida (monitor, parlantes) un microcontrolador se basa en este principio contando como
entradas a sensores (temperatura, luz, sonido, etc.) y como salidas a los actuadores (leds,
motores, relés, etc.).
Volviendo al ejemplo de calentar el café, tendríamos como entrada un sensor de
temperatura y como actuador un interruptor interno que desconectara el
electrodoméstico cuando ha alcanzado la temperatura deseada. Como se mencionó para
realizar estas tareas no se necesita mucho procesamiento computacional.
6. PROGRAMACIÓN DE UN MICROCONTROLADOR
Existen dos tendencias en la programación de microcontroladores:
1.- Lenguajes de bajo nivel: Seguramente has escuchado del lenguaje ensamblador, uno de
los primeros lenguajes que utiliza mnemónicos (palabras entendibles por un programador
humano). Como mencionamos anteriormente, poseemos recursos de procesamiento y
memoria limitados, este tipo de programación cercana al lenguaje máquina es ideal para
aprovechar estos recursos al máximo.
Un lenguaje de programación de características bajo nivel es aquel en el que sus
instrucciones ejercen un control directo sobre el hardware y están condicionados por la
estructura física de las computadoras que lo soportan. El uso de la palabra bajo en su
denominación no implica que el lenguaje sea menos potente que un lenguaje de alto nivel,
sino que se refiere a la reducida abstracción entre el lenguaje y el hardware. Por ejemplo,
se utiliza este tipo de lenguajes para programar tareas críticas de los sistemas operativos,
de aplicaciones en tiempo real o controladores de dispositivos.
7. PROGRAMACIÓN DE UN MICROCONTROLADOR
2.- Lenguajes de alto nivel: Uno de los lenguajes de alto nivel más
populares para programar microcontroladores es el lenguaje C o
lenguajes basados en este. Poseen sintaxis mucho más amigables con
el lenguaje usado por los humanos lo que hace que su programación
sea más sencilla, En lenguajes de programación de alto nivel, varias
instrucciones en ensamblador se sustituyen por una única sentencia. El
programador ya no tiene que conocer el conjunto de instrucciones o
características del hardware del microcontrolador utilizado.
9. PROGRAMACIÓN DE UN MICROCONTROLADOR
Un lenguaje de programación de alto nivel se caracteriza por expresar
los algoritmos de una manera adecuada a la capacidad cognitiva humana, en lugar de la
capacidad que se la ejecuta de las máquinas.
En los primeros lenguajes, la limitación era que se orientaban a un área específica
y sus instrucciones requerían de una sintaxis predefinida. Se clasifican como lenguajes
procedimentales o lenguajes de bajo nivel. Otra limitación de estos es que se requiere de
ciertos conocimientos de programación para realizar las secuencias de instrucciones
lógicas. Los lenguajes de alto nivel se crearon para que el usuario común pudiese
solucionar un problema de procesamiento de datos de una manera más fácil y rápida.
Por esta razón, a finales de los años 1950 fue fundada en 1950 y surgió un nuevo
tipo de lenguajes de programación que evitaba estos inconvenientes, a costa de ceder un
poco en las ventajas. Estos lenguajes se llaman de tercera generación o de nivel alto, en
contraposición a los de bajo nivel o de nivel próximo a la máquina.
10. LENGUAJE ENSAMBLADOR
El microcontrolador ejecuta el programa cargado en la memoria Flash. Esto
se denomina el código ejecutable y está compuesto por una serie de ceros y unos,
aparentemente sin significado. Dependiendo de la arquitectura del
microcontrolador, el código binario está compuesto por palabras de 12, 14 o 16 bits
de anchura.
Cada palabra se interpreta por la CPU como una instrucción a ser ejecutada
durante el funcionamiento del microcontrolador. Todas las instrucciones que el
microcontrolador puede reconocer y ejecutar se les denominan colectivamente
Conjunto de instrucciones. Como es más fácil trabajar con el sistema de
numeración hexadecimal, el código ejecutable se representa con frecuencia como
una serie de los números hexadecimales denominada código Hex. En los
microcontroladores PIC con las palabras de programa de 14 bits de anchura, el
conjunto de instrucciones tiene 35 instrucciones diferentes.
11. El lenguaje ensamblador, o assembler (en inglés assembly language y la
abreviación asm), es un lenguaje de programación de bajo nivel. Consiste en un conjunto
de mnemónicos que representan instrucciones básicas para
los computadores, microprocesadores, microcontroladores y otros circuitos
integrados programables. Implementa una representación simbólica de los códigos de
máquina binarios y otras constantes necesarias para programar una arquitectura de
procesador y constituye la representación más directa del código máquina específico para
cada arquitectura legible por un programador.
Cada arquitectura de procesador tiene su propio lenguaje ensamblador que
usualmente es definida por el fabricante de hardware, y está basada en
los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones),
los registros del procesador, las posiciones de memoria y otras características del lenguaje.
Un lenguaje ensamblador es por lo tanto específico de cierta arquitectura de
computador física (o virtual). Esto está en contraste con la mayoría de los lenguajes de
programación de alto nivel, que idealmente son portábles.
LENGUAJE ENSAMBLADOR
12. Un programa utilitario llamado ensamblador es usado para traducir sentencias del lenguaje
ensamblador al código de máquina del computador objetivo. El ensamblador realiza una traducción
más o menos isomorfa (un mapeo de uno a uno) desde las sentencias mnemónicas a las
instrucciones y datos de máquina. Esto está en contraste con los lenguajes de alto nivel, en los
cuales una sola declaración generalmente da lugar a muchas instrucciones de máquina.
Muchos sofisticados ensambladores ofrecen mecanismos adicionales para facilitar el
desarrollo del programa, controlar el proceso de ensamblaje, y la ayuda de depuración.
Particularmente, la mayoría de los ensambladores modernos incluyen una facilidad
de macro (descrita más abajo), y se llaman macro ensambladores.
Fue usado principalmente en los inicios del desarrollo de software, cuando aún no se
contaba con potentes lenguajes de alto nivel y los recursos eran limitados. Actualmente se utiliza
con frecuencia en ambientes académicos y de investigación, especialmente cuando se requiere la
manipulación directa de hardware, alto rendimiento, o un uso de recursos controlado y reducido.
También es utilizado en el desarrollo de controladores de dispositivo (en inglés, device drivers) y en
el desarrollo de sistemas operativos, debido a la necesidad del acceso directo a las instrucciones de
la máquina. Muchos dispositivos programables (como los microcontroladores) aún cuentan con el
ensamblador como la única manera de ser manipulados.
LENGUAJE ENSAMBLADOR
13. • El código escrito en lenguaje ensamblador posee una cierta dificultad de ser
entendido ya que su estructura se acerca al lenguaje máquina, es decir, es un
lenguaje de bajo nivel.
• El lenguaje ensamblador es difícilmente portable, es decir, un código escrito para
un microprocesador, puede necesitar ser modificado, para poder ser usado en
otra máquina distinta. Al cambiar a una máquina con arquitectura diferente,
generalmente es necesario reescribirlo completamente.
• Los programas hechos por un programador experto en lenguaje ensamblador son
generalmente mucho más rápidos y consumen menos recursos del sistema
(memoria RAM y ROM) que el programa equivalente compilado desde un
lenguaje de alto nivel. Al programar cuidadosamente en lenguaje ensamblador se
pueden crear programas que se ejecutan más rápidamente y ocupan menos
espacio que con lenguajes de alto nivel.
CARACTERÍSTICAS LENGUAJE ENSAMBLADOR
14. • Con el lenguaje ensamblador 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 y/o muy ineficientes de programar en
un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje
ensamblador se dispone de instrucciones del CPU que generalmente
no están disponibles en los lenguajes 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.
CARACTERÍSTICAS LENGUAJE ENSAMBLADOR
15. Generalmente, un programa ensamblador (assembler en inglés)
moderno crea código objeto traduciendo instrucciones mnemónicas de
lenguaje ensamblador en opcodes, y resolviendo los nombres
simbólicos para las localizaciones de memoria y otras entidades. El uso
de referencias simbólicas es una característica clave del lenguaje
ensamblador, evitando tediosos cálculos y actualizaciones manuales de
las direcciones después de cada modificación del programa. La mayoría
de los ensambladores también incluyen facilidades de macros para
realizar sustitución textual - ej. generar cortas secuencias de
instrucciones como expansión en línea en vez de llamar a subrutinas.
PROGRAMA ENSAMBLADOR
16. Los ensambladores son generalmente más simples de escribir que
los compiladores para los lenguajes de alto nivel, y han estado disponibles
desde los años 1950. Los ensambladores modernos, especialmente para las
arquitecturas basadas en RISC, tales como MIPS, Sun SPARC, y HP PA-RISC,
así como también para el x86 (-64), optimizan la planificación de
instrucciones para explotar la segmentación del CPU eficientemente.
En los compiladores para lenguajes de alto nivel, son el último paso
antes de generar el código ejecutable.
Número de paso Hay dos tipos de ensambladores basados en cuántos
pasos a través de la fuente son necesarios para producir el programa
ejecutable.
PROGRAMA ENSAMBLADOR
17. • Los ensambladores de un solo paso pasan a través del código fuente
una vez y asumen que todos los símbolos serán definidos antes de
cualquier instrucción que los refiera.
• Los ensambladores de dos pasos crean una tabla con todos los
símbolos y sus valores en el primer paso, después usan la tabla en un
segundo paso para generar código. El ensamblador debe por lo
menos poder determinar la longitud de cada instrucción en el primer
paso para que puedan ser calculadas las direcciones de los símbolos.
PROGRAMA ENSAMBLADOR
18. Siempre ha habido debates sobre la utilidad y el desempeño del lenguaje
ensamblador relativo a lenguajes de alto nivel. El lenguaje ensamblador tiene
nichos específicos donde es importante. Pero, en general, los modernos
compiladores de optimización para traducir lenguajes de alto nivel en código que
puede correr tan rápidamente como el lenguaje ensamblador escrito a mano, a
pesar de los contraejemplos que pueden ser encontrados.
La complejidad de los procesadores modernos y del subsistema de memoria
hace la optimización efectiva cada vez más difícil para los compiladores, así como
para los programadores en ensamblador. Adicionalmente, y para la consternación
de los amantes de la eficiencia, el desempeño cada vez mayor del procesador ha
significado que la mayoría de los CPU estén desocupados la mayor parte del
tiempo, con retardos causados por embotellamientos predecibles tales como
operaciones de entrada/salida y paginación de memoria. Esto ha hecho que la
velocidad de ejecución cruda del código no sea un problema para muchos
programadores.
USO ACTUAL
19. Hay algunas situaciones en las cuales los profesionales pudieran
elegir utilizar el lenguaje ensamblador. Por ejemplo cuando:
• Es requerido un ejecutable binario independiente (stand-alone), es
decir uno que deba ejecutarse sin recursos a componentes de tiempo
de ejecución o a bibliotecas asociadas con un lenguaje de alto nivel;
ésta es quizás la situación más común. Son programas empotrados
que solo almacenan una pequeña cantidad de memoria y el
dispositivo está dirigido para hacer tareas para un simple propósito.
Ejemplos consisten en teléfonos, sistemas de combustible e ignición
para automóviles, sistemas de control del aire acondicionado,
sistemas de seguridad, y sensores.
USO ACTUAL
20. • Interactuando directamente con el hardware, por ejemplo en
controladores (drivers) de dispositivo y manejadores de interrupción.
• Usando instrucciones específicas del procesador no explotadas o
disponibles por el compilador. Un ejemplo común es la instrucción de
rotación bitwise en el núcleo de muchos algoritmos de cifrado.
• Creando funciones vectorizadas para programas en lenguajes de alto
nivel como C. En el lenguaje de alto nivel esto es a veces ayudado por
funciones intrínsecas del compilador que mapean directamente a los
mnemónicos del SIMD, pero sin embargo resulta en una conversión
de ensamblador de uno a uno para un procesador de vector asociado.
USO ACTUAL
21. • Es requerida la optimización extrema, ej, en un bucle interno en un
algoritmo intensivo en el uso del procesador. Los programadores de juegos
toman ventaja de las habilidades de las características del hardware en los
sistemas, permitiendo a los juegos correr más rápidamente. También las
grandes simulaciones científicas requieren algoritmos altamente
optimizados, ej, álgebra lineal con BLAS o la transformada de coseno
discreta (ej, la versión SIMD en ensamblador del x264, (una biblioteca para
codificar streams de video).
• Un sistema con severas limitaciones de recursos (ej, un sistema
empotrado) debe ser codificado a mano para maximizar el uso de los
limitados recursos; pero esto está llegando a ser menos común a medida
que el precio del procesador decrece y el desempeño mejora.
USO ACTUAL
23. C es un lenguaje de programación originalmente desarrollado por Dennis
Ritchie entre 1969 y 1972 en los Laboratorios Bell, como evolución del anterior
lenguaje B, a su vez basado en BCPL.
Al igual que B, es un lenguaje orientado a la implementación de Sistemas
operativos, concretamente Unix. C es apreciado por la eficiencia del código que
produce y es el lenguaje de programación más popular para crear software de
sistemas, aunque también se utiliza para crear aplicaciones.
Se trata de un lenguaje de tipos de datos estáticos, débilmente tipificado,
de medio nivel, ya que dispone de las estructuras típicas de los lenguajes de alto
nivel pero, a su vez, dispone de construcciones del lenguaje que permiten un
control a muy bajo nivel. Los compiladores suelen ofrecer extensiones al lenguaje
que posibilitan mezclar código en ensamblador con código C o acceder
directamente a memoria o dispositivos periféricos.
LENGUAJE C
24. Uno de los objetivos de diseño del lenguaje C es que sólo sean necesarias unas
pocas instrucciones en lenguaje máquina para traducir cada elemento del lenguaje, sin que
haga falta un soporte intenso en tiempo de ejecución. Es muy posible escribir C a bajo nivel
de abstracción; de hecho, C se usó como intermediario entre diferentes lenguajes.
En parte a causa de ser de relativamente bajo nivel y de tener un modesto
conjunto de características, se pueden desarrollar compiladores de C fácilmente. En
consecuencia, el lenguaje C está disponible en un amplio abanico de plataformas (más que
cualquier otro lenguaje). Además, a pesar de su naturaleza de bajo nivel, el lenguaje se
desarrolló para incentivar la programación independiente de la máquina. Un programa
escrito cumpliendo los estándares e intentando que sea portátil puede compilarse en
muchos computadores.
C se desarrolló originalmente (conjuntamente con el sistema operativo Unix, con el
que ha estado asociado mucho tiempo) por programadores para programadores. Sin
embargo, ha alcanzado una popularidad enorme, y se ha usado en contextos muy alejados
de la programación de software de sistema, para la que se diseñó originalmente.
FILOSOFÍA
25. • Núcleo del lenguaje simple, con funcionalidades añadidas importantes,
como funciones matemáticas y de manejo de archivos, proporcionadas
por bibliotecas.
• Es un lenguaje muy flexible que permite programar con múltiples estilos.
Uno de los más empleados es el estructurado "no llevado al extremo"
(permitiendo ciertas licencias de ruptura).
• Un sistema de tipos que impide operaciones sin sentido.
• Usa un lenguaje de preprocesado, el preprocesador de C, para tareas como
definir macros e incluir múltiples archivos de código fuente.
PROPIEDADES
26. • Acceso a memoria de bajo nivel mediante el uso de punteros.
• Interrupciones al procesador con uniones.
• Un conjunto reducido de palabras clave.
• Por defecto, el paso de parámetros a una función se realiza por valor. El
paso por referencia se consigue pasando explícitamente a las funciones las
direcciones de memoria de dichos parámetros.
• Punteros a funciones y variables estáticas, que permiten una forma
rudimentaria de encapsulado y polimorfismo.
• Tipos de datos agregados (struct) que permiten que datos relacionados
(como un empleado, que tiene un id, un nombre y un salario) se combinen
y se manipulen como un todo (en una única variable "empleado").
PROPIEDADES
27. Desde el inicio del lenguaje han surgido varias ramas de evolución que han
generado varios lenguajes:
• Objective-C es un primer intento de proporcionar soporte para
la programación orientada a objetos en C, pero actualmente usado en Mac
OS X, iOS y GNUstep.
• C++ (pronunciado C Plus Plus) diseñado por Bjarne Stroustrup fue el
segundo intento de proporcionar orientación a objetos a C y es la variante
más difundida y aceptada. Esta versión combina la flexibilidad y el acceso
de bajo nivel de C con las características de la programación orientada a
objetos como abstracción, encapsulación y ocultación.
VARIANTES
28. También se han creado numerosos lenguajes inspirados en la sintaxis
de C, pero que no son compatibles con él:
• Java, que une una sintaxis inspirada en la del C++ con una orientación
a objetos más similar a la de Smalltalk y Objective C.
• JavaScript, un lenguaje de scripting creado en Netscape e inspirado
en la sintaxis de Java diseñado para dar a las páginas web mayor
interactividad. A la versión estandarizada se la conoce
como ECMAScript.
• C# (pronunciado C Sharp) es un lenguaje desarrollado
por Microsoft derivado de C/C++ y Java.
VARIANTES
30. JERARQUÍA DE UN SISTEMA AUTOMATIZADO
Los sistemas de automatización industrial pueden muy complejos por
naturaleza, teniendo un gran número de dispositivos trabajando en
sincronización con las tecnologías de automatización. La disposición
jerárquica del sistema de automatización consta de diferentes niveles.
• NIVEL DE CAMPO: Es el nivel más bajo. Incluye los dispositivos de campo
como sensores y actuadores. La principal tarea de estos dispositivos de
campo es transferir los datos de procesos y máquinas al siguiente nivel
superior para monitoreo y análisis. Y también incluye el control de
parámetros de proceso a través de actuadores. Como ejemplo, podríamos
describir este nivel como los ojos y los brazos de un proceso particular. Los
sensores convierten los parámetros de tiempo real (como temperatura,
presión, caudal, nivel, etc.) en señales eléctricas. Estos datos se transfieren
luego al controlador para monitorizar y analizar los parámetros de tiempo
real. Entre los sensores se incluyen termocuplas, sensores de proximidad,
RTDs, caudalímetros, etc.
31. JERARQUÍA DE UN SISTEMA AUTOMATIZADO
• NIVEL DE CONTROL: Este nivel se compone de varios dispositivos de
automatización como máquinas CNC, PLCs, etc., que adquieren los
parámetros de proceso de varios sensores. Los controladores
automáticos accionan los actuadores basándose en las señales
procesadas provenientes de los sensores y en la técnica de
programación o control. Los controladores lógicos programables (PLC,
Programmable Logic Controller) son los controladores industriales
más ampliamente utilizados que son capaces de proporcionar
funciones de control automático basadas en la entrada de sensores.
Constan de varios módulos como CPU, entradas / salidas analógicas,
entradas / salidas digitales y módulos de comunicación. Permite al
operador programar una función o estrategia de control para realizar
ciertas operaciones automáticas durante el proceso.
32. JERARQUÍA DE UN SISTEMA AUTOMATIZADO
• NIVEL DE SUPERVISIÓN Y CONTROL DE PRODUCCIÓN: En este nivel,
dispositivos automáticos y sistemas de monitoreo, tales como las Interfases
Hombre Máquina (HMI) proveen las funciones de control e intervención.
Entre estas funciones se incluyen la supervisión de diversos parámetros,
establecimiento de objetivos de producción, archivado histórico, puesta en
marcha y parada de la máquina, etc. Por lo general, los dispositivos más
utilizados en este nivel son los Sistemas de Control de Distribución (DCS,
Distribution Control System) y HMIs de Control de Supervisión y
Adquisición de Datos (SCADA, Supervisory Control and Data Acquisition).
• NIVEL DE INFORMACIÓN O EMPRESARIAL: Este es el nivel superior de la
automación industrial que gestiona todo el sistema de automatización. Las
tareas de este nivel incluyen la planificación de la producción, análisis de
clientes y mercados, compras y ventas, etc. Por lo tanto, se ocupa más de
las actividades comerciales y menos de los aspectos técnicos.
33. JERARQUÍA DE UN SISTEMA AUTOMATIZADO
• REDES DE COMUNICACIÓN INDUSTRIAL: Por otro lado, otro componente
prominente en los sistemas de automatización industrial son las redes de
comunicación industrial, que transfieren la información de un nivel al otro.
Estas redes están presentes en todos los niveles del sistema de
automatización para proporcionar un flujo continuo de información. No
obstante, las redes de comunicación pueden ser diferentes de un nivel a
otro. Algunas de estas redes incluyen RS485, CAN, DeviceNet, Foundation
Field bus, Profibus, etc.
De la jerarquía anterior podemos concluir que hay flujo de
información continua de nivel alto a nivel bajo y viceversa. Si asumimos esta
forma gráfica, es como una pirámide en la que la información se agrupa a
medida que subimos y obtenemos información detallada sobre el proceso a
medida que bajamos.