Microcontrollers
Microcontrollers worden steeds meer gebruikt, zowel in de hobbyistensfeer als op professioneel nivo. Wat voor geheimen schuilen er in die mysterieuze zwarte blokjes?
Wat is een microcontroller eigenlijk?
Een microcontroller is niets anders dan een processor, zoals ook in je PC zit, maar dan kleiner en meestal met een aantal zaken, zoals RAM, ROM en randapparatuur op de chip geintegreerd
Welke microcontrollers worden veel gebruikt?
In het verleden werden kleine processortjes zoals je ze ook wel terugvind in de homecomputers uit die tijd, vaak ook gebruikt als embedded processor, denk aan de Z80, 6502, 6800, 8080 etcetera. Deze boards hadden als nadeel dat de processor nauwelijks wat on board had: de hele busstructuur, het RAM, het ROM, seriële interfaces e.d. moesten allemaal als aparte chips aan het ontwerp toegevoegd worden, wat grote boards opleverde die niet even snel door de hobbyist inelkaar te zetten zijn. Een van de eerste succesvolle microcontrollers die zonder al te veel externe hardware z'n werk kon doen was de 8052-serie van Intel. Deze serie had ROM, RAM, een UART, timers, IO-pinnen e.d. standaard aan boord zitten, zodat een single-chip-oplossing mogelijk werd.
De 8051-architectuur word nog steeds wel veel gebruikt, onder andere omdat er andere fabrikanten (oa Atmel, Dallas/Maxim)er uitgebreidere versies van gemaakt hebben, maar de architectuur ervan stamt uit 1980 en is op een aantal punten niet meer compleet up-to-date. De laatste jaren zijn er echter een aantal nieuwe achtbits-processorfamilies ontstaan, die door handige features als een RISC-architectuur met een kleine maar krachtige instructieset, een kleine grootte (een uC met maar acht pootjes is op dit moment geen uitzondering meer) en veel ingebouwde peripherals de 8051 en tijdgenoten grotendeels uit de markt gedreven hebben.
De door hobbyisten meestgebruikte microcontrollers lijken op dit moment de Atmel AVR en de Microchip PIC te zijn. Dit zijn beide kleine 8-bit RISC-processoren, die in assembly, C, en soms ook nog andere talen als Basic en JAL te programmeren zijn.
Het ligt in de lijn der verwachting dat de microcontrollers, net als de normale processoren, steeds sneller worden. Fabrikanten staan dan ook al te trappelen om nieuwe microprocessoren met een 32-bits-architectuur aan de man te brengen. Deze uCs zijn vaak gebaseerd op de ARM-core, een RISC-core die snelheden van tientallen en zelfs ook honderden megahertzen op z'n sokken aankan.
Het nadeel van deze processoren is dat ze meestal in een TQFP-behuizing zitten, die lastig te solderen is, en dat de verkrijgbaarheid ervan meestal beperkt is. Aan het eerste word wat gedaan: de Philips LPC2103-serie schijnt ook in PLCC-formaat uit te komen, wat met een IC-voetje in een normale experimenteerplaat te steken is. Verder is het een mogelijkheid om experimenteerbordjes te kopen waar een ARM-microcontroller al op voorgesoldeerd is.
Naast de 'rauwe' microcontroller die met C of assembly geprogrammeerd moet worden, bestaan er ook boardjes met een microcontroller, geprogrammeerd met een BASIC-interpreter, en een stukje eeprom erop. De bekendste hiervan is de Basic Stamp van Parallax.
Hoe vertel ik mijn microcontroller wat 'ie moet doen?
De meeste microcontrollers zijn het best in een taal te programmeren die dicht tegen machinetaal aanligt: assembly en C zijn bijvoorbeeld vaakgekozen talen. Het voordeel van assembly is dat een assembler voor alle microcontrollers wel gratis te verkrijgen is, en dat je dicht op de processor werkt waardoor je je code strakker en sneller zou kunnen krijgen dan een compiler voor een hogere taal het zou kunnen. Het voordeel van C is dat het een makkelijkere taal is dan assembly, zowel om te leren als om te gebruiken. Het is meestal ook mogelijk om de twee talen door elkaar heen te gebruiken: assembly voor de tijdkritische delen, c voor de rest.
Hoe programmeer ik die krengen?
De makkelijkste, en duurste, manier is om een (evaluation bord met ingebouwde) officiele programmer te kopen, maar dat kan duur uitvallen, reken op prijzen van €100-€300. Het kan natuurlijk ook goedkoper: de meeste uCs zijn met een seriële of parallele poort en wat speciale software te programmeren:
- PonyProg kan veel devices programmeren, ook uCs.
- ic-prog is ook een universele programmer.
- De Philips Flash Utility die hier te vinden is kan gebruikt worden om LPC21xx-chips mee te flashen
- Een PIC programmer
- Nog een pic programmer
- Deze pic programmer is zowel zelf te bouwen als te bestellen.
- Een AVR programmer
- Ook Velleman verkoopt goedkope programmers en experimenteerboards, bijvoorbeeld de K8048 en K8076 voor de PIC-serie.
Veel voorkomende problemen bij microcontrollers
Mijn microcontroller doet raar op vreemde momenten zonder aanwijsbare oorzaak in de code.
Je voedingsontstoring zou wel eens niet adequaat kunnen zijn. Voor een schakeling met alleen een paar kleine gebruikers (uC, logische IC's, ledjes, ...) zou het genoeg moeten zijn om een 10 tot 100uF-elko over de voedingsspanning te zetten, en een condootje van 100nF aan de Vcc- en Gnd-poten van je logische ICs en uCs te hangen. Voor schema's waar een zwaardere belasting aan de voedingsspanning van het uC hangen, moet je een grotere elko kiezen.
Mijn PWM-generator doet het prima, maar geeft zo nu en dan 'glitches' waarbij het signaal heel even veel te hoog of laag is.
Misschien heeft je PWM-generator(-code) last van glitches? Een glitch ontstaat zo: Stel, we hebben een pwm-generator gemaakt uit een teller die continue omhoogtelt van 0 tot 255. Zodra de teller 0 is, word de PWM-uitgang hoog gemaakt, zodra de teller de waarde X (opgeslagen in een variabele of register oid) bereikt heeft, word de uitgang laag gemaakt.
Stel, op een gegeven moment is X 128. De PWM-generator is nu ingesteld op een duty-cycle van 50%. Op het moment dat de teller toevallig bij 127 aangekomen is, verandert de gebruiker of andere code in de uC X naar 126. De teller telt dan door tot 255, wrapt around naar 0 en gaat door tot 126 zonder dat de output laag gaat: de teller komt dus 381 cycles (127+129+126) door zonder de output laag te maken. Dit uit zich bijvoorbeeld in een 'lichtflitsje' bij leds en een raar geluid bij electromotoren.
De manier om dit probleem op te lossen word meestal geimplementeerd als een buffervariabele, Xb. Als de code de duty-cycle van de PWM-generator wil veranderen, schrijft deze niet naar de variabele X, maar naar Xb. Zodra de teller 0 bereikt heeft, kopieert de PWM-code Xb naar X. Omdat X dan alleen wijzigt als de teller 0 is, ben je van de glitches af.
Links
AVR:- Atmel, de maker van de AVRs
- AvrFreaks, een site met veel info over de AVR
- AVR tutorial op circuitsonline
- Bascom, een BASIC-compiler voor de AVR. Gratis versie, met enkele limieten, downloadbaar.
- AAVRS, hier kan je online AVRs kopen voor een prijs die lager ligt dan in de meeste winkels
PIC: - Microchip, de maker van de PICs
- Voti, hier kan je online PICs kopen voor een prijs die lager ligt dan in de meeste winkels