Onze huidige computers en besturingssystemen zijn gebouwd op de fundamenten van de vorige generatie. Dat fundament is ondertussen meer dan vijftig jaar oud. In de komende afleveringen vraag ik mij af hoe we vanaf niets een nieuw fundament kunnen bouwen.

hetlab logo
Henk van de Kamer

 

Op het einde van de vorige aflevering gaf ik aan af te willen van processoren die door grote fabrikanten gemaakt worden. De verborgen processor en diens besturingssysteem maakt een computer te complex. Om te laten zien hoe complex onze wereld is geworden, beginnen we met de schakeling in de foto hieronder. 

BREADUINO 
De chip - het zwarte blokje met 28 pinnen - in het midden op de foto is een ATmega328. Mogelijk dat een aantal lezers nu gaat glimlachen. Deze microcontroller is namelijk het hart van de Arduino Uno. Een originele versie kost circa € 22,-. Wie echter genoegen neemt met een kloon, telt zo’n € 7,- neer. Dezelfde kloon in een Chinese webwinkel kost je € 2,47 inclusief de verzendkosten! De foto toont een Arduino-kloon gemaakt op een breadboard: het witte vlak waarop we alles kunnen aansluiten zonder te hoeven solderen. Exclusief breadboard en draadverbindingen hebben de componenten mij € 3,86 gekost. Meer dan in China, maar deze vergelijking is niet eerlijk. De genoemde prijs is voor het per stuk bestellen van alle onderdelen. Uiteraard zullen de Chinezen veel grotere aantallen tegelijk afnemen, waardoor het aanzienlijk goedkoper wordt. Verder heb ik de basis van een Arduino zoveel mogelijk na gebouwd. Veel van de onderdelen verzorgen extra functionaliteit en kunnen weggelaten worden. Op mijn website (https://www.hetlab.tk/arduino/breaduino) zie je een veel grotere foto, informatie over de exacte onderdelen en uitleg over dat weglaten. Het geheel is volgens mij uit te kleden tot de ATmega328 en één weerstand.hetlab 317 breaduino

PROGRAMMEREN? 
Uiteraard willen we onze ‘Breaduino’ in werking zien. Op een normale Arduino sluit je een usbkabel aan en kan het programmeren beginnen. Waarmee we de eerste schakel in onze complexe wereld hebben gevonden. Om een microcontroller te programmeren, wordt vaak een gewone computer gebruikt. Op onze Breaduino ontbreekt de usb-aansluiting. Nu is deze op een Arduino Uno verbonden met een usb-naar-UART-chip. Die laatste is grofweg de seriële verbinding die vroeger achterop de computer was te vinden. 
USB is een veel complexer protocol dat, anders dan wat gemak en minder verschillende aansluitingen, verder weinig toevoegt. Vandaar dat de meeste microcontrollers gewoon de seriële verbinding gebruiken. Op onze Breaduino zijn dat de paarse, groene en zwarte draad rechts. De genoemde conversiechip is ook te koop als adapter met aan de ene kant een usb-aansluiting en aan de andere kant drie pinnen die we in de juiste volgorde op het breadboard kunnen aansluiten. Wie bovenstaande probeert, zal ontdekken dat onze Breaduino niet wenst te reageren en op dit punt wordt duidelijk waarom de Arduino zo succesvol is. De ATmega328 op een Arduino wordt vanuit de fabriek voorzien van een zogenaamd bootloader-programma in een deel van het flashgeheugen. Deze bootloader gebruikt de interne UART om je programma te ontvangen en in het resterende flashgeheugen te plaatsen en vervolgens uit te voeren. De ATmega328 die je los bestelt, heeft deze bootloader niet. Het flash geheugen is maagdelijk leeg, omdat deze microcontroller al te koop was voordat de Arduino een succes werd. 

EERSTE INSTRUCTIE 
Uiteraard willen we nu weten hoe deze bootloader in het flashgeheugen geplaatst kan worden. Of beter: hoe de ATmega328 werd geprogrammeerd toen de Arduino nog niet bestond. Atmel (tegenwoordig Microchip) weet dat een processor zonder programma niet zinvol is. Met andere woorden: elke processor moet ergens zijn eerste instructie ophalen. Deze wordt hard in de processor gecodeerd en is vaak een sprong naar een geheugenlocatie waar verdere instructies verwacht worden. 
Om een ROM (Read Only Memory)-chip of het tegenwoordig meer gebruikelijke flashgeheugen aan te sturen, is een adresbus noodzakelijk. Dit is een serie verbindingen die de processor kan aansturen om de instructies op te halen. Op een gewone processor zijn deze verbindingen als pinnen op de chip beschikbaar. Ontwerpers van de computer waarin de processor gebruikt wordt, kunnen daarmee een eerste programma op de locatie waarheen gesprongen wordt, beschikbaar maken. Op een x86-computer is dit het BIOS. Het eerste programma kan dan op zoek gaan naar een besturingssysteem of bijvoorbeeld een BASIC-prompt starten. 
Voor een microcontroller willen we zoveel mogelijk pinnen gebruiken als in- of uitvoer. Daarom blijft de adresbus intern. Omdat microcontrollers flashgeheugen gebruiken voor het opslaan van programma’s, wordt een eveneens interne schakeling gebruikt om dit te vullen. Om te zorgen dat een eventueel aanwezig programma kan worden overschreven, heeft één pin (soms meerdere) een dubbele functie: programmeren of normale in/uitvoer. In de ATmega328 is dit pin 1 - de gele draad. Zodra deze pin hoog wordt gemaakt, wordt de processor gestopt en de programmeerschakeling gestart. 

LETTERBRIJ 
Op dit punt moet ik een hele serie afkortingen introduceren. De schakeling wordt door Atmel ICSP genoemd: In-Circuit Serial Programming. Als protocol wordt SPI - Serial Peripheral Interface - gebruikt. Hiermee kan via drie draden data uitgewisseld worden. De drie draden heten respectievelijk MOSI (Master Out Slave In), MISO (Master In Slave Out) en SCK (Serial ClocK). Sommige politiek correcte figuren nemen aanstoot aan deze afkortingen, maar persoonlijk vind ik hun ongetwijfeld goede bedoelingen een gevaarlijke ontwikkeling. Maar dat is een ander verhaal (https://www.hetlab.tk/embedded/spi-handmatig-schakelen). 
Met ruim driehonderd woorden uitleg is het programmeren via de UART nu vervangen door ICSP. In een Arduino heeft iemand de ATmega328 via ICSP voorzien van een bootloader. Deze wacht na het aanzetten een paar seconden of we een nieuw programma willen uploaden en start vervolgens het echte programma. Deze bootloader is niet essentieel. Niets weerhoudt je ervan om ICSP te gebruiken en de ruimte die de bootloader in beslag neemt, te gebruiken voor andere doelen. Het eindresultaat is uiteindelijk hetzelfde: uploaden van het gewenste programma in het flashgeheugen. 

SUCCESVOL 
Zoals beloofd moet ik uitleggen waarom de Arduino zo succesvol is. Vroeger kon onze computer direct communiceren dankzij de seriële en parallelle poort. Beide (en meer!) zijn tegenwoordig vervangen door usb. De meeste mensen zijn vergeten dat USB een afkorting is voor Universal Serial Bus. Dat ‘serial’ slaat op het versturen van de data tussen computer en randapparatuur. Die laatste kan de seriële data indien nodig weer parallel maken. Je kunt dus een usb- naar de ouderwetse 9-pins seriële connector kopen, maar ook een exemplaar dat we vroeger op de parallelle poort van een printer aansloten. 
Zoals de naam aangeeft, is USB een universele aansluiting. In feite verpakken we de data in een pakketje dat via het USB-protocol wordt verstuurd. De data kunnen dus van alles zijn. Deze data worden aan de computerkant uiteraard via instructies in een driver door de processor aldaar verwerkt. De andere kant van de verbinding kan eveneens een processor zijn, maar ook een schakeling. De meest gebruikte chip met zo’n schakeling doet de conversie tussen usb en UART. Combineer deze extra chip met een bootloader en voilà: de Arduino Uno is geboren. 

TOT SLOT 
Ondanks deze succesvolle actie maken de bootloader en extra chip het geheel een stuk complexer. Waarom niet rechtstreeks ICSP gebruiken? Er zijn chips die de conversie usb-naar-SPI uitvoeren. Het probleem is dat ICSP meer doet dan data versturen via SPI. Naast de ATmega328 heeft Atmel nog veel meer varianten in de aanbieding. Er is daarom een instructie om de variant op te vragen. Verder willen we niet alleen programmeren, maar ook functies van de ATmega aan- of uitzetten. Uiteraard kan er een chip gemaakt worden die de conversie van USB naar ICSP uitvoert, maar deze is dan alleen bruikbaar voor de Atmel-microcontrollers. 
Op dit punt moet ik vanwege ruimtegebrek helaas stoppen. In de volgende aflevering laat ik zien op welke manieren een lege ATmega328 geprogrammeerd kan worden. Waarmee iedereen snapt waarom de Arduino zoveel gemakkelijker is.

hetlab logo