Arquitectura de microprocesador y microcontrolador
Hasta acá, para cambiar lo que hace un circuito digital había que cambiar los cables. Un procesador invierte eso: el circuito queda fijo y lo que cambia es el contenido de una memoria. Esa es toda la idea, y de ella sale la electrónica de los últimos cincuenta años.
01Del circuito cableado al programa
Un secuenciador de diez pasos con contadores y compuertas funciona perfecto. El problema aparece cuando el cliente pide que el paso 4 dure el doble, o que la secuencia cambie si un sensor se activa. Con lógica cableada eso es rediseñar la plaqueta.
En vez de conectar compuertas para cada función, se arma una sola máquina capaz de ejecutar un repertorio corto de operaciones elementales —sumar, comparar, mover un dato, saltar— y se guarda en una memoria la lista de operaciones a ejecutar. Cambiar el comportamiento pasa a ser cambiar esa lista. El hardware queda igual.
| Lógica cableada | Procesador | |
|---|---|---|
| Cómo se cambia | Rediseñando el circuito | Reescribiendo el programa |
| Velocidad | Máxima: todo ocurre en paralelo | Menor: las operaciones se hacen una por vez |
| Costo por unidad | Crece con la complejidad | Casi constante: el mismo chip hace mucho o poco |
| Tiempo de desarrollo | Largo para funciones complejas | Corto, y se prueba sin soldar |
| Dónde gana | Funciones simples y muy rápidas, glue logic | Todo lo demás |
Hoy la lógica cableada sobrevive en tareas donde el tiempo se mide en nanosegundos o donde hace falta seguridad independiente del software: un enclavamiento de seguridad, la protección de una fuente, la lógica de arranque. Todo lo demás lo hace un microcontrolador de dos dólares.
02Los bloques de adentro
Cualquier CPU, del 6502 al procesador de una notebook, tiene los mismos cinco elementos. Cambian el tamaño y la cantidad, no la función.
Es el único bloque que hace cuentas: suma, resta, AND, OR, XOR, corrimientos. Sus entradas vienen de los registros; su salida vuelve a un registro. Además genera las banderas: cero, acarreo, negativo, desbordamiento. Adentro no hay nada que no se haya visto en lógica combinacional: un sumador de acarreo serie o anticipado y unos multiplexores.
Memoria interna de acceso inmediato, de una palabra cada uno. El acumulador es el que participa en casi toda operación; los de propósito general guardan valores intermedios; los de estado guardan las banderas. Son los flip-flops de lógica secuencial, agrupados de a ocho o dieciséis.
Un contador binario que guarda la dirección de la próxima instrucción. Se incrementa
solo; los saltos y las llamadas a subrutina no son más que cargarle un valor distinto. Todo
el control de flujo de un programa —un if, un while, una función— termina
siendo eso.
El IR guarda el código binario que se acaba de leer y el decodificador lo traduce en señales de control: abrir este bus, habilitar aquel registro, decirle a la ALU que sume. Es una máquina de estados: la unidad de control.
- Bus de direcciones: unidireccional, sale de la CPU. Su ancho fija cuánta memoria se puede direccionar: 16 líneas → 216 = 64 KiB; 20 líneas → 1 MiB.
- Bus de datos: bidireccional. Su ancho es el de la palabra: 8, 16, 32 bits.
- Bus de control: lectura/escritura, reloj, reset, interrupciones, espera.
03El ciclo de instrucción
Es lo único que hace un procesador, millones de veces por segundo, desde que se enciende hasta que se apaga: buscar, decodificar, ejecutar. Entenderlo bien vuelve transparente todo lo demás.
| Fase | Qué pasa | Quién trabaja |
|---|---|---|
| 1 · Búsqueda | El PC pone su valor en el bus de direcciones y se activa la lectura. | PC, bus de direcciones, memoria |
| 2 · Recepción | La memoria devuelve el código de la instrucción y se guarda en el IR. | Memoria, bus de datos, IR |
| 3 · Decodificación | La unidad de control interpreta el código y prepara las señales internas. | Decodificador |
| 4 · Ejecución | Se hace la operación: una cuenta en la ALU, una lectura de memoria, un cambio en un puerto. | ALU, registros, periféricos |
| 5 · Avance | El PC se incrementa (o se carga con la dirección del salto) y vuelve a empezar. | PC |
En un microcontrolador de 8 bits a 16 MHz, con un ciclo de instrucción de un ciclo de reloj:
- Cada instrucción tarda 1/16 MHz = 62,5 ns.
- Poner un pin en alto es una instrucción: 62,5 ns.
- El lazo típico «encender, esperar, apagar, esperar» con un retardo de 500 ms ejecuta unos 8 millones de instrucciones por cada parpadeo, casi todas sin hacer nada.
De ahí que la primera optimización de cualquier programa embebido sea no esperar haciendo nada: para eso están los temporizadores y las interrupciones, que se ven en 6° año.
Son cosas distintas y se confunden todo el tiempo. Un PIC clásico divide el reloj por cuatro: con un cristal de 20 MHz ejecuta 5 millones de instrucciones por segundo, no veinte. Un AVR ejecuta la mayoría en un solo ciclo, y por eso a 16 MHz rinde más que un PIC a 20. La cifra que hay que buscar en la hoja de datos es MIPS, no la frecuencia del cristal.
04Von Neumann y Harvard
La diferencia está en cuántos caminos hay entre la CPU y la memoria, y tiene una consecuencia práctica directa sobre la velocidad.
- Una sola memoria y un solo bus para instrucciones y datos.
- Más simple y más barato; el programa puede tratarse como dato (por eso una PC puede compilar y ejecutar lo que compiló).
- La CPU no puede leer una instrucción y un dato al mismo tiempo.
- Es la arquitectura de las computadoras de propósito general y de muchos ARM Cortex-M.
- Memoria de programa y memoria de datos separadas, cada una con su bus.
- Búsqueda y ejecución se solapan: más velocidad con el mismo reloj.
- Los buses pueden tener anchos distintos: en un PIC, 14 bits de instrucción y 8 de datos.
- El programa no se puede modificar a sí mismo con facilidad, lo que además es una ventaja de seguridad.
- Es la arquitectura de PIC, AVR y de casi todos los microcontroladores.
05Memorias y mapa de memoria
| Tipo | Volátil | Se escribe | Para qué se usa |
|---|---|---|---|
| SRAM | Sí | Ilimitado | Variables del programa y pila. Rápida, cara, ocupa lugar: por eso un micro chico tiene 2 KiB. |
| DRAM | Sí | Ilimitado | Memoria principal de una computadora. Necesita refresco constante. |
| ROM de máscara | No | Nunca | Grabada en fábrica. Sólo para producciones enormes. |
| EPROM (UVPROM) | No | Se borra con luz UV | Histórica: la ventanita de cuarzo. Se borraba en 20 minutos bajo la lámpara. |
| EEPROM | No | Byte por byte, ~106 veces | Guardar la configuración, el número de serie, la última consigna. |
| Flash | No | Por bloques, ~104–105 | El programa. Es lo que se graba al «quemar» el micro. |
| FRAM | No | Prácticamente ilimitado | Registro continuo de datos sin desgaste. Más cara. |
Está especificada en ciclos de escritura, no en años. Un programa que guarda una variable en EEPROM dentro del lazo principal, cien veces por segundo, agota los 100 000 ciclos de esa celda en menos de veinte minutos. Se escribe sólo cuando el valor cambió, y si hay que registrar seguido, se rota entre varias posiciones. Es un error clásico y el equipo falla recién a los meses, cuando ya está instalado.
El mapa de memoria es la tabla que dice qué hay en cada dirección: un tramo de RAM, uno de Flash, y —lo más particular de los microcontroladores— los registros de los periféricos, que se leen y escriben como si fueran posiciones de memoria. Encender un LED es escribir un 1 en un bit de una dirección determinada. Eso es lo que hace, por debajo, cualquier función de una biblioteca.
// Los dos renglones hacen lo mismo en un AVR: encender el bit 5 del puerto B
digitalWrite(13, HIGH); // biblioteca: cómodo, unos microsegundos
PORTB |= (1 << PB5); // acceso directo al registro: 62,5 ns
La segunda forma es la que se usa cuando el tiempo importa. Requiere leer la hoja de datos, que es justamente la habilidad que se desarrolla en 6° año.
06Microprocesador y microcontrolador
Un microprocesador es una CPU y nada más: necesita memoria externa, controladores y una plaqueta alrededor. Un microcontrolador es una computadora entera en un chip: CPU, memoria, reloj y periféricos.
| Microprocesador | Microcontrolador | |
|---|---|---|
| Memoria | Externa, en chips aparte | Interna: Flash, SRAM y EEPROM |
| Periféricos | Externos | Integrados: A/D, timers, puertos, comunicación |
| Potencia de cálculo | Alta: GHz, 32 y 64 bits | Modesta: MHz, 8 a 32 bits |
| Consumo | Watts | Miliwatts, y microamperes durmiendo |
| Arranque | Sistema operativo, segundos | Ejecuta el programa en microsegundos |
| Uso típico | Computadoras, servidores, celulares | Electrodomésticos, autos, instrumentos, control |
| Costo del sistema | Alto | Muy bajo: el chip y poco más |
- PIC (Microchip): Harvard, muy difundido en la industria argentina, enorme cantidad de modelos. Es el que se desarrolla en Electrónica Digital III.
- AVR (Microchip/Atmel): el del Arduino UNO. Un ciclo por instrucción y herramientas libres.
- ARM Cortex-M (STM32, RP2040, ESP32 con su propio núcleo): 32 bits, mucha potencia por poco dinero, el estándar actual de la industria.
- ESP32: agrega WiFi y Bluetooth en el mismo chip; es lo que hace posible cualquier proyecto conectado.
Un microcontrolador se aprende leyendo su datasheet y su manual de referencia: ahí están el mapa de memoria, los registros de cada periférico y los tiempos. Los ejemplos de internet resuelven un caso; la hoja de datos resuelve todos. Aprender a leerla es parte del oficio, y se practica con C, que es el lenguaje en el que están escritos casi todos esos ejemplos —lo que ya se trabajó en elementos básicos del lenguaje C.
07En el laboratorio
Con un microcontrolador funcionando, medir con el osciloscopio la frecuencia del cristal y compararla con lo que dice el circuito. Después escribir un programa que conmute un pin lo más rápido posible y medir la frecuencia de esa señal: de ahí sale cuántos ciclos gasta el lazo. Es la forma directa de comprobar que la CPU ejecuta una instrucción por vez y cuánto tarda.
Sobre un sistema con memoria externa (o con un simulador), conectar LED a las líneas bajas del bus de direcciones y hacer correr un programa muy lento. Se ve la cuenta binaria del PC avanzando: es la Figura 1 en el banco.
Escribir el mismo parpadeo de dos maneras: con la función de la biblioteca y escribiendo directo el registro del puerto. Medir con el osciloscopio la frecuencia máxima alcanzable en cada caso y anotar la diferencia. Suele ser de veinte a cincuenta veces.
Medir la corriente del microcontrolador con el programa corriendo, y después con el micro en modo de bajo consumo esperando una interrupción. Se pasa de decenas de miliamperes a unos pocos microamperes. Es la razón por la que un sensor a pila dura años.
08Errores frecuentes
| Síntoma | Causa habitual |
|---|---|
| El micro no arranca | Falta el capacitor de 100 nF junto a la alimentación, el pin de reset quedó al aire, o los fuses quedaron configurados para un reloj que no existe en la plaqueta. |
| Se reinicia solo cada tanto | El watchdog está habilitado y el programa no lo refresca, o hay caídas de tensión por una carga inductiva mal desacoplada. |
| El programa funciona en el simulador y no en la plaqueta | Tiempos reales: rebotes de pulsadores, capacidades del cableado, o un retardo calculado con el reloj equivocado. |
| Las variables se corrompen sin motivo | Desbordamiento de la pila: la SRAM es chica y un arreglo grande o una recursión la comen entera. |
| Una lectura del A/D es siempre baja | Impedancia de la fuente demasiado alta para el sample & hold. Ver conversores A/D. |
| El equipo falla a los meses de instalado | Escrituras repetidas en EEPROM: se agotaron los ciclos de una celda. |
| El pin no maneja el relé | Un pin entrega 20 mA como máximo. Todo lo que consuma más va con transistor, y con diodo volante si es inductivo: transistor como llave. |
| «Le sobra memoria pero no compila» | Se confunde Flash con SRAM. Las cadenas de texto viven en Flash, pero muchas bibliotecas las copian a SRAM al arrancar. |
09Autoevaluación
¿Cuánta memoria puede direccionar un bus de direcciones de 16 líneas?
216 = 65 536 posiciones, o sea 64 KiB. Con 20 líneas serían 1 MiB y con 32, 4 GiB.
¿Qué guarda el contador de programa y qué pasa cuando hay un salto?
La dirección de la próxima instrucción. Normalmente se incrementa solo; un salto es simplemente cargarle otro valor, y una llamada a subrutina es guardar el valor actual en la pila antes de cargarlo, para poder volver.
Un PIC con cristal de 20 MHz que divide el reloj por cuatro: ¿cuántas instrucciones por segundo ejecuta?
20 MHz / 4 = 5 MIPS, y cada instrucción tarda 200 ns. Un AVR de 16 MHz con un ciclo por instrucción ejecuta 16 MIPS: más rápido con un cristal más lento.
¿Cuál es la ventaja concreta de la arquitectura Harvard?
Que puede buscar la próxima instrucción mientras ejecuta la actual, porque instrucciones y datos viajan por buses separados. Además cada bus puede tener el ancho que le conviene.
¿Por qué no conviene guardar un contador en EEPROM dentro del lazo principal?
Porque la EEPROM soporta un número limitado de escrituras por celda (105 a 106). Escribiendo cien veces por segundo se agota en minutos. Se guarda sólo cuando el valor cambia, o se rota entre varias posiciones.
¿Qué diferencia hay entre Flash, SRAM y EEPROM en un microcontrolador?
Flash: el programa, no volátil, se graba por bloques. SRAM: las variables mientras corre, volátil, se borra al cortar la alimentación. EEPROM: datos que deben sobrevivir al corte —configuración, calibración—, escribible byte por byte.
¿Qué son las banderas de la ALU y para qué sirven?
Bits de estado que la ALU deja después de cada operación: cero, acarreo, negativo,
desbordamiento. Las instrucciones de salto condicional las consultan, así que son el puente entre la
aritmética y el if de un programa.
¿Cuándo conviene lógica cableada en vez de un microcontrolador?
Cuando la respuesta tiene que ser de nanosegundos, cuando la función es tan simple que una compuerta la resuelve, y sobre todo cuando la seguridad no puede depender de que un programa esté corriendo: un enclavamiento o una protección se cablean.
¿Por qué escribir directamente el registro de un puerto es mucho más rápido que usar la función de la biblioteca?
Porque la función verifica el número de pin, busca en una tabla a qué puerto y bit corresponde y recién ahí escribe: son decenas de instrucciones. La escritura directa es una.
Un pin de salida tiene que manejar un motor de 500 mA. ¿Cómo se conecta?
Nunca directo: un pin entrega unos 20 mA. Va con un transistor o un MOSFET como llave, con su resistencia de base, el diodo volante sobre la bobina y, si conviene aislar, un optoacoplador. La alimentación del motor debe ser independiente de la del micro.