¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Registros y bits de un microcontrolador

Después de esta lección: Puedo leer y cambiar bits concretos de un registro con una máscara.

Lección de 50 min2 comandosLaboratorio de sistemas embebidos: registros, pines, PWM e interrupciones en un chip simulado

Un chip sin pantalla ni teclado

Un microcontrolador es un chip pequeño con procesador, memoria y patillas para conectar cosas. Está dentro de una lavadora, de un termostato o del mando de una consola.

Para encender una luz o leer un botón, solo escribe y lee unos pocos números. Si sabes cambiar un bit de ese número, ya puedes controlar una patilla.

Al final de esta lección

Nota

Puedo leer y cambiar bits concretos de un registro con una máscara.

Palabras clave

PalabraQué significaEjemplo
Registrouna celda de memoria del chip, aquí de 8 bits
Bitun 0 o un 1; el bit 0 es el de la derecha
Máscaraun número que elige los bits que se tocan0b00000100
Patillauna pata del chip, en nivel alto (1) o bajo (0)
Simuladorun programa que imita un chip

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un chip inventado

Importante

El chip del laboratorio es un simulador de un chip que no existe. No es una placa real. Una placa real tiene otros registros, otros nombres y muchas más reglas. Los scripts imprimen palabras en inglés, como registers y set bit. Lo que importa es la idea.

Un registro guarda 8 bits con significado

Un registro guarda 8 bits, un valor de 0 a 255. Cada bit tiene su propio significado: uno puede mandar sobre una patilla y otro puede activar un temporizador.

El simulador tiene siete registros y todos valen 0 tras un reinicio. El programa los escribe y los lee, y el chip actúa según lo que contienen.

Los siete registros del chip simulado

RegistroPara qué sirve
DDRDice qué patillas son salidas: un 1 es una salida
PORTLo que el chip pone en las patillas de salida
PINEl nivel que se lee ahora en cada patilla
TCCRControla el temporizador: contar, PWM e interrupción
TCNTLa cuenta actual del temporizador
OCREl valor de comparación del temporizador
IFRLa marca que avisa de una interrupción

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Muestra los siete registros tras un reinicio

Comando
docker exec jupyter python3 steps/registers.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Qué imprime ese script

Primero escribe una línea en inglés, registers after reset. Después hay siete líneas, una por registro, con el nombre y el valor en binario, en hexadecimal y en decimal.

Todos valen 0b00000000, 0x00 y 0. Así empieza cualquier chip: a cero, hasta que el programa escribe algo.

Una máscara cambia solo los bits que eliges

Para cambiar un bit sin tocar los demás se usa una máscara: un número con un 1 en cada bit que quieres elegir. La máscara del bit 3 es 1 << 3, que vale 0b00001000.

Con OR se pone un bit a 1. Con AND y la máscara invertida se borra a 0. Con XOR se invierte.

Ejemplo resuelto: cuatro cambios sobre PORT

PasoOperaciónResultado
Valor de partidaPORT = 0b000010100b00001010
Poner el bit 0PORT | (1 << 0)0b00001011
Borrar el bit 1PORT & ~(1 << 1)0b00001001
Invertir el bit 3PORT ^ (1 << 3)0b00000001
Invertir el bit 3 otra vezPORT ^ (1 << 3)0b00001001

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Cambia bits de PORT, paso a paso

Comando
docker exec jupyter python3 steps/bits.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Qué imprime el script de bits

Cada línea empieza con una frase en inglés, como start o set bit 0, y sigue con PORT en binario, hexadecimal y decimal. Los valores son los de la tabla: de 0b00001010 a 0b00001011, 0b00001001, 0b00000001 y vuelta a 0b00001001.

Al final lee dos cosas más. Las cuatro cifras de abajo, 1001, y el bit 0, que vale 1.

Un error frecuente

Advertencia

Mucha gente cree que sumar una máscara es lo mismo que poner un bit. No lo es. Si el bit ya vale 1, la suma se lleva al bit siguiente: 0b0101 + 0b0001 da 0b0110. OR deja el bit en 1 y no toca los demás. Usa | para poner, no +.

Un bit se lee desplazando y enmascarando

Para saber cuánto vale el bit n, desplaza el registro n lugares a la derecha y quédate con el último bit: (valor >> n) & 1.

Para quedarte con varios bits, como las cuatro cifras de abajo, usa una máscara de varios unos: valor & 0x0F. Cambia el número de abajo y ejecuta.

Lee bits de un registro

Código: python
estado = 0b01101001

# El bit 3 está a 1 o a 0
print((estado >> 3) & 1)
# Los cuatro bits de arriba
print(format(estado >> 4, "04b"))
# Cambia estado y mira qué bits salen

Sobre este laboratorio y su código: Laboratorio de sistemas embebidos: registros, pines, PWM e interrupciones en un chip simulado

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.