AVR microcontroller tutorial

Gepost door Bastiaan Steenbergen op maandag 28 juli 2003 21:23

Hardware

In dit hoofdstuk wordt de hardware toegelicht die van belang is. Aangezien C's zeer geavanceerde hardware bevatten is een uitgebreide uitleg nodig. De meest algemene zaken die van toepassing zijn op alle AVR types zullen hier worden besproken. Daarnaast zal ook nog wat extra info worden gegeven over wat meer specifieke hardware.
Zorg dat je altijd een datasheet bij de hand hebt als je gaat werken met C's. Stomweg zaken overnemen die je worden verteld is niet verstandig. Raadpleeg altijd de datasheet als het gaat om aansluitingen en voltageniveau’s.

Behuizing

C's bestaan er in vele soorten en maten. Vrijwel elke controller van Atmel is er in DIP en SMD uitvoering te verkrijgen, maar TQFP en PLCC komen ook veel voor.

Voeding

De voeding van een C geschiet op dezelfde wijze als bij elk ander IC, ze hebben een gnd en een positieve voedingsspanning nodig. De meeste types hebben +5v nodig, maar er bestaan ook varianten die op +3v draaien.
C's trekken zelden een constante stroom omdat ze namelijk veel schakelen, zowel intern als extern. Om te zorgen dat de voedingsspanning constant blijft is een condensator van 100nF dicht bij de voeding van de C aan te raden.

Heb je geen gestabiliseerde 5v dan kun je dit schema gebruiken om een spanning tussen de 18v en 7v om te zetten naar een mooie 5v voor de voeding.

Stabiele voedingStabiele voeding

Klok

Een C is een minicomputer. Hij bevat een rekencentrum en eromheen geheugens en andere hardwarecomponenten. Net zoals een PC loopt ook een C op een clocksignaal. Dit clocksignaal bepaalt de snelheid waarmee de controller kan werken. De meest voorkomende frequenties van de clock zijn: 1, 4, 8 en 16MHz. De meeste AVR controllers hebben een intern circuit wat die frequentie op kan wekken, men spreekt dan van een interne clock. Bevalt je die clocksnelheid niet dan kun je extern vaak ook nog een clock aansluiten door middel van een pulsgenerator of een kristal. Hieronder zie je een voorbeeld van hoe een kristal moet worden aangesloten. Raadpleeg de datasheet voor verdere gegevens en aansluitingen.

Kristal aansluitenKristal aansluiten

Reset

Net zoals je veel bij digitale IC’s aantreft zit er ook op een C een reset pin. Door deze pin te verbinden met de gnd kun je de controller resetten. Resetten wil zeggen dat alle interne variabelen hun beginwaarde krijgen en het programma vanaf het begin weer gaat starten. Deze mogelijkheid is vooral handig als de controller door programmabugs of externe signalen niet meer correct functioneerd of zelfs volledig is gestopt.
Door dus via een button de reset pin met de ground te verbinden kun je hiervan tijdens je applicatie gebruik maken.

ALU

Het hart van de controller is de ALU. Dit staat voor Arithmetic Logical Unit. Deze ALU kan logische berekeningen uitvoeren op maximaal twee binaire getallen. Zo kun je optellen, aftrekken, shiften, delen, vermenigvuldigen, AND, OR, XOR, enz.

De ALU is verbonden met 32 geheugengebieden, die registers heten. In de volgende paragraaf worden deze registers uitgelegd.

Registers

Elke AVR controller bezit een aantal geheugenplekken van 8 bits breed, die registers worden genoemd. 32 hiervan heten Special Purpose Registers (SFR), en elk van deze registers is direct met de ALU verbonden. Zowel met de 2 ingangen van de ALU als met de enkelvoudige uitgang ervan. Deze SFR’s hebben de naam Rx met op de plek van de x het nummer van het register. Dus je hebt de naam R1 tot en met R32. Om een SFR te gebruiken moet je hem aan spreken met zijn naam.

ALU & RegistersALU & Registers

Op het bovenstaande plaatje kun je dat duidelijk zien. Als er berekeningen moeten worden uitgevoerd dan gaan er (maximaal)2 getallen van 2 van de register de ALU in. Deze voert dan de gevraagde bewerking uit en spuugt die vervolgens aan de onderkant eruit. Via de 8-bits brede databus kan die uitkomst naar 1 van de 32 registers worden geschreven of ergens anders heengaan. Bijvoorbeeld een uitgangspoort, welke later aan bod komt en daarom nog niet op de tekening staat. Met deze 32 SFR’s werk je het meeste tijdens je programma. Vrijwel elke dataverplaatsing gaat via deze registers.

I/O registers

De rest van de registers, die gezamenlijk I/O registers worden genoemd, hebben elk hun eigen naam en vervullen aparte functies. Deze registers zijn er voor de hardware in de controller en bevatten instellingen en gegevens die nodig zijn voor de interne functies. Behalve een naam hebben deze registers ook een adres. Hier zal er eentje kort worden besproken zodat je weet wat het inhoud. Bij het hoofdstuk software word er veel dieper op ingegaan.
Het Status register, meestal afgekort tot SREG, is direct verbonden met de ALU zoals je kunt zien op het plaatje. Het bevat gegevens over de laatste berekening/bewerking die de ALU heeft uitgevoerd. Het werkt als volgt:
Dit SREG is 1 byte, dus 8 bits breed. Elk bitje in dit register heeft een eigen betekenis en een eigen naam. Zo bevat bitnummer 0, dus dat is de 1e vanaf rechts geteld, de betekenis van een wel of niet ontstane carry. De naam van dit bitje in het SREG is dus ook C als afkorting van Carry. Na elke bewerking die de ALU heeft uitgevoerd wordt dit bitje ge-update en hieraan kan men zien of de bewerking voor een carry heeft gezorgt. Is het ene getal in de ALU bijvoorbeeld binair gezien 1000.1111 en het andere getal 1111.0001 en de opdracht luid: 'tel op', dan komt er aan de uitgang van de ALU het getal 1000.0000. De 1 die er officieel voor hoort is natuurlijk te groot voor de 8 bits uitkomst dus komt er op de Carry plek in het SREG een 1 te staan welke eigenlijk zegt: JA, de bewerking heeft voor een carry gezorgt. Zou er nu een 0 staan dan betekent dit: NEE, er is geen carry.

Misschien is dit allemaal wat vreemd voor je er snap je het nog niet. Niet getreurt, het komt allemaal wel goed. Hieronder is een plaatje waar je ziet hoe het SREG eruit ziet, zodat je het wat beter kunt voorstellen.

Status Register (SREG)Status Register (SREG)

Hier zie je dus dat bitje 0 de C voorstelt. Zou de berekening/bewerking een carry veroorzaken dan komt er daar een 1 te staan, in het andere geval een 0.

RAM Geheugen

Een C bezit verschillende soorten geheugens. Hier is het RAM geheugen er eentje van. RAM geheugen is geheugen waarin data kan worden gelezen en geschreven. Deze waardes blijven alleen tijdens run-time aanwezig. Hiermee wordt bedoelt dat ze alleen hun waarde behouden zolang de C runt en dus een voedingsspanning heeft. Zodra deze spanning eraf gaat zijn de waardes die in het geheugen aanwezig zijn niet te voorspellen en dus volledig random.

Het RAM geheugen bestaat uit n grote kolom die is opgedeelt in allemaal rijen. Elke rij(geheugenplek) heeft zijn eigen adres en kan maximaal 8 bits aan data bevatten. Door middel van deze adressen kun je een stukje geheugen aanspreken en er wat in opslaan of vanaf halen. Je kunt dit dus gebruiken als tijdelijke opslag van getallen die maximaal 1 byte groot zijn, zoals tellerwaardes, uitkomsten, vergelijkingswaardes, enz.

Data Memory (RAM)Data Memory (RAM)

Alle registers zijn eigenlijk ook RAM plekken, zoals je kunt zien op bovenstaande plaatje. Dit is een afbeelding van het RAM geheugen van een AT90S2313 zoals het intern is geregelt. De adrestelling is altijd hexadecimaal. Het bovenste gedeelte van het geheugen bevat de 32 Special Function Registers zijn en de daaropvolgende de I/O registers, pas daarna komt het eigenlijk RAM gebied wat ze SRAM noemen.
Als je de 1e plek van het SRAM wilt gebruiken moet je dus adres $60 gebruiken. (let op, dit geldt voor de controller waar deze datasheet van is, elk type controller kan een andere memorygrootte hebben zodat het SRAM pas later of eerder begint)

ROM geheugen

Naast het handige RAM geheugen bezit de controller ook nog ROM geheugen. Dit is te vergelijken met je RAM alleen zijn de plekken niet 8 maar 16 bits breed en dit geheugen blijft zijn waardes altijd behouden, zelfs als de spanning wegvalt. In dit geheugen staat je zelfgeschreven programma. Een programma bestaat uit losse opdrachten die men instructies noemt. Elke instructie is 16 bits breed vandaar die breedte van dit geheugen.
Tijdens het flashen/programmeren van je C worden al die commando’s die je op de computer hebt geschreven in dit ROM neergezet.

Program counter

Zodra je de controller zijn voedingsspanning geeft begint die direct op plek 000h (van het ROM) de opdracht te lezen en uit te voeren. Zodra deze opdracht klaar is springt die naar adres 001h in het ROM en gaat die die opdracht lezen en uitvoeren, enz. enz. Telkens weer een stap verder in het geheugen. Om nou bij te houden waar die is gebleven is er een teller. Deze teller heet de Program Counter, dus de programma teller, logisch toch?! Vaak afgekort als PC.
Deze Program Counter is gewoon een teller die de waarde bevat van het ROM gebied dat de eerstvolgende uit te voeren instructie bevat. Deze counter zelf bevind zich in het I/O register gebied. Zodra de C wordt opgestart (door deze te resetten of door aan te sluiten op een spanning) wordt er 000h in de Program Counter gezet en begint de controller dus zijn 1e instructie op te halen van plek 000h. Nadat er een instructie is gelezen wordt de counter meteen met 1 verhoogt.
Om je nog even een totaal beeld te geven staat hieronder een samenvatting in de vorm van een plaatje

Geheugen indelingen en functiesGeheugen indelingen en functies

Inputs/Outputs

Behalve een ALU, RAM en ROM geheugen zit er nog veel meer in een C. Elk type bezit weer wat anders. Zo zijn er controllers die I2C, PWM, USART, Comparator, 8bit ADC, 10bit ADC, SPI en een Real Time Counter bevatten. Genoeg om wat leuks mee te doen dus. Daarnaast zijn er ook nog een aantal gewone I/O pinnen die je naar eigen wens kunt schakelen.
Elke functie heeft zijn eigen instellingen nodig en bezit daarom n of meerdere registers in het RAM geheugen. Door deze in te stellen kun je de functies gebruiken.

Na al deze theorie weet je grotendeels hoe de hardware in elkaar zit. Zoals je zelf hebt kunnen lezen is een C niet zomaar een klein zwart chipje, het bezit juist veel power en functies. Zelf blijf ik het onvoorstelbaar vinden dat het allemaal in zo’n klein ding past, prachtig gewoon.