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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Registro | una celda de memoria del chip, aquí de 8 bits | |
| Bit | un 0 o un 1; el bit 0 es el de la derecha | |
| Máscara | un número que elige los bits que se tocan | 0b00000100 |
| Patilla | una pata del chip, en nivel alto (1) o bajo (0) | |
| Simulador | un 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
| Registro | Para qué sirve |
|---|---|
| DDR | Dice qué patillas son salidas: un 1 es una salida |
| PORT | Lo que el chip pone en las patillas de salida |
| PIN | El nivel que se lee ahora en cada patilla |
| TCCR | Controla el temporizador: contar, PWM e interrupción |
| TCNT | La cuenta actual del temporizador |
| OCR | El valor de comparación del temporizador |
| IFR | La 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
docker exec jupyter python3 steps/registers.pySe 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
| Paso | Operación | Resultado |
|---|---|---|
| Valor de partida | PORT = 0b00001010 | 0b00001010 |
| Poner el bit 0 | PORT | (1 << 0) | 0b00001011 |
| Borrar el bit 1 | PORT & ~(1 << 1) | 0b00001001 |
| Invertir el bit 3 | PORT ^ (1 << 3) | 0b00000001 |
| Invertir el bit 3 otra vez | PORT ^ (1 << 3) | 0b00001001 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cambia bits de PORT, paso a paso
docker exec jupyter python3 steps/bits.pySe 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
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