+1 500 000 productos en oferta

7000 paquetes cada día

+300 000 clientes de 150 países

Quick Buy Favoritos
Carrito

¿Cómo programar un microcontrolador? Los lenguajes de programación de microcontroladores más populares.

Fecha de publicación: 25-03-2024 🕒 12 lectura min


Los microcontroladores se utilizaron inicialmente en dispositivos desarrollados por empresas manufactureras y grandes plantas industriales porque las herramientas de creación de prototipos y los compiladores para escribir software eran muy costosos. Además, el requisito de pedir una gran serie de microcontroladores OTP con una máscara ROM (una vez programable) era terriblemente costoso y solo daba sus frutos en la producción a gran escala. Luego, los microcontroladores se equiparon con memoria Flash, lo que redujo significativamente su precio y mejoró su funcionalidad, lo que hizo que también llegaran a manos de los entusiastas de la electrónica. Luego resultó que muchos dispositivos son más fáciles y económicos de construir con un microcontrolador que sin él.

  • Información básica sobre microcontroladores y lenguajes de programación.
  • IDE – entorno de programación
  • Assembler
  • Languaje C
  • Lenguaje C++
  • Python y MicroPython
  • Java
  • Otros lenguajes de programación

Microcontroladores, microprocesadores y lenguajes de programación

Al comienzo del desarrollo de la tecnología discutida, era difícil decir claramente qué es un microcontrolador y qué es un microprocesador. Hoy en día sabemos que, además del procesador (la llamada CPU), el microcontrolador contiene memoria de programa no volátil y una serie de sistemas periféricos que le permiten intercambiar datos con el medio ambiente. Sin embargo, al principio los microcontroladores sólo tenían puertos de E/S y una pequeña memoria RAM estática, y la memoria que contenía el código del programa y la mayoría de los sistemas periféricos estaban conectados como sistemas externos. Hoy sabemos que un microprocesador tiene una o varias CPU, mientras que un microcontrolador tiene un ecosistema completo, que está abierto a sistemas conectados externamente, pero que puede funcionar correctamente incluso sin ellos después de conectar la fuente de alimentación. Para simplificar, podemos decir que un microcontrolador es un pequeño microordenador en una sola carcasa que puede realizar tareas complejas en nuestro dispositivo.

Desde que aparecieron los microcontroladores en aplicaciones populares, ha habido una discusión sobre sus lenguajes de programación. Los partidarios y opositores de diversas soluciones discuten las diversas ventajas y desventajas de los lenguajes individuales, y el mercado los somete a una verificación rigurosa y, a pesar de estas discusiones, es difícil no darse cuenta de que algunos lenguajes de programación y soluciones técnicas que alguna vez fueron populares son ahora ausente. Un ejemplo perfecto es el lenguaje Pascal, que alguna vez fue promocionado como el mejor lenguaje para aprender a programar, pero hoy en día casi nadie lo conoce o recuerda.

En nuestra opinión, una discusión sobre lenguajes de programación no tiene mucho sentido: cada uno tiene sus ventajas y desventajas, y sólo depende de las habilidades del programador si puede aprovechar las ventajas y realizar la tarea a pesar de posibles imperfecciones. Los lenguajes de programación son como los lenguajes extranjeros. El conocimiento de cada nuevo abre una nueva perspectiva y nuevas posibilidades para el programador. Conocer muchos de ellos le permite seleccionar el idioma apropiado para una aplicación determinada, en lugar de adaptar su aplicación a las capacidades del idioma. Echemos un vistazo rápido a los lenguajes más populares utilizados para programar microcontroladores.

Entorno de programación

Los microcontroladores modernos tienen capacidades mucho mayores que muchos de los microprocesadores más antiguos y emblemáticos utilizados en las computadoras personales. Como resultado, las herramientas para crear software para microcontroladores también han mejorado significativamente a lo largo de los años. Hoy en día, no se trata sólo de compiladores de lenguajes, sino de entornos de programación integrados llamados IDE. Se puede decir que la popularidad de un determinado lenguaje de programación depende en gran medida del IDE mencionado y de las posibilidades que ofrece.

El IDE favorito según muchos programadores es Visual Studio Code. Hay versiones de este entorno disponibles para Windows y Linux, por lo que los partidarios del llamado El software de código abierto también puede utilizarlo. Visual Studio Code toma la forma de un editor al que se adjuntan herramientas como módulos. Dependiendo del tipo de microcontrolador, hay tantos que un usuario potencial no tiene tanto problema con la disponibilidad, sino con la elección del adecuado. Estos incluyen, por ejemplo, módulos que facilitan la orientación en el código del programa resaltando palabras clave y cambiando su color, módulos que permiten depurar (ejecutar el programa) usando un simulador y "en circuito" (en un microcontrolador soldado en la placa), código versiones y muchos, muchos otros. Y lo más importante: Visual Studio Code no está vinculado a ningún lenguaje de programación específico y entre los módulos puede encontrar numerosos compiladores de varios lenguajes para varias familias de microcontroladores y microprocesadores. Incluso puedes encontrar un compilador y un gestor de arranque para Arduino, que, ciertamente, son un poco más complicados de usar y, por tanto, están destinados a usuarios más avanzados, pero proporcionan mecanismos que muchos usuarios consideran superiores al IDE disponible con Arduino y mucho más similares a los que se pueden encontrar en el trabajo profesional.

Se puede decir que los entornos de programación modernos son muy similares. En la mayoría de los casos, no hay problema con la "transferencia", como ocurría hace varios años. Las funcionalidades y el funcionamiento de los IDE individuales son similares, independientemente del modelo del microcontrolador seleccionado, porque (aparte del número de bits de una palabra) difieren cada vez menos en términos de capacidades y recursos.

Finalmente, cabe mencionar que crear programas para microcontroladores es significativamente diferente a crear programas para PC. Esto se debe a que tienen recursos de RAM mucho menores y su núcleo tiene un rendimiento mucho menor. Los compiladores de lenguajes modernos disponibles para microcontroladores permiten transformaciones vertiginosas de variables directamente desde una PC, pero no se realizan con la misma rapidez. Por lo tanto, al crear una aplicación para un microcontrolador, siempre debe tener en cuenta que ciertas acciones se realizarán a una velocidad más lenta: las operaciones con números de punto flotante consumen muchos de los recursos escasos y se realizan mucho más lentamente que usando la FPU disponible en la mayoría Microprocesadores modernos.

Assembler

Las personas que programan microcontroladores profesionalmente deben conocer al menos los conceptos básicos del lenguaje de programación más simple, es decir, el lenguaje ensamblador. Hay una trampa en la palabra "más simple", porque es un lenguaje con una funcionalidad muy simplificada oculta bajo comandos individuales, pero con muchas instrucciones, y que también requiere dividir comandos más complejos en secuencias de operaciones simples. Al mismo tiempo, requiere que el programador tenga un buen conocimiento del hardware, ya que existen diferencias importantes según el tipo de microcontrolador, lo que puede dificultar su dominio. Sin embargo, un buen conocimiento del lenguaje ensamblador le permite comprender cómo funciona un microcontrolador y, por lo tanto, aprovechar al máximo sus capacidades. Assembler también será útil para personas que escriben en otros idiomas, para realizar módulos o inserciones en el código de idiomas de nivel superior si falta una función o el funcionamiento del programa necesita optimización.

¿Por qué vale la pena dominar el lenguaje Assembler?

Es un hecho que al escribir en un lenguaje de nivel superior no es necesario que conozcamos el lenguaje ensamblador, y de hecho puede suceder que nunca sea necesario alcanzarlo y realizar ninguna "inserción", pero sin saberlo. es difícil entender lo que está oculto, por ejemplo, multiplicando variables o direccionando y leyendo aquellas ubicadas en el espacio de direcciones externo del microcontrolador. También es difícil imaginar cuántas operaciones debe realizar un núcleo de 8 bits si utilizamos números de punto flotante de, por ejemplo, 64 bits de longitud en nuestro programa. También es difícil entender qué es un bit o byte y cuál es su significado en un registro o memoria de un microcontrolador.

Assembler es un lenguaje de programación muy simple. No es cierto decir que sólo los programadores de élite pueden escribir programas en él. Cualquiera que se tome el tiempo para comprender cómo funciona el núcleo de un microcontrolador puede aprender programación en lenguaje ensamblador. Quizás esta sea la razón principal (comprender cómo funcionan la CPU y los módulos periféricos) por la que el lenguaje ensamblador se considera difícil.

Assembler y redundancia de código

Assembler es un lenguaje elemental. Cualquier lenguaje de alto nivel, como C, se traduce a instrucciones de ensamblador en el momento de la compilación. Además, los comandos individuales de un lenguaje de alto nivel deben comunicarse entre sí mediante el intercambio de constantes y variables en forma de resultados de cálculo o tablas. Esto significa que el autor del compilador debe crear ciertos mecanismos de intercambio de datos, así como asignar parte de la memoria operativa a la pila del sistema y otros mecanismos. Por lo tanto, cada lenguaje de programación de alto nivel tiene cierta redundancia de código. Esta redundancia aumenta cuanto más fácil es utilizar el lenguaje de alto nivel.

Assembler en sí no agrega instrucciones redundantes. Sólo pueden ser añadidos por el autor del programa. Por lo tanto, el programador tiene la capacidad de influir en última instancia en el tiempo de ejecución de un proceso determinado y determinar su duración con mucha precisión. Esta es la razón principal para utilizar el lenguaje ensamblador cuando se manejan tareas que deben realizarse en tiempo real. A veces se escucha la opinión de que el lenguaje ensamblador permite controlar realmente el microcontrolador. De hecho, los tiempos de ejecución de funciones o subrutinas pueden ser los más cortos y el programador puede influir en la disposición final de las variables en la memoria. Assembler proporciona una opción práctica que se utilizará o no, porque depende en gran medida de las habilidades del programador.

Combinando lenguaje de nivel superior con lenguaje ensamblador

Assembler es una herramienta muy ingrata a la hora de implementar una interfaz de usuario, que en la mayoría de las aplicaciones ocupa al menos el 70% del código. Como muestra la práctica de la programación, al adquirir habilidades y programar en lenguaje ensamblador, después de un tiempo realizaremos una cierta cantidad de funciones listas para usar para operar pantallas, teclados y diversas formas de señalar el estado del dispositivo, pero cada vez es la interfaz de usuario. al que dedicaremos más tiempo. Por lo tanto, vale la pena combinar un lenguaje de nivel superior y un lenguaje ensamblador: el primero permite una implementación y cambios rápidos en la interfaz de usuario, el segundo permite el manejo de tareas en tiempo real. Contrariamente a lo que parece, combinar lenguajes de programación es fácil de aprender y los beneficios de combinarlos son obvios. Para el usuario, al ingresar la configuración, no importa si la lectura de la tecla de manejo de funciones requiere que la CPU tenga diez o cincuenta ciclos de máquina; de todos modos no lo notará, pero generalmente acortar el tiempo de ejecución de la aplicación es de gran importancia para el programador.

Sin embargo, en ocasiones, por diversos motivos, no es posible combinar un lenguaje de nivel superior con un lenguaje ensamblador. Una de esas razones puede ser el tamaño de la memoria del programa del microcontrolador. Cualquier lenguaje de nivel superior, dependiendo del nivel dado de optimización del código objeto, la calidad del compilador y la tarea que se realiza, produce un código de resultado binario que es en promedio dos veces más grande que un programa en lenguaje ensamblador funcionalmente comparable. Por supuesto, para aplicaciones típicas esto no importa mucho, porque los precios de los microcontroladores con diferentes tamaños de memoria de programa son muy similares. A veces, sin embargo, cambiar el tamaño de la memoria requiere reemplazar el microcontrolador o cambiar de proveedor, y esto puede resultar problemático.

Otras desventajas del Assembler

Assembler tiene otra característica no tan buena. Los programas escritos en lenguaje ensamblador son muy difíciles de transferir a otro modelo de microcontrolador, incluso con el mismo núcleo, y mucho menos cuando el núcleo no difiere en la longitud de las palabras, pero sí en términos de estructura o arquitectura de hardware (por ejemplo, programas escritos para 8051 en AVR y vice versa). Muy a menudo, esto requiere no sólo cambiar la estructura del programa, sino también un enfoque completamente diferente al problema o dividir una sola instrucción en una serie de pasos parciales. Otro obstáculo será el hecho de que el lenguaje ensamblador está muy ligado al hardware y, por lo tanto, cada núcleo tiene su propio lenguaje ensamblador. A menudo son muy similares, pero siguen siendo diferentes porque los modos y métodos de direccionamiento de datos por parte de la CPU, el número de bits disponibles en los registros de estado y los sistemas periféricos que cooperan con el núcleo son diferentes.

Para muchos aficionados, el tiempo de implementación de la aplicación no es importante. Si haces algo con pasión, por ti mismo, entonces el cálculo económico es menos importante. Lo que cuenta es el desafío y la solución del problema, no el tiempo invertido en el dispositivo. Sin embargo, para los profesionales, donde el tiempo desde la idea hasta la implementación es importante, el lenguaje ensamblador a menudo puede ser la peor opción porque el tiempo necesario para ejecutar el programa y encontrar errores puede ser muy largo. Y cuanto más se necesita, más compleja es la tarea que se realiza.

Lenguaje C

Hace apenas una docena de años, el lenguaje C estaba batiendo récords de popularidad entre los programadores de microcontroladores. Sin embargo, el desarrollo de la tecnología y la disponibilidad de recursos de hardware cada vez más grandes y baratos hicieron que perdiera su primacía, convirtiéndose en el progenitor de otras soluciones, de las que hablaremos más adelante.

Como lenguaje de alto nivel, C no tiene dos de las deficiencias más graves del lenguaje ensamblador. En primer lugar, los programas escritos en C pueden, hasta cierto punto y bajo ciertas condiciones, transferirse entre microcontroladores, incluso aquellos con arquitectura diferente. En segundo lugar, programar en C no requiere que el programador tenga muy buenos conocimientos de la arquitectura del microcontrolador y, por tanto, es mucho más fácil de analizar y encontrar errores. Los compiladores del lenguaje C están disponibles en muchas plataformas, por ejemplo aquellas que ejecutan Windows o Linux, y por lo tanto el lenguaje en sí es conocido por un grupo mucho más amplio de programadores que el lenguaje ensamblador, lo que requiere un conocimiento profundo del hardware: aprender un nuevo dialecto del idioma sólo requiere cambiar hábitos relacionados con la gestión de recursos escasos.

Un programa escrito en C es más legible que su homólogo en lenguaje ensamblador. Esto se debe a que, por ejemplo, sumar dos números de 32 bits se puede incluir en 1 línea de código (incluida la declaración de variables), mientras que la misma operación en lenguaje ensamblador, si estamos ante un núcleo de 8 bits, requiere varias líneas de código e incluyendo bits de acarreo. Al escribir en C, el programador también tiene en sus manos una gran herramienta: los punteros. No están disponibles en lenguaje ensamblador, pero facilitan mucho el trabajo de un programador experto.

La sintaxis del lenguaje C es mucho más fácil de entender y analizar en comparación con el lenguaje ensamblador. La mayor parte de esta sintaxis no depende del tipo de microcontrolador y, lo más importante, muchos lenguajes de programación conocidos se basan en C, por lo que aprender C puede ser una introducción para dominar y comprender otros compiladores. Definitivamente vale la pena conocer el lenguaje C, ¿o quizás C++?

Lenguaje C++

El compilador de C++ es una extensión del compilador de C. Ambos lenguajes tienen una sintaxis muy similar, pero C++ tiene extensiones resultantes de funcionalidades adicionales de este lenguaje de programación. La diferencia más importante entre C y C++ es que el primero es un lenguaje de procedimientos y el segundo es un lenguaje orientado a objetos. Y cabe señalar que esto no es sólo una cuestión de palabras utilizadas para describir a los compiladores, sino que esta distinción es una de las divisiones más importantes en los métodos de programación. Los enfoques mencionados difieren en la "filosofía" de programación y requieren diferentes métodos para organizar el código fuente, las estructuras de datos y acceder a ellos. El compilador de C++ le permite crear código de procedimiento, es decir, el mismo código que en C, mientras que el compilador de C no le permite utilizar métodos orientados a objetos.

A estas alturas, basta saber que C++ ha ampliado las capacidades del lenguaje C y tiene mecanismos que no están disponibles en C. También vale la pena saber que gracias a la programación orientada a objetos, es mucho más fácil dividir el trabajo dentro de un equipo de programadores, por lo que C++ será una opción obvia para proyectos de varios niveles que requieren código extenso.

El propósito de este texto no es enseñar programación, sino sólo presentar un cierto espectro de métodos y soluciones disponibles y, por lo tanto, no discutiremos las diferencias en detalle. Sin embargo, si pudiéramos dar algunos consejos a las personas que están dando sus primeros pasos en la programación de microcontroladores, definitivamente vale la pena aprender C++, porque es un lenguaje muy popular, disponible para varias plataformas y sistemas operativos, por lo que al aprenderlo no es necesario preocuparse por apegarse a un idioma específico, fabricante y equipo.

Python y MicroPython

Python ha ido ganando cada vez más popularidad en los últimos años. Inicialmente, estaba disponible como uno de los lenguajes de programación para computadoras personales y luego pasó a aplicaciones populares. Una de las variantes de Python destinada a microcontroladores es MicroPython, que opera con un uso mínimo de recursos de hardware, en un entorno de microcontrolador con poco equipamiento.

Python es un lenguaje interpretado, como solía ser Basic. Esto significa que las instrucciones se descargan y procesan en tiempo real y el código fuente no se compila antes de ejecutarse. Las variantes de Python para microcontroladores están optimizadas para operaciones con bajos recursos, aunque algunos de los chips llamados microcontroladores tienen mucho más a su disposición que las primeras PC, como la IBM XT.

Python es una herramienta muy versátil. Se utiliza para una variedad de aplicaciones: control de modelos, robots, Internet de las cosas o dispositivos de construcción inteligentes, dispositivos que se conectan a través de una red de telefonía móvil o Internet. El MicroPython mencionado anteriormente también se puede utilizar para programar microcomputadoras basadas en ESP8266, ESP32, los extremadamente populares Arduino y Raspberry Pi, Raspberry Pi Pico y otros. Debido a que es un intérprete y no un compilador, una de sus características es la capacidad de interactuar con un microcontrolador. Esta función estaba disponible en modelos más antiguos de computadoras personales programadas con Basic. Todo lo que tenías que hacer era escribir un comando desde el teclado y se ejecutaba inmediatamente. La misma posibilidad de interacción la proporciona el intérprete MicroPython, que facilita las pruebas de la aplicación y su entorno. MicroPython también tiene un poderoso soporte en forma de muchas bibliotecas y extensiones listas para usar que facilitan diversas tareas, desde el manejo de sensores hasta la comunicación con dispositivos periféricos.

MicroPython incluye muchos módulos estándar, pero no tantos como en la implementación estándar de Python. La versión completa de este lenguaje tiene un enorme ecosistema de bibliotecas y módulos, lo que permite a los desarrolladores aprovechar ricas funciones y herramientas. Además, algunas funciones dinámicas avanzadas pueden estar limitadas o no estar disponibles en MicroPython.

Java

Al igual que Python, Java fue una adaptación de computadoras personales y aplicaciones web tradicionales. En el mundo de este tipo de computadoras, puede encontrar tanto intérpretes como compiladores de Java. Para las necesidades de los microcontroladores se desarrolló el lenguaje Java ME (Java Micro Edition), que es una variante de Java adaptada para trabajar con recursos limitados, en comparación con una computadora personal o un servidor.

Java ME es un subconjunto de Java SE diseñado específicamente para dispositivos móviles e integrados con recursos limitados, como teléfonos móviles y dispositivos móviles. Java ME incluye algunas funciones de Java SE al tiempo que proporciona nuevas API específicas para dispositivos integrados, como conectividad Bluetooth, servicios de ubicación, API de sensores y más. Sin embargo, debido a las limitaciones de recursos de estos dispositivos, Java ME tiene algunas limitaciones en comparación con Java SE. Por ejemplo, Java ME tiene un conjunto más pequeño de API que Java SE y no admite la especificación completa del lenguaje Java.

Java es un lenguaje universal que se puede utilizar para una variedad de aplicaciones, incluida la programación de microcontroladores y ordenadores de placa única (SBC). Java es popular en aplicaciones informáticas integradas debido a su facilidad de migración entre plataformas, confiabilidad, flexibilidad funcional y facilidad de modificación de código. El ecosistema Java proporciona muchas herramientas, bibliotecas y marcos que ayudan a los desarrolladores a crear aplicaciones integradas eficientes y confiables. Naturalmente, Java ME está armado de forma un poco más modesta. Sin embargo, proporciona un entorno de ejecución ligero y eficiente, optimizado para dispositivos pequeños con recursos limitados.

Para los que buscan otros lenguajes de programación

Las personas que programan microcontroladores saben bien que además de los lenguajes de programación mencionados anteriormente, existen muchos otros disponibles. Lamentablemente, el progreso técnico y el desarrollo de aplicaciones que requieren conexión mediante diversas interfaces han provocado la casi completa extinción de los lenguajes basados ​​en Basic. Es muy fácil de aprender, algunas de sus variantes tienen muchas funciones excelentes listas para usar, pero actualmente las aplicaciones de Basic no parecen extenderse más allá de los pasatiempos o la educación primaria. Python, C, C++ y Java están claramente a la cabeza entre los programadores y no parece que esta situación vaya a cambiar en un futuro próximo. Los métodos de programación basados ​​en diagramas de flujo alguna vez parecieron ser el futuro. Al igual que Basic, se utilizan en las escuelas para enseñar programación, pero no para crear aplicaciones profesionales.

Para entender por qué sucede esto, es necesario separar dos mundos. El primero es el mundo de las aplicaciones profesionales. Su creación requiere el trabajo de un equipo de personas, e incluso si pensamos que hemos escrito el programa nosotros mismos, "debajo" hay una gran cantidad de bibliotecas de funciones sustentadas en la estructura modular u orientada a objetos de nuestro programa. Hoy en día, cuando el tiempo de comercialización cuenta, nadie crea por su cuenta, por ejemplo, bibliotecas para memoria FLASH, si el fabricante del equipo las creó y las puso a disposición. Por tanto, un programador profesional está abocado al trabajo en equipo, aunque no conozca a los miembros de su equipo. También necesita programación orientada a objetos, porque le dará la oportunidad de reemplazar métodos que le resultan inconvenientes en una biblioteca determinada, agregar variables o clases, etc. El segundo mundo son las aplicaciones creadas para satisfacción, placer, diversión. Aquí nadie tiene prisa por el tiempo, a menudo se crean sólo para lograr un resultado determinado. Un aficionado puede permitirse el lujo de crear bibliotecas por su cuenta y nadie contará las horas y el dinero. Por supuesto, nadie prohíbe a un aficionado trabajar en equipo o utilizar soluciones ya preparadas, pero esto no es una prioridad. Es por eso que un aficionado puede utilizar herramientas menos populares, crear programas en Basic, Pascal y otros lenguajes de programación especializados.

La próxima revolución en la programación de microcontroladores probablemente vendrá causada por tecnologías relacionadas con la inteligencia artificial. Quizás el papel del programador, similar al papel del diseñador gráfico cuando utiliza algoritmos de generación de imágenes, se convierta en una descripción precisa de la funcionalidad del programa, y ​​un algoritmo de IA apropiado generará el código y lo compilará. Por ahora, esto sigue siendo una cosa del futuro y un tema para un artículo aparte, pero los aficionados ya están utilizando con éxito la inteligencia artificial para crear códigos simples.

Transfer Multisort Elektronik (TME) es uno de los mayores distribuidores mundiales de componentes electrónicos, partes electrotécnicas, equipos de taller y automatización industrial. El catálogo incluye más de 1.500.000 de productos de 1.300 fabricantes líderes. Los modernos centros logísticos de TME en Łódź y Rzgów (Polonia), con una superficie total de más de 40.000 m², envían casi 6.000 paquetes diarios a clientes en más de 150 países.

TME también invierte en el desarrollo de los conocimientos y habilidades de jóvenes ingenieros y entusiastas de la electrónica a través del proyecto TME Education, y apoya a la comunidad tecnológica organizando la serie de eventos TechMasterEvent, que promueve la innovación y el intercambio de experiencias.

LEA TAMBIÉN