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.
Fig. 1:
De eerste microprocessor.
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 LEDs op een frontplaat. Een werkend model kostte toen rond de $2000.
Fig. 2:
De eerste microcomputer
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
In ditzelfde jaar (1975) bracht MOS-Technologies de 6502 microprocessor op de markt aan sterkt gereduceerde prijzen. $25 in plaats van $150 voor de Intel 8080. Het is de 6502 die later zal dienen als hart voor de APPLE II. APPLE werd gesticht door Steve Jobs en Steve Wozniak. Dit was de eerste echte personal computer. 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 autos, enz Deze microcomputers zitten als het ware ingebakken in toestellen die we dagdagelijks gebruiken, we spreken van embedded computers. Tegenwoordig zijn deze microcomputertjes zo klein dat ze in n IC zitten. We spreken dan van embedded controllers of microcontrollers. Het is over deze microcontrollers dat deze cursus handelt.
Fig. 3:
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 zr 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
2
2.1
Microcomputers
Blokschema van een microcomputer
Fig. 4:
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. En 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
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 verantwoordelijk voor het doorsturen van de gegevens (data) en de instructiecodes van het programma noemen we de databus. In het geval van microcontrollersystemen bedraagt de breedte van de databus meestal acht of zestien datalijnen. 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
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
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.
Fig. 5:
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).
Fig. 6:
P. Dams - W. Andries
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. 7:
Fig. 8:
De ALU
P. Dams - W. Andries
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. De operanden worden vanuit twee verschillende registers aan de ALU geboden en verwerkt. Het resultaat van de bewerking wordt in een speciaal register geplaatst die je de accumulator noemt. De uitgang heeft ook extra informatie zoals een carrybit, een zerobit en een overflowbit weer via 1-bit uitgangen die we vlaggen noemen. Deze vlaggen kan je als programmeur bekijken via het statusregister.
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 CPUs toegepast om sneller kettingebewerkingen te kunnen uitvoeren. (bvb.: A + B +C)
Fig. 9:
P. Dams - W. Andries
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.
3.1
Harvard geheugenstructuur.
In de Harvard geheugenstructuur zijn het datageheugen en het programmageheugen fysisch gescheiden van elkaar. Elk geheugen krijgt ook zijn eigen bussen. Dit zorgt ervoor dat : Data en instructies tezelfdertijd kunnen opgehaald worden. Harvard structuur vlugger werkt dan Von Neumann.
Fig. 10:
Harvard Geheugenstructuur.
3.2
Processores die deze voorzieningen niet hebben en het totale geheugenbereik geheugenplaatsen moeten verdelen over zowel data als programmageheugen werken volgens de Von Neumann geheugenstructuur. Het blokschema op figuur 4 is dus volgens het Von Neumann geheugenstructuur getekend.
Fig. 11:
10
De verwerking van een instructie in een Von Neumann architectuur is tijdens de bespreking van de CPU eigenlijk al aan bod gekomen. Je weet ook al dat een CPU cyclisch werkt. Dat wilde zeggen dat de CPU een instructie uit het geheugen haalt, die uitvoert, een nieuwe instructie uit het geheugen haalt, enz.. We vatten de verschillende fasen van n cyclus nog even kort samen:
Fig. 12:
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 de tweede stap geeft het programmageheugen de inhoud van het geadresseerde geheugenwoord af aan de CPU. De CPU bergt deze inhoud op in het instructieregister. 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. Enmaal 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. Deze manier van werken staat bekend als de Von Neumanncyclus. Johann Von Neumann was een Hongaars wiskundige die leefde van 1903 tot 1957. Hij creerde in de veertiger jaren een computer die volgens dit principe werkte.
P. Dams - W. Andries
11
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
Fig. 13:
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.
5.2
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. De bedoeling is dat je in je eigen programma de watchdog-teller zelf gaat resetten vooraleer hij een reset geeft aan de controller. Wanneer je eigen programma nu hangt zal de watchdog-teller niet worden gereset en na verloop van tijd (16ms tot 2048ms) een reset van de controller genereren. Deze controllerreset zal er voor zorgen dat je programma terug wordt opgestart.
Fig. 14:
De watchdog timer
P. Dams - W. Andries
13
5.3
Interrupts
De ATmega162 voorziet in 28 verschillende interrupts. Een interrupt is een gebeurtenis waarbij de microcontroller een speciaal programma moet uitvoeren. Dit stuk programma noem je de interrupt service routine. 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.
Fig. 15:
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
14
5.4
De I/O poorten.
De ATmega 162 heeft 5 bidirectionele I/O poorten (poorten A, B, C, D en E). De poorten A, B, C en D hebben 8 pinnen en poort E heeft er slechts 3. In totaal zij er dus 35 I/O lijnen. Elke poort heeft drie registers die er mee samenhangen: De port data register (R/W) : Dit register bevat de data die naar buiten moet gestuurd worden. De port data direction register (R/W) :Dit register en bepaalt of een pin als input of als output fungeert. De port input pins (R!) : Dit zijn de pinnen van de poort zelf. 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:
15
5.5
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.
Fig. 17:
Fig. 18:
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
16
5.6
De analoge comparator.
De analoge comparator vergelijkt de ingangsspanningen op de ingangen Ain0 ( alternatieve functie van PB2) en Ain1 (PB3). Indien de spanning op Ain0 hoger is dan deze op Ain1 dan zal de uitgang van de comparator AC0 geset worden. 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.
Fig. 19:
De analoge comparator
5.7
SPI
De Serial Peripheral Interface is een synchrone serile interface die in staat is om op hoge snelheid data te transfereren. Wij maken van deze interface gebruik om het programmageheugen te programmeren.
P. Dams - W. Andries
17
5.8
USART
USART is de afkorting van Universal Synchronous Asynchronous Receiver (RX) and Transmitter (TX). Het is een deel in de controller dat zorgt voor de synchrone of asynchrone serile communicatie. De ingebouwde UART heeft volgende eigenschappen: Full-duplex, Asynchrone of synchrone verzending, Baud rate generator 8 of 9 databits, 1 of 2 stopbits Overrun detectie Framing error detectie Afzonderlijke interrupts bij volledige ontvangst of verzending van een frame en bij een leeg zendregister. In principe is communicatie vrij eenvoudig. Je plaatst de te verzenden databyte in het UART data register (UDR). Deze byte wordt in een frame geplaatst en door het TX schuifregister automatisch verzonden.
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
18
5.9
Slaapmodes zorgen ervoor dat de gebruiker bepaalde ongebruikte delen van de microcontroller kan uitzetten om het vermogengebruik te beperken. De ATmega162 voorziet vijf slaapmodes: 1. Idle : SPI, USART, Comparator, Timer/counter, watchdog en interrupt logica werken nog. De CPU werkt niet. Via de interrupts kan de CPU weer ontwaken. 2. Power-down 3. Power-save 4. Standby 5. Extended-standby 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