Les 2
Wat is een microcontroller?
CPU, flash, RAM en randapparatuur op één chip: wat een microcontroller anders maakt dan een pc, en hoe je een datasheet en pinout leest.
🎯 Na deze les kun je
- de onderdelen van een microcontroller benoemen: CPU, flash, RAM, peripherals en klok
- het verschil met een pc uitleggen
- in een datasheet en pinout de functie van een pin opzoeken
Een wasmachine, een fietscomputer, een thermostaat, de afstandsbediening van je tv: er zit een microcontroller in. Een complete kleine computer op één chip, die meestal maar één taak heeft en die jarenlang uitvoert zonder dat iemand hem ooit opnieuw opstart.
In deze cursus programmeer je zo'n chip in C. We gebruiken de ATmega328P: de chip op de Arduino Uno en Nano. Hij is goedkoop, overal verkrijgbaar, goed gedocumenteerd en eenvoudig genoeg om tot op het register te begrijpen. Alles werkt ook in een simulator, dus een echt bordje is optioneel. In het gevorderde deel kijken we waar nodig naar grotere ARM-chips (zoals de RP2040 van de Raspberry Pi Pico).
Wat zit er op de chip?
| Onderdeel | ATmega328P | Je laptop (ter vergelijking) |
|---|---|---|
| CPU | 8-bit AVR, 16 MHz | 64-bit, ~3 GHz, meerdere kernen |
| Programmageheugen (flash) | 32 KB | SSD van honderden GB |
| Werkgeheugen (SRAM) | 2 KB | 8–32 GB |
| EEPROM | 1 KB | n.v.t. |
| Besturingssysteem | geen | Linux, Windows, macOS |
| Stroomverbruik | ~10 mA, of µA in slaap | 10–60 W |
Twee kilobyte RAM. Dat is minder dan deze alinea in een Python-string. Daar moet je bij het programmeren rekening mee houden: geen malloc, geen grote buffers, zorgvuldig kiezen hoe groot een getal moet zijn.
- CPU: voert je instructies uit, één per klokslag voor de meeste instructies.
- Flash: hier staat je programma. Blijft bewaard zonder stroom; je schrijft het bij het "flashen".
- SRAM: variabelen en de stack. Weg zodra de stroom eraf gaat.
- EEPROM: klein geheugen voor instellingen die bewaard moeten blijven.
Peripherals
Het verschil met een "gewone" processor zit in de peripherals (randapparatuur): hardwareblokken op de chip die zelfstandig taken uitvoeren.
| Peripheral | Doet | Les |
|---|---|---|
| GPIO | pinnen aan/uit zetten of uitlezen | 5, 6 |
| Timers | tijd meten, periodieke interrupts, PWM | 7, 10 |
| UART | seriële communicatie met een pc of module | 8 |
| ADC | analoge spanning omzetten naar een getal | 9 |
| I2C (TWI) en SPI | praten met sensoren en displays | 11, 12 |
| Watchdog | de chip resetten als je programma vastloopt | 23 |
Je bestuurt elk peripheral via registers: speciale geheugenadressen. Schrijf je een 1 op de juiste plek, dan gaat er een LED aan. Hoe dat precies werkt, zie je in les 4.
De klok
Alles in een microcontroller loopt op het ritme van een klok. Op de Arduino Uno is dat een kristal van 16 MHz: 16 miljoen tikken per seconde. Eén tik duurt dus 62,5 ns. Timers, de baudrate van de UART en elke vertraging worden van deze klok afgeleid. Een lagere klok betekent: trager, maar ook zuiniger (les 16).
Microcontroller versus pc
| Microcontroller | Pc | |
|---|---|---|
| Programma | één programma, start bij aanzetten | veel programma's, besturingssysteem kiest |
main |
eindigt nooit (oneindige lus) | eindigt, terug naar het OS |
| Geheugen | KB's, geen virtueel geheugen | GB's, beschermd per proces |
| Fout | een crash betekent: hangen of resetten | het OS stopt alleen jouw programma |
| Tijd | voorspelbaar tot op de klokslag | onvoorspelbaar (scheduler, caches) |
Die laatste regel is waarom microcontrollers in remmen, pacemakers en industriële machines zitten: je kunt garanderen dat een reactie binnen een bepaalde tijd gebeurt.
Datasheet en pinout
De datasheet van de ATmega328P is ruim 600 pagina's. Niemand leest hem van voor naar achter. Je zoekt erin zoals in een woordenboek:
- Pin configurations (begin): welke fysieke pin welke functies heeft.
- Per peripheral een hoofdstuk (bijvoorbeeld I/O-Ports, 16-bit Timer/Counter1), met een register description aan het eind.
- Electrical characteristics (achterin): maximale spanning en stroom per pin.
Een pin heeft vaak meerdere functies. Pin 15 heet bijvoorbeeld PB1 (OC1A/PCINT1): hij is bit 1 van poort B (GPIO), de uitgang van timer 1 kanaal A (PWM) en een pin-change-interruptbron. Welke functie actief is, kies je met registers.
Op het Arduino-bordje staan andere namen dan in de datasheet. Die vertaling heb je vaak nodig:
| Arduino-pin | ATmega328P | Bijzonderheid |
|---|---|---|
| D0 / D1 | PD0 / PD1 | UART RX / TX (les 8) |
| D2, D3 | PD2, PD3 | externe interrupts INT0, INT1 |
| D9, D10 | PB1, PB2 | PWM via timer 1 |
| D11–D13 | PB3–PB5 | SPI (MOSI, MISO, SCK); D13 = ingebouwde LED |
| A0–A5 | PC0–PC5 | ADC-ingangen; A4/A5 ook I2C (SDA/SCL) |
De ATmega328P op de Uno werkt op 5 V. Veel modernere chips en sensoren (RP2040, ESP32, de meeste I2C-sensoren) werken op 3,3 V en gaan kapot van 5 V op een pin. Controleer altijd de spanning in de datasheet voordat je iets aansluit.
Oefeningen
- Hoeveel
uint16_t-waarden passen er theoretisch in het SRAM van de ATmega328P? Waarom kun je er in de praktijk minder gebruiken? - Zoek in de pinout-tabel: op welke ATmega-pin zit de ingebouwde LED van de Uno, en welk bit van welke poort is dat?
- Noem twee redenen waarom een thermostaat een microcontroller gebruikt en geen Raspberry Pi met Linux.
Modelantwoord
- 2048 / 2 = 1024. In de praktijk minder: de stack, globale variabelen en buffers van bijvoorbeeld de UART gebruiken ook SRAM (les 15).
- D13 = PB5: bit 5 van poort B.
- Bijvoorbeeld: veel lager stroomverbruik (maanden op batterijen), direct aan bij inschakelen zonder opstarttijd, goedkoper, en geen besturingssysteem dat kan vastlopen of updates nodig heeft.
Lab: pinout van een bordje uitpluizen
- Open in de lab-omgeving het bestand
pinout.mdmet een tabel van tien Arduino-pinnen. - Vul per pin de ATmega328P-naam (zoals
PB5), de poort en het bitnummer in, en alle alternatieve functies uit de datasheet. - Beantwoord in hetzelfde bestand: welke pinnen kun je níet vrij gebruiken als je de seriële monitor gebruikt?
beetje check embedded-c-les2
Samenvatting
- Een microcontroller is CPU, flash, SRAM en peripherals op één chip, zonder besturingssysteem.
- De ATmega328P heeft 32 KB flash en slechts 2 KB SRAM, en loopt op de Uno op 16 MHz.
- Peripherals bestuur je via registers; pinnen hebben meerdere functies.
- In de datasheet zoek je pin configurations, het hoofdstuk van het peripheral en de electrical characteristics.
Volgende les: de toolchain en de simulator, zodat je je eerste firmware kunt bouwen.
Lab
Pinout van een bordje uitpluizen
💻 Dit lab doe je op je eigen computer met Docker. Start de lab-container met (geeft de opdracht een eigen startcommando, gebruik dan dat):
$ docker run -it --rm registry.wizg.it/webhosting/beetje-labs:embedded-c-les2
Klaar? Controleer je werk met:
$ beetje check embedded-c-les2