Beetje Coderen

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.

⏱ 40 minuten leestijd + oefenen

🎯 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:

  1. Pin configurations (begin): welke fysieke pin welke functies heeft.
  2. Per peripheral een hoofdstuk (bijvoorbeeld I/O-Ports, 16-bit Timer/Counter1), met een register description aan het eind.
  3. 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

  1. Hoeveel uint16_t-waarden passen er theoretisch in het SRAM van de ATmega328P? Waarom kun je er in de praktijk minder gebruiken?
  2. Zoek in de pinout-tabel: op welke ATmega-pin zit de ingebouwde LED van de Uno, en welk bit van welke poort is dat?
  3. Noem twee redenen waarom een thermostaat een microcontroller gebruikt en geen Raspberry Pi met Linux.
Modelantwoord
  1. 2048 / 2 = 1024. In de praktijk minder: de stack, globale variabelen en buffers van bijvoorbeeld de UART gebruiken ook SRAM (les 15).
  2. D13 = PB5: bit 5 van poort B.
  3. 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

  1. Open in de lab-omgeving het bestand pinout.md met een tabel van tien Arduino-pinnen.
  2. Vul per pin de ATmega328P-naam (zoals PB5), de poort en het bitnummer in, en alle alternatieve functies uit de datasheet.
  3. Beantwoord in hetzelfde bestand: welke pinnen kun je níet vrij gebruiken als je de seriële monitor gebruikt?
  4. 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

Volg daarna de stappen van de opdracht hierboven. Nog geen Docker? Zie les 14 van Een beetje Linux & Docker. Voor dit lab is er geen live lab in de browser.

Klaar? Controleer je werk met:

$ beetje check embedded-c-les2

📝 Quiz: wat is een microcontroller?

5 vragen · 70% nodig om te slagen

1. Hoeveel SRAM heeft de ATmega328P?
2. Wat gebeurt er met de inhoud van het flashgeheugen als de stroom eraf gaat?
3. Wat is een peripheral?
4. Op welke ATmega328P-pin zit Arduino-pin D13?
5. Waar zoek je in een datasheet de maximale stroom per pin?