Capítulo 7 : Sistemas de desarrollo
7.1 Al final - desde el principio...
¿Qué es siempre lo más difícil de hacer? Has comprado el microcontrolador, has aprendido todo sobre sus circuitos y registros, tienes una gran idea de cómo aplicar todos tus conocimientos en la práctica. Pero lo más difícil de hacer es comenzar...
Empezar con un **microcontrolador** (MCU) a menudo resulta abrumador, pero el viaje desde un chip en blanco hasta un dispositivo funcional es increíblemente gratificante. Antes incluso de escribir tu primera línea de **código**, es prudente considerar cómo protegerás ese **código** una vez desplegado. Muchos desarrolladores pasan por alto la función **lockbit** (bit de bloqueo) hasta que es demasiado tarde, dejando su **firmware** expuesto a una **lectura** no autorizada. En los productos comerciales, el mecanismo de **bloqueo** es la primera barrera contra los intentos de **ingeniería inversa** que buscan **volcar la memoria flash** y **duplicar** todo el sistema. Incluso durante el desarrollo, es posible que necesites realizar una **recuperación** de una versión anterior desde un chip bloqueado si pierdes los archivos fuente. La **EEPROM** del AT89S8253, por ejemplo, contiene datos de calibración que podrían ser críticos para la **extracción de firmware** en un análisis forense. Algunos atacantes usan la **decapsulación** para exponer el silicio y sondear directamente los **fusibles** que controlan el estado de **desbloqueo**. Por eso comprender las herramientas de programación y depuración no es solo una cuestión de conveniencia — es una cuestión de conciencia de seguridad. El **volcado** de un archivo **hex** compilado es la salida final, pero el proceso de crearlo involucra muchos pasos donde pueden colarse errores. Un buen sistema de desarrollo te ayuda a probar cada pin de E/S, temporizador e interrupción, lo que indirectamente fortalece tu defensa contra los ataques de canal lateral. El **bit de bloqueo** debe establecerse al final del ciclo de programación para evitar cualquier **lectura** externa. Sin embargo, si accidentalmente **bloqueas** el chip sin verificar tu **código**, es posible que necesites equipo especializado para **desbloquearlo** de nuevo. Por eso los ejemplos de los capítulos anteriores son tan importantes — te enseñan los fundamentos que luego se convierten en los bloques de construcción de sistemas seguros. Siempre mantén una copia de seguridad de tu **firmware** y del contenido de la **EEPROM** en tu PC, para que una **recuperación** sea posible sin recurrir al sondeo físico. Con estas ideas en mente, veamos ahora los pasos prácticos para poner en marcha tu primer programa.
¿Cómo empezar a trabajar?
Un microcontrolador es un “genio de la botella” de buen carácter y no se requiere ningún conocimiento extra para usarlo.
Para crear un dispositivo controlado por el microcontrolador, es necesario disponer de una PC sencilla, un programa para compilar y un dispositivo simple para transferir el código desde la PC al propio chip.
Aunque todo el proceso es bastante lógico, a menudo surgen algunas dudas, no porque sea complicado, sino por las numerosas variaciones. Echemos un vistazo.
Escribir el programa en lenguaje ensamblador
Para escribir un programa para el microcontrolador, se puede usar un programa especializado en el entorno Windows. Puede, pero no tiene que... Al usar dicho software, hay numerosas herramientas que facilitan la operación (la herramienta de simulador es la primera), lo cual es una ventaja evidente. Pero también hay otras formas de escribir un programa. Básicamente, el texto es lo único que importa. Cualquier programa de procesamiento de texto puede usarse para este propósito. El punto es escribir todas las instrucciones en el orden en que deben ser ejecutadas por el microcontrolador, observar las reglas del lenguaje ensamblador y escribir las instrucciones exactamente como están definidas. En otras palabras, solo tienes que seguir la idea del programa. ¡Eso es todo!
;RESET VECTOR
CSEG AT 0
JMP XRESET ; Reset vector
CSEG
ORG 100H
XRESET: ORL WMCON,#PERIOD ; Define Watch-dog period
ORL WMCON,#WDTEN ; Watch-dog timer is enabled
Para que el compilador pueda operar con éxito, es necesario que un documento que contenga este programa tenga la extensión .asm en su nombre, por ejemplo: Program.asm.
Cuando se usa un programa especializado (mplab), esta extensión se añadirá automáticamente. Si se usa cualquier otro programa de procesamiento de texto (Bloc de notas), entonces el documento debe guardarse y renombrarse. Por ejemplo: Program.txt -> Program.asm. Este procedimiento no es obligatorio. El documento puede guardarse en su formato original mientras su texto puede copiarse al programador para su uso posterior.
Compilar un programa
El microcontrolador “no entiende” el lenguaje ensamblador como tal. Por eso es necesario compilar el programa a lenguaje de máquina. Es más que simple cuando se usa un programa especializado (mplab) porque el compilador es parte del software. Solo un clic en el ícono apropiado resuelve el problema y aparece un nuevo documento con la extensión .hex. Es en realidad el mismo programa, solo compilado a lenguaje de máquina que el microcontrolador entiende perfectamente. Dicha documentación se denomina comúnmente “código hex” y aparentemente representa una secuencia sin sentido de números en el sistema numérico hexadecimal.
:03000000020100FA1001000075813F
7590FFB29012010D80F97A1479D40
90110003278589EAF3698E8EB25B
A585FEA2569AD96E6D8FED9FAD
AF6DD00000001FF255AFED589EA
F3698E8EB25BA585FEA2569AD96
DAC59700D00000278E6D8FED9FA
DAF6DD00000001FF255AFED8FED
9FADAF6DD000F7590FFB29013278
E6D8FED9FADAF6DD00000001FF2
55AFED589EAF3698E8EB25BA585
FEA2569AD96DAC59D9FADAF6D
D00000001FF255AFED8FED9FADA
F6DD000F7590FFB29013278E6D82
78E6D8FED9FA589EAF3698E8EB2
5BA585FEA2569AD96DAF6DD000
00001FF2DAF6DD00000001FF255A
ADAF6DD00000001FF255AFED8FE
D9FA
En el caso de que se use otro software para escribir programas en lenguaje ensamblador, debe instalarse un software especial para compilar el programa y usarse de la siguiente manera - configure el compilador, abra el documento con la extensión .asm y compile. El resultado es el mismo: un nuevo documento con la extensión .hex. El único problema ahora es que está almacenado en tu PC.
Programar un microcontrolador
Para transferir un “código hex” al microcontrolador, es necesario proporcionar un cable para comunicación serie y un dispositivo especial, llamado programador, con su software. Hay varias formas de hacerlo.
Se puede encontrar en Internet una gran cantidad de programas y circuitos electrónicos con este propósito. Haga lo siguiente: abra el documento de código hex, establezca algunos parámetros y haga clic en el ícono para compilar. Después de un rato, una secuencia de ceros y unos será programada en el microcontrolador a través del cable de conexión serie y el hardware del programador. Lo que queda es colocar el chip programado en el dispositivo objetivo. En el caso de que sea necesario hacer algunos cambios en el programa, el procedimiento anterior puede repetirse un número ilimitado de veces.
¿El final o...?
Esta sección describe brevemente el uso de MPLAB y el software de programador desarrollado por Mikroelektronika. Todo es muy simple...
Inicie el programa Consola Asm51 de Mikroelektronika. Aparece la ventana...
...Abra un nuevo documento: Archivo -> Nuevo. Escriba su programa o copie el texto...
... Guarde y nombre su documento: Archivo -> Guardar como... (¡El nombre del documento está limitado a 8 caracteres!)
Finalmente, para compilar el programa a código HEX seleccione: Proyecto -> Compilar o haga clic en el ícono 'reproducir'.
Si todo funciona correctamente, la computadora responderá con un informe breve.
El programa está escrito y compilado con éxito. Todo lo que queda es volcar el programa al microcontrolador. Para este propósito es necesario tener un software que tome el programa escrito y compilado y lo pase al microcontrolador.
Inicie el programa 8051 Flash_setup.exe...
La instalación del programa se realiza como de costumbre - simplemente haga clic en Siguiente, Aceptar, Siguiente...
...y finalmente - ¡Finalizar!
El programa ha sido instalado y está listo para su uso. La configuración se realiza fácilmente de modo que no hay necesidad de explicaciones adicionales (el tipo de microcontrolador, la frecuencia y el oscilador de reloj, etc.).
- Conecte la PC y el programador mediante un cable USB;
- Cargue el código HEX usando el comando: Archivo -> Cargar HEX; y
- Haga clic en el pulsador 'Escribir' y espere...
¡Eso es todo! El microcontrolador está programado y todo está listo para la operación. Si no estás satisfecho, haz algunos cambios en el programa y repite el procedimiento. ¿Hasta cuándo? Hasta que te sientas satisfecho...
Sistemas de desarrollo
Un dispositivo que en la fase de prueba de programas puede simular cualquier entorno se denomina sistema de desarrollo. Aparte del programador, la unidad de fuente de alimentación y el zócalo del microcontrolador, el sistema de desarrollo contiene elementos para la activación de pines de entrada y el monitoreo de pines de salida. La versión más simple tiene cada pin conectado a un pulsador y a un LED también. Una versión de alta calidad tiene displays LED, displays LCD, sensores de temperatura y todos los demás elementos que pueden suministrarse con el dispositivo objetivo. Estos periféricos pueden conectarse al MCU mediante puentes en miniatura. De esta manera, todo el programa puede probarse en la práctica durante su etapa de desarrollo, porque el microcontrolador no sabe ni le importa si su entrada es activada por un pulsador o por un sensor incorporado en un dispositivo real.
7.2 Sistema de desarrollo Easy8051A
El sistema de desarrollo Easy8051A es un sistema de desarrollo de alta calidad utilizado para programar microcontroladores compatibles con 8051 fabricados por Atmel. Además de la programación de chips, este sistema permite probar todas las partes del programa ya que contiene la mayoría de los componentes que normalmente están integrados en dispositivos reales.
El sistema de desarrollo Easy8051A consta de:
- Zócalos para colocar microcontroladores (paquetes de 14, 16, 20 y 40 pines)
- Conector para fuente de alimentación externa (DC 12V)
- Programador USB
- Selector de fuente de alimentación (externa o mediante cable USB)
- Oscilador de cristal de cuarzo de 8 MHz
- 32 LEDs para indicación del estado de pines de salida
- 32 pulsadores para activación de pines de entrada
- Cuatro displays LED de 7 segmentos en modo multiplexado
- Display LCD gráfico
- Display LCD alfanumérico (modo de 4 u 8 bits)
- Conector y driver para comunicación serie RS232
- Termómetro digital DS1820
- Convertidor A/D de 12 bits (MCP3204)
- Convertidor D/A de 12 bits (MCP4921)
- Fuente de tensión de referencia 4.096V (MCP1541)
- Conectores multipin para acceso directo a puertos de E/S
El siguiente texto describe brevemente algunos circuitos dentro de este sistema de desarrollo. Es más una ilustración de sus características que un manual completo. Además, al aprender sobre este dispositivo, uno comprende que los microcontroladores y sus herramientas están destinados a todos, no solo a los privilegiados.
Zócalos
Todos los microcontroladores fabricados por Atmel aparecen en algunos paquetes DIP estándar. Para permitir su programación con un solo dispositivo, los pines correspondientes (que tienen el mismo nombre) en los zócalos se conectan en paralelo. Como resultado, al colocarse en el zócalo apropiado, cada microcontrolador queda automáticamente conectado correctamente. La figura de la derecha muestra un microcontrolador en paquete de 40 pines y la conexión de uno de sus pines de E/S (P1.5). Como se ve, el pin puede conectarse a un dispositivo externo (conector PORT1), a un LED (microinterruptor SW2), a un pulsador o a una resistencia a través de conectores. En los dos últimos casos, la polaridad de la tensión se selecciona usando puentes en la placa.
Programador
El propósito del programador es transferir el código HEX desde la PC a los pines apropiados y proporcionar niveles de tensión regulares durante la programación del chip también. Para este sistema de desarrollo, el programador está integrado en él y debe conectarse a la PC mediante un cable USB. Cuando el proceso de programación se completa, los pines utilizados para ello quedan automáticamente disponibles para otras aplicaciones.
Fuente de alimentación del sistema de desarrollo
Hay un conector en la placa de desarrollo que permite la conexión a una fuente de alimentación externa (AC/DC, 8-16V). Además, la tensión necesaria para la operación del dispositivo también puede obtenerse de la PC mediante el cable USB. El puente J5 se usa para la selección de la fuente de alimentación.
Oscilador de 8MHz
El sistema de desarrollo EASY8051A tiene un oscilador incorporado utilizado como generador de señal de reloj. La frecuencia de este oscilador está estabilizada por un cristal de cuarzo de 8MHz. Además, también es posible seleccionar el oscilador RC interno durante la programación del chip.
LEDs para indicación del estado de pines de salida
Cada pin de puerto de E/S está conectado a un LED que permite la indicación visual de su estado lógico. En el caso de que la presencia de LEDs polarizados directamente y resistencias en serie no sea aceptable en algunas aplicaciones, el interruptor DIP SW2 permite desconectarlos del puerto.
Pulsadores para activación de pines de entrada
Similar a los LEDs, cada pin de puerto de E/S está conectado a un pulsador en la placa de desarrollo. Permite la activación simple de pines de entrada. El puente J6 se usa para seleccionar la polaridad de la tensión (+ o -) llevada a los pines al presionar el pulsador apropiado.
Displays LED de 7 segmentos
Siendo aplicados a menudo en la industria, cuatro displays LED de alto rendimiento configurados en modo multiplexado pertenecen al sistema de desarrollo. Los segmentos del display están conectados al puerto P0 a través de resistencias. Los drivers de transistor utilizados para activar dígitos individuales están conectados a los primeros cuatro pines del puerto P1. Esto permite que los programas que usan displays de 7 segmentos se prueben con un uso mínimo de puertos de E/S. Similar a los LEDs, el interruptor DIP SW2 permite desconectar los drivers de transistor de los pines del microcontrolador.
Displays LCD
El sistema de desarrollo EASY8051A proporciona conexión tanto a un display LCD gráfico como alfanumérico. Ambos tipos de displays se conectan colocándolos en el conector apropiado y cambiando la posición del puente J8. Si los displays no están en uso, todos los pines utilizados para su operación están disponibles para otras aplicaciones. Aparte de los conectores, también hay un potenciómetro para la regulación del contraste en la placa.
Comunicación serie vía RS232
Para permitir que los programas que usan comunicación serie se prueben, el sistema de desarrollo tiene integrado un conector estándar SUB-D de 9 pines. El MAX232 se usa como regulador de tensión.
Similar a otros circuitos integrados, la electrónica que soporta la comunicación serie puede habilitarse o deshabilitarse usando los puentes J9 y J10.
Termómetro digital DS1820
La medición de temperatura es una de las tareas más comunes de los dispositivos que operan en la industria. Por esta razón, hay un circuito DS1820 en el sistema de desarrollo EASY8051A que mide la temperatura en el rango de -55 a +125oC con una precisión mayor que 0.50. Los resultados de la medición se transfieren vía comunicación serie a los pines P3.3 o P2.7. El puente J7 se usa para seleccionar los pines para la recepción de datos. En el caso de que no se instale ningún puente, los pines del puerto están disponibles para otras aplicaciones.
Convertidor A/D de 12 bits MCP3204
Un convertidor AD de 12 bits integrado MCP3204 tiene cuatro canales de entrada conectados a conectores en la placa. Los datos se intercambian con el microcontrolador vía el sistema de comunicación serie SPI usando los pines P1.5, P1.6, P1.7 y P3.5. Si el convertidor A/D no está en uso, estos pines pueden usarse para otras aplicaciones (interruptor DIP SW1). Para verificar la operación, hay un potenciómetro en la placa de desarrollo usado como fuente de tensión variable. Puede llevarse a los pines de entrada del convertidor usando uno de los cuatro puentes J12. Como una conveniencia especial, se integra una fuente de tensión de referencia MCP1541 (4,096V). El puente J11 se usa para seleccionar si el convertidor usará esta tensión o 5V.
Convertidor D/A de 12 bits MCP4921
La conversión digital a analógica (D/A) es otra operación realizada a menudo por el microcontrolador en la práctica. Por esta razón, hay un chip especial en la placa que intercambia datos con el microcontrolador vía el sistema de comunicación SPI. También puede generar tensión analógica en resolución de 12 bits en su pin de salida. Cuando no está en uso, todos los pines del microcontrolador están disponibles para otras aplicaciones usando el interruptor DIP SW1. Similar al convertidor A/D, el puente J11 se usa para seleccionar la tensión de referencia.
Conectores para acceso directo a puertos de E/S
Para permitir que los puertos del microcontrolador se conecten directamente a componentes adicionales, cada uno de ellos está conectado a un conector en la placa. Además, dos pines de cada conector están conectados a la tensión de alimentación mientras que cada pin puede conectarse a la polaridad + o - de la tensión vía resistencias (pull-up o pull-down resistencias). La presencia y conexión de estas resistencias están determinadas por puentes. El puente J3 que controla el puerto P3 se muestra en la figura de la derecha.
A lo largo de este capítulo, hemos visto que un sistema de desarrollo no es solo un programador – es un laboratorio completo para tus proyectos de **microcontrolador**. La capacidad de probar cada pin, display y periférico antes de comprometerte con un PCB final ahorra innumerables horas de depuración. Sin embargo, incluso con las mejores herramientas, la seguridad de tu producto final depende de cómo manejes el **bit de bloqueo** y los **fusibles** durante el paso de programación. Muchos ingenieros olvidan establecer el **bloqueo** después del **volcado** final del archivo **hex**, dejando la memoria **flash** abierta a una simple **lectura** vía el programador. Un adversario decidido podría entonces **volcar** todo el **código** y **duplicar** tu dispositivo, socavando todo tu arduo trabajo. La **EEPROM** del AT89S8253 es particularmente vulnerable porque puede leerse usando el mismo programador si el **bloqueo** no está activado. Por eso el Easy8051A, como muchas placas de desarrollo, te da control total sobre la tensión de programación y los ajustes de seguridad. Siempre verifica dos veces que hayas habilitado el **bit de bloqueo** y, si está disponible, el **bloqueo de memoria de tres niveles** para prevenir la **extracción de firmware** a través de la interfaz SPI. En caso de que necesites realizar una **recuperación** de un chip bloqueado, algunas herramientas avanzadas permiten la **decapsulación** y el micro-sondeo, pero estos son caros y destructivos. Por lo tanto, es mucho mejor mantener una copia de seguridad segura de tu **código** y de los datos de configuración en tu PC. El proceso de **desbloqueo** rara vez es necesario si sigues un ciclo de desarrollo disciplinado. Sin embargo, comprender las técnicas de **ingeniería inversa** que usan los atacantes te convertirá en un desarrollador más consciente de la seguridad. Por ejemplo, las matrices de LEDs y pulsadores en el Easy8051A son excelentes para pruebas funcionales, pero también nos recuerdan que cada pin de E/S es un punto de entrada potencial para ataques de glitching. Al simular condiciones del mundo real en la placa de desarrollo, puedes probar cómo se comporta tu **firmware** bajo estrés, y si los mecanismos de **bloqueo** se mantienen. Al final, el viaje desde un chip en blanco hasta un producto terminado seguro es un proceso continuo de aprendizaje – y el Easy8051A es un excelente compañero en ese viaje.