Professional Documents
Culture Documents
De Microcontroller
De Microcontroller
DE MICROCONTROLLERS
1 Inleiding
Van 1969 tot 1971 bouwde Intel in opdracht van ontwerpers van de Amerikaanse firma
Datapoint de eerste microprocessor (4004). Omdat de microprocessor ongeveer 10
keer trager werkte dan verwacht ging de koop niet door.
Intel heeft toen in 1972 besloten om het product op eigen risico op de markt te
brengen. Dit gebeurde onder de codenaam 8008.
Deze microprocessor werd enkele jaren later opgevolgd door de 8080. Deze
microprocessor werd gebruikt om in 1975 de eerste microcomputer te bouwen.
Dit was de Altair 8800 van de firma MITS. Naast de 8080 bezat deze microcomputer 256
bytes geheugen en dan toggleschakelaars en LED’s op een frontplaat. Een werkend
model kostte toen rond de $2000.
Voor deze computer werd een BASIC programmeertaal gemaakt door twee jonge kerels
(Bill Gates en Paul Allen) die een bedrijfje stichten met de naam MICROSOFT.
P. Dams - W. Andries
Elektronica en lab 3e graad IW 2
Wanneer in 1981 I.B.M. besluit om ook een microcomputer op de markt te brengen is het
startschot gegeven voor een waanzinnige evolutie die tot op dit moment nog steeds
doorgaat.
Een microcomputer is dus een kleine computer waarin een microprocessor zorgt voor
het verwerken van gegevens. Tegenwoordig vinden we kleine computertjes overal terug.
In de weegschaal van de slager, in de kassa van de supermarkt, in de sturing van de
verkeerlichten, in auto’s, enz…
Deze microcomputers zitten als het ware ingebakken in toestellen die we dagdagelijks
gebruiken, we spreken van “embedded computers”.
Wat microcontrollers betreft zijn er heel veel fabrikanten die elk hun eigen (uitgebreid)
reeks van microcontrollers verkopen. We denken dan onder andere aan Intel, Motorola,
Atmel, Microchip, Hitachi, Zilog, Dallas, Philips, Siemens, National Semiconductor, enz…
Wij gaan ons in deze cursus, na een algemene inleiding over de microcomputer,
beperken tot de ATMEGA162 uit de AVR-reeks van Atmel. Het is niet de bedoeling van
deze cursus om een diepgaande studie van een microcontroller te geven.
Wel is het de bedoeling om een goed inzicht te krijgen in de werking van een
microcontroller. Welke microcontroller men neemt speelt eigenlijk weinig rol. De meeste
microcontrollers werken op een vergelijkbare manier en dus is de overstap van één soort
microcontroller naar een andere meestal vrij makkelijk te maken.
De verschillen zitten meestal in (soms zéér belangrijke) details. Neem dus minstens één
keer de moeite om je in deze materie te verdiepen. De beste literatuur om dit te doen is
meestal niet een cursus of een boek maar wel de datasheet van het component.
P. Dams - W. Andries
Elektronica en lab 3e graad IW 3
2 Microcomputers
De CPU, Central processing unit, is het hart van de microcomputer. De CPU is meestal
een microprocessor en heeft als doel om de microcomputer te besturen en om de
gegevens te verwerken.
De handelingen die de CPU uitvoert zijn cyclisch. Dit wil zeggen dat er een vast patroon
zit in de handelingen die de processor verricht. De CPU haalt namelijk steeds een
instructie op uit het geheugen, voert de in de instructie aangegeven bewerking uit, haalt
de volgende instructie op, enz…
Zoals je kan merken zijn er twee soorten geheugen terug te vinden. Eén geheugen wordt
gebruikt om het programma, dat moet worden uitgevoerd, te bewaren. Dit deel van het
geheugen noemen we het programmageheugen (program memory). Het
programmageheugen is niet vluchtig geheugen. Dat betekent dat dit geheugen zijn
inhoud bewaard als de voedingsspanning af is. Als de microcomputer dan opgestart
wordt dan zal dit programma uitgevoerd worden.
Een tweede deel geheugen is het geheugen waar zich de gegevens bevinden. Dit kunnen
zowel de te verwerken gegevens zijn als de resultaten die de CPU uitkomt na het
uitvoeren van het programma. We noemen dit het datageheugen (Data memory).
Een laatste deel vormt de I/O (Input – Output) of de randcomponenten. Via deze
module komen gegevens de computer binnen en worden de gegevens van de computer
terug naar buiten gestuurd.
Als input kennen we onder andere het toetsenbord, de muis, een temperatuurmeter, een
ingang voor een schakelaar, enz…
Als output kennen we onder andere het scherm, een printer, een motorsturing, een
lampje, enz…
P. Dams - W. Andries
Elektronica en lab 3e graad IW 4
Het is natuurlijk noodzakelijk dat de verschillende blokken met elkaar worden verbonden.
Zo moet de CPU de verschillende instructies uit het programmageheugen kunnen
ophalen, resultaten naar de outputmodule sturen enz…
Afhankelijk van de grootte van de gegevens (aantal bits) heb je meerdere draadjes
nodig. Zo een bundel van draadjes noemen we een bus en een draadje in deze bus
noemen we een lijn.
De bus die aanduidt waar in het geheugen gegevens moeten worden opgehaald of
weggezet noemen we de adresbus.
In de meeste 8-bit microcontrollersystemen is de adresbus 16 adreslijnen breed. Dat
betekent dat men 216 verschillende adressen kan vormen op deze adresbus.
Naast de adresbus en de databus is er nog een derde bus. Deze bus wordt de
controlebus genoemd. Hierin vinden we controlelijnen terug zoals de read/write-lijn, de
interruptlijnen, de reset, enz… Deze lijnen controleren de richting waarin de gegevens
over de databus gaan, bepalen de werking van de computer, enz…
Op een print zijn de busstructuren meestal makkelijk terug te vinden. Ze bestaan uit een
aantal parallel lopende printbanen.
P. Dams - W. Andries
Elektronica en lab 3e graad IW 5
2.2 De busstructuren.
Wanneer we het over een bus hebben dan wordt ook de richting van de
gegevenstransport op deze bus aangeduid. De richting wordt steeds bekeken vanuit de
C.P.U.
Zo zal de C.P.U. altijd bepalen waar er gegevens worden opgehaald of gelezen of waar
gegevens worden weg geplaatst of geschreven.
Dit wil zeggen dat de C.P.U. de enige blok is die informatie op de adresbus plaatst. We
zeggen dat de adresbus unidirectioneel is.
Via de databus komen gegevens zowel de C.P.U. binnen als buiten. We zeggen dat de
databus bidirectioneel is.
Op een bus mag op een bepaald moment slechts door één deel van de microcomputer
informatie worden gezet.
Ook moeten we blokken die op een bepaald moment geen gegevens willen uitwisselen
via een bus tijdelijk van deze bus kunnen afschakelen. Hiervoor maken we gebruik van
de tri-state technologie. (Zie digitale technieken 5 e jaar) Hierbij kan de toestand van een
lijn na hoog en laag ook een hoog-ohmige toestand aannemen (Z).
P. Dams - W. Andries
Elektronica en lab 3e graad IW 6
2.3 De CPU
In dit deel van de cursus bestuderen we het hart van de microcomputer. We bekijken het
blokschema en overlopen de verschillende delen hierin. De hoofdtaak van de CPU bestaat
erin om een correcte uitvoering van het programma te garanderen.
Hiervoor moet de CPU taken kunnen zoals het lezen en beschrijven van geheugen,
berekeningen uitvoeren, ingangen en uitgangen controleren.
Fig. 8: De ALU
P. Dams - W. Andries
Elektronica en lab 3e graad IW 7
De meeste bewerkingen vergen twee gegevens (bvb.: A + B). Deze gegevens noem je
de operanden. De bewerking die moet gebeuren noemen je de opcode. Een instructie
in een programma bevat altijd een opcode en een operand.
2.3.2 De accumulator
De Accumulator is een register die gebruikt wordt om het resultaat van de ALU in te
plaatsen. De terugkoppeling die je ziet wordt bij vele CPU’s toegepast om sneller
kettingebewerkingen te kunnen uitvoeren. (bvb.: A + B +C)
Fig. 9:
Dit houdt echter wel in, dat de CPU moet weten op welke plaats de op te halen instructie
staat. De plaats in het geheugen (adres) waar de eerst volgende uit te voeren instructie
staat wordt bijgehouden in de programmateller.
De programmateller wordt automatisch met één verhoogt (geïncrementeerd) nadat een
instructie is opgehaald zodat de programmateller dan het adres van de volgende uit te
voeren instructie bevat. De programmeur dient de instructies dan wel zo in het geheugen
op te slaan, dat ze op opeenvolgende plaatsen in het geheugen staan.
Nadat de CPU een instructie heeft opgehaald uit het geheugen moet het in de CPU
bijgehouden worden. Dit gebeurt in het instructieregister.
P. Dams - W. Andries
Elektronica en lab 3e graad IW 8
De control unit zal alle nodige handelingen doen om de instructie uit te voeren
(execution), nadat de gehele instructie gedecodeerd is. Eénmaal de instructie volledig is
uitgevoerd kan de processor beginnen met het ophalen van de eerstvolgende uit te
voeren instructie.
In een processor is meestal een klein stukje geheugen aanwezig dat je kan gebruiken om
kleine dingen tijdelijk te bewaren. Je kan het vergelijken met een klein notaboekje.
Dit geheugen werkt volgens een speciaal principe dat we LIFO noemen. Dit staat voor
Last In First Out. Dit wil zeggen dat het gegeven dat je er laatst instopte er ook eerst
terug uit moet worden genomen. Dit geheugen noemen we de stack.
Dit zijn registers die vrij bruikbaar zijn voor verschillende toepassingen. Meestal hebben
general purpose registers een speciale functie voor sommige instructies. Als
programmeur kan je zelf ook wat data in deze registers stoppen. Het voordeel hiervan is
dat je weet dat deze data vlug ter beschikking is omdat ze zich in de CPU zelf bevindt.
De microprocessor is een synchrone digitale schakeling die werkt volgens een vast ritme.
In een microprocessor zit meestal een oscillator die een timingschakeling aanstuurt.
Deze timingschakeling zorgt ervoor dat al de acties van de processor volgens een vast
tijdschema verlopen.
De frequentie waarop de oscillator oscilleert kan bepaalt worden door het kristal dat
wordt aangesloten. In sommige gevallen kan ook een resonator worden aangesloten.
Het ritme waarop de processor werkt is bij sommige processors een deeltal van de
aangesloten klokfrequentie.
P. Dams - W. Andries
Elektronica en lab 3e graad IW 9
3 Geheugenstructuur.
In het eerste schema hebben we een onderscheid gemaakt tussen het programma
geheugen en het data geheugen. Het zijn twee aparte blokken in onze computer.
Er zijn nu twee manieren om deze twee blokken in het geheugen te zetten.
P. Dams - W. Andries
Elektronica en lab 3e graad IW 10
We vatten de verschillende fasen van één cyclus nog even kort samen:
De eerste fase in het proces is de instruction fetch. Het ophalen van de instructie
(instruction fetch) uit het programmageheugen gebeurt in twee stappen.
In de eerste stap stuurt de CPU het adres, dat door de programmateller wordt
aangegeven, via de adresbus naar het programmageheugen. Het bij dit adres
horende geheugenwoord wordt geselecteerd.
In een tweede fase van het proces gaat de instructiedecoder de instructie in het
instructie register decoderen. Voor sommige instructies heeft de CPU aan dit ene
instructiewoord voldoende informatie om deze instructie uit te voeren. Men spreekt dan
van een één-byte-instructie.
Er zijn echter ook instructies die een tweede of soms nog een derde byte nodig hebben
om de uitvoering van de instructie te kunnen voltooien
In de derde fase van het proces wordt de programmateller met één verhoogt. Indien
we te maken hebben met een twee-byte-instructie of een drie-byte-instructie zal de CPU
nog één of twee bytes uit het geheugen moeten ophalen alvorens de uit te voeren
instructie volledig is.
Eénmaal alle bytes binnen zijn kan de CPU aan de vierde fase van het proces beginnen
namelijk het uitvoeren van de volledige instructie. Deze fase noemen we de
“instruction execution”.
P. Dams - W. Andries
Elektronica en lab 3e graad IW 11
5 De ATmega162.
In 1993 introduceerde ATMEL zijn AVR-familie. De AVR microcontrollers van ATMEL zijn
RISCmicrocontrollers (Reduced Instruction Set Computer). Dit zijn microcontrollers die in
principe weinig instructies kennen maar ze wel zeer snel kunnen uitvoeren.
De ATmega162 kent 131 instructies en voert de meeste instructies uit in één cyclus. Dit
wil zeggen dat wanneer hij wordt uitgerust met een 10 MHz kristal hij tot 10Mips
(miljoen instructies per seconde) kan verwerken.
5.1 Blokschema
P. Dams - W. Andries
Elektronica en lab 3e graad IW 12
Wanneer we bovenstaand blokschema bekijken dan herkennen we een boel blokken die
we reeds in de vorige bladzijden hebben besproken. We overlopen even de blokken de
we reeds kennen.
Program Counter (programmateller),
16kB Program Flash (programmageheugen),
Instruction Register,
Instruction Decoder,
Control Lines + MCU control register & timing (controle eenheid),
Stack pointer,
1 kByte SRAM (vluchtig geheugen waarin zich onder andere de data en de stack
bevindt),
512Byte EEprom (niet-vluchtig geheugen waar ook data kan worden opgeslagen),
32 General Purpose Registers ,
ALU,
Status Register (bevat oa. de vlaggen van de ALU),
Oscillator en Timing and Control.
De overige blokken gaan we kort bespreken zodat je een idee hebt van de mogelijkheden
van deze microcontroller.
De ATmega162 is uitgerust met een watchdog. Het doel van deze unit is ervoor te
zorgen dat een microcontroller niet gaat “hangen”. Dit komt voor wanneer een
programma in een eindeloze lus terecht komt. Je zal het in windows zeker en vast al
hebben tegen gekomen. Je start een programma op en plotseling doet het niets meer.
Wanneer je dan in taakbeheer gaat kijken merk je dat er bij het respectievelijke
programma staat “programma reageert niet meer”.
Een watchdog laat toe om dit te detecteren. De watchdog werkt met een interne
oscillator van 1MHz. Dit kloksignaal wordt aan een deler toegevoegd (instelbaar als 16
tot 2048 deler via WDP0,1,2).
Wanneer de teller een overflow krijgt zal de controller automatisch worden gereset.
P. Dams - W. Andries
Elektronica en lab 3e graad IW 13
5.3 Interrupts
Deze interrupts en de reset hebben elk hun eigen vectoradres. Dit is het adres waar de
microcontroller onmiddellijk naar toe springt indien de overeenkomstige interrupt
optreedt. Op die plaats moet dan het programma staan dat de controller dan moet
uitvoeren.
Voor een volledig programma is er echter niet voldoende plaats. Daarom zal op de plaats
van het vectoradres enkel een spronginstructie staan naar de eigenlijke programmacode
die op dat moment moet uitgevoerd worden, d.i. de interrupt service routine.
Het gebruik van interrupts moet wordt aangegeven door verschillende vlaggen. Eerst en
vooral is er de general interrupt flag. Dit is een soort hoofdschakelaar die het gebruik
van interrupts toelaat of uitschakelt.
Daarnaast moet elke interrupt op zich ook nog eens worden geactiveerd. Dit gebeurt
door een aparte vlag per interrupt.
De prioriteit van de interrupts is afhankelijk van de plaats in het geheugen. Des te lager
de interrupt in het geheugen is gelegen, des te hoger de prioriteit. Dit wil dus zeggen dat
de reset de hoogste prioriteit heeft en de analoge comparator de laagste prioriteit.
P. Dams - W. Andries
Elektronica en lab 3e graad IW 14
Alle pinnen van de poorten hebben individuele pull-up weerstanden. Elke poortpin kan
20mA sinken en dus rechtstreeks een LED aansturen. (p.267 max stromen!) Wanneer de
pinnen als ingang fungeren en extern laag worden getrokken dan zullen de pinnen
stroom (sturen) sourcen indien de interne pull-ups zijn geactiveerd.
Wanneer PORTB wordt gelezen leest men het data register van poort B. Wanneer PINB
wordt gelezen leest men de niveaus aan de pinnen van poort B.
Hoe gebruikt men nu een pin PBx van poort B als algemene digitale I/O pin?
Wel de bit DDBx in het data direction register bepaalt de richting van de pin. Indien
DDBx één gemaakt is dan is PBx geconfigureerd als uitgang en als DDBx op nul staat is,
dan is PBx geschakeld als ingang en is de pull-up weerstand geactiveerd. Om de pull-up
weerstand uit te schakelen moet je dan PORTBx nul maken of de pin als uitgang
configureren.
Fig. 16: Algemene schakeling van een I/O pin (zonder alternatieve functie)
P. Dams - W. Andries
Elektronica en lab 3e graad IW 15
Naast het gebruik als gewone input of output hebben vele van deze pinnen een
alternatieve functie. Dit betekent dat deze pinnen ook gebruikt kunnen worden om een
speciale functie te dienen.
Ook de poorten C,D en E hebben alternatieve functies. Indien je meer wenst te weten
over het gebruik van een alternatieve functies kan je altijd de uitgebreide uitleg lezen in
de datasheets vanaf pag. 69
P. Dams - W. Andries
Elektronica en lab 3e graad IW 16
De uitgang van de comparator kan gelezen worden door de microcontroller. Het is ook
mogelijk om deze uitgang met een interrupt te verbinden. Het is zelfs mogelijk om met
deze uitgang de Timer/Counter1 input capture ingang te triggeren.
5.7 SPI
P. Dams - W. Andries
Elektronica en lab 3e graad IW 17
5.8 USART
Wanneer het frame verzonden is zal opnieuw een byte uit het data register genomen en
verzonden worden.
Het verschil tussen synchrone en asynchrone verzending van de data ligt in het al dan
niet gebruiken van een kloklijn. Via UMSEL bit in het UCSRC register kan gekozen worden
tussen beide types verzending.
Bij synchrone verzending wordt een kloklijn naar de ontvanger gestuurd. Via de flanken
op deze lijn kan de ontvanger weten wanneer een frame begint of stopt en wanneer een
nieuwe databit gelezen kan worden.
Bij asynchrone verzending wordt gebruik gemaakt van een interne klok. Zowel de zender
als de ontvanger moet weten welke de ingestelde snelheid is. Op basis hiervan worden
een aantal stalen genomen van de data lijn. Het aantal stalen is dan veel groter dan het
aantal bits.
P. Dams - W. Andries
Elektronica en lab 3e graad IW 18
De gebruiker kan kiezen voor één van deze modes via de SM (sleep mode) bits in de
controle registers van de CPU.
P. Dams - W. Andries