PIC microcontroller tutorial

Gepost door Bastiaan Steenbergen op donderdag 4 december 2003

Hardware

De microcontroller die we gaan gebruiken is een geavanceerd stukje hardware, en behoort met externe componenten te worden ingesteld. Hieronder zullen we de diverse belangrijke hardware bespreken die de PIC nodig heeft. Ook zullen we de interne hardware bespreken die aanwezig is in de PIC. Om zelf ook makkelijk straks je weg te vinden bij andere merken of types van µC's is het aan te raden de datasheet erbij te pakken en tegelijk dingen op te zoeken als ik die vermeld. Hier kun je die downloaden.

Voeding

Om te beginnen de voeding. De µC heeft een gelijkspanning nodig tussen de 2v en de 5,5v. Het is het meest handigst om te kiezen voor een voedingsspanning van 5v. Aangezien de eventuele digitale ic's die je eraan wilt koppelen ook op die spanning werken en omdat het niveau van de logische 1 een 5 volt signaal is. Het enigste wat er moet gebeuren is op de pin 5 de ground aan te sluiten en pin 14 de voedingsspanning.

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 loopt net zoals je pc op een bepaalde frequentie. Dit heet de klokfrequentie. Alle bewerkingen van de µC lopen op dat signaal. Om het juiste clocksignaal aan te bieden kun je een oscillator aansluiten zoals te zien is in de onderstaande afbeelding. Intern wordt de frequentie van de clk door 4 gedeelt en de uitkomst daarvan is de snelheid waarmee instructies worden uitgevoerd. De reden hiervoor is dat de interne processor een instructie eerst moet ophalen en decoderen voordat deze het daadwerkelijk kan gaan uitvoeren. Zou je dus een externe clock van 4MHz aansluiten dan worden de instructies uitgevoerd met 1MHz, en dat is dus 1 instructie per 1µs. Hieronder zie je hoe een externe clock (kristal) wordt aangesloten.

Aansluiting clockAansluiting clock

Ook heb je de mogelijkheid de clock in de vorm van een RC-schakeling aan te bieden. In de datasheet kun je meer informatie vinden over de waarde van de condensatoren, en hoe het zit met de waarde van het kristal.

Reset

Een µC heeft de mogelijkheid om te worden gereset via de MCLR pin. Dit is vooral handig als de controller niet meer goed reageert of volledig is gestopt met zijn werkzaamheden. Door te resetten komt de µC in zijn beginstand en begint weer het geprogrammeerde programma vanaf het begin uit te voeren. Ook worden alle instellingen van de controller weer in de default waarde gezet. De pin MCLR werkt net iets anders dan je misschien bent gewend. Het is namelijk een 'Active low' pin. Dat betekent dat je de chip reset als je een 0 op de pin zet (bij de meeste normale digitale logica gebeurt er iets zodra je er een 1 op zet). Wil je dat de controller normaal zijn werk doet dan moet je dus zorgen dat die pin altijd een 1 krijgt. In de datasheet is een 'Active low' pin aangegeven met een lijn boven de naam van de pin. Hieronder zie je een schema met daarin hoe je de MCLR moet aansluiten om de chip gewoon zijn werk te kunnen laten uitvoeren.

ResetReset

Er wordt een 1 op die pin gezet door de voeding er gewoonweg op te zetten. Wel is er een weerstand van 10k tussen gezet om de stroom die de chip binnen gaat te beperken. Je kunt ook nog kiezen om een schakelaar toe te voegen zodat je de µC makkelijk kunt resetten. Door middel van deze schakelaar wordt de reset pin laaggetrokken naar GND, en zal de controller dus in de reset komen. Zie onderstaande tekening.

Reset met knopReset met knop

Instructies

Zonder software doet de µC natuurlijk niets. Er moet een stukje software worden geschreven dat vervolgens naar de chip kan worden overgebracht. De chip bevat daarvoor een stuk Flash geheugen dat volgens de fabrikant zo'n 10.000x kan worden gelezen/geschreven. In dit geheugen komt je programma te staan. Zodra de voeding eraf is wordt dit geheugen niet gewist en blijft je programma bewaart. Er is ruimte aanwezig voor 1024 regels code.
Het schrijven van het programma gebeurt op de computer door middel van een taal genaamd 'assembler'. Deze taal werkt door middel van commando's die we 'instructies' noemen in het microprocessor jargon. Deze µC bevat een RISC processor wat inhoudt dat deze weinig instructies kent. Zeer gemakkelijk dus voor de beginner, omdat deze maar weinig instructies hoeft te kennen. Er zijn er in totaal 35 verschillende, met elk hun eigen functionaliteit. In het hoofdstuk "Software" gaan we verder in op het schrijven van een applicatie door middel van instructies.

Registers/Geheugen

Als je kijkt naar de datasheet op pag. 3 Fig 1-1 dan zie je hoe de chip intern is georganiseerd. In het midden is een blokje ALU te vinden. Dit staat voor Arithmetic Logic Unit en is het eigenlijke rekenwonder in de µC. Deze ALU kan berekeningen uitvoeren. Om dat te doen moet er data naar deze unit worden getransporteerd. Dit gebeurt door gebruik te maken van een stuk geheugen dat is gekoppeld aan de ALU. Deze geheugens heten registers. Deze controller heeft maar één register van 8 bits breed, wat de fabrikant het werkregister noemt. Het heeft de afkorting "W" gekregen. Microcontrollers van een ander type of fabrikant kunnen er meer hebben, en soms ook nog eens een andere breedte hebben. Om een voorbeeld te geven: de Motorola 68000 heeft wel 16 registers van 32 bits breed maar dat is ook een heel wat complexere dan onze PIC. Het W register dienen we te gebruiken bij de verplaatsing van data naar de ALU en weer terug, en voor de verplaatsing tussen data-geheugens onderling.
De ALU voert de berekeningen uit maar dat is niet genoeg. Die data moet wel kunnen worden opgeslagen anders heb je er weinig aan. Zo is er op de chip 68 bytes data RAM aanwezig om onder andere waardes van variabelen en constanten in te kunnen bewaren. Deze µC heeft ook nog 11 RAM locaties die niet voor de gebruiker vrij zijn te gebruiken. Het zijn de SFR (Special Function Registers). Deze worden gebruikt om instellen van bv poorten en interrupts in op de slaan. Zie de datasheet pagina 7 voor deze speciale registers.
Hieronder zie je een "plattegrond" van het RAM geheugen. Hier kun je zien dat de nummering compleet hexadecimaal gaat. Door de h achter het getal geef je duidelijk aan dat het om een hex waarde gaat.

Indeling RAMIndeling RAM

Je kunt hier zien dat het gebied is opgesplitst in verschillende delen. Het geheugen bestaat uit 2 banken. Bank 0 en Bank 1. Nu zit het geheugen dat vrij te gebruiken is op adres 0Ch tot 4Fh, dit is 68bytes. De 1e 11 zijn voor de speciale instellingen gereserveerd, en kun je dus niet zelf zomaar als geheugenplek gebruiken, omdat ze een speciaal doen hebben gekregen.

I/O en Poorten

Een µC heeft verschillende in- en uitgangen. Je kunt deze gebruiken als I/O. Zo kun je er van alles op aansluiten om er wat mee te besturen of te meten. Meestal zijn er een reeks pinnen die bij elkaar horen. Deze reeks of verzameling van pinnen heten een "poort". Zo heeft onze µC twee poorten. Poort A en poort B. Poort A bestaat uit 5 pinnen, en poort B bevat er 8. Als we kijken naar de datasheet (pag. 1) dan zien we dat Poort A zit op de pinnen, 1, 2, 3, 17 en 18. De pinnen van poort B zitten op de pinnummers 6, 7, 8, 9, 10, 11, 12, 13.

PinoutPinout

Het is natuurlijk allemaal digitaal, dus kan een pin maar 2 toestanden hebben, een 1 of een 0. Voordat je de poorten kunt gebruiken moet je ze eerst instellen, namelijk of het in- of uitgangen zijn. Bijna elke pin kun je apart in- of uitgang maken. Je geeft dat aan bij de µC door in een stukje geheugen bits neer te zetten. Elke plek in dat geheugen vertegenwoordigt een I/O pin en daar kun je een 1 of 0 inzetten. Hieronder staat een stukje uit de datasheet.

Instellen van in- en uitgangenInstellen van in- en uitgangen

Hier zie je dat op adres 85h het "data direction register" zit van poort A. Omdat poort A maar 5 pinnen heeft kun je alleen bit 0 t/m bit 4 instellen. De rest is toch niet van belang.
Een 0 betekent dat de pin een uitgang is. Als je er een 1 in zet dan stel je die pin in als ingang. In de kolom "Value on Power-on RESET" kun je vinden wat de waardes zijn bij de default waarde na een reset. Zo zie je dat alle I/O pinnen ingangen zijn zodra de µC wordt gereset.

Om het nog even extra toe te lichten een klein voorbeeld.
Stel: je wilt dat van poort B de pinnen RB0, RB1, RB4 en RB7 uitgangen zijn en de rest ingangen. Je moet er dus met een commando voor zorgen dat de binaire waarde 01101100 op adres 86h komt te staan. Zo staan op de plekken die die pinnen vertegenwoordigen 0'en zodat ze uitgangen zijn, en 1'en op de plekken van de pinnen die ingangen dienen te zijn.