Kennismaking: flikkerende ledjes
In deze tutorial maak je voor het eerst kennis met het Dwengo-bord. Stap voor stap leer je hoe je de programmeeromgeving en de compiler moet installeren, hoe je de dwengo-programmer aansluit en hoe je uiteindelijk je eerste programma op het Dwengo-bord zet en uitvoert.
Benodigdheden
- Een Dwengo-experimenteerbord
- Een Dwengo-programmer
- De bijbehorende USB-kabel
- Internetverbinding
Installeren van de software
Je begint met het in orde brengen van de programmeer-omgeving. Daarvoor moet je de gratis Microchip MPLAB IDE downloaden
en installeren. Wij gebruikten voor deze tutorial versie 8.33. Daarin zit ook het pakket HI-TECH C Pro, maar dat hebben we niet nodig.
Vervolgens download en installeer je ook de C18-compiler
. Hiervoor is het nodig je te registreren op de website van Microchip. De gratis evaluatieversie van de C18-compiler bevat alle functionaliteit die we nodig hebben. De betalende versie bevat ook code-optimalisaties maar die zijn niet nodig om het Dwengo-bord te kunnen gebruiken.
Bij de installatie van de C18-compiler kan je aangeven dat je MPLAB IDE gebruikt. Dat zorgt ervoor dat de C18-compiler onmiddellijk herkend wordt bij het opstarten van MPLAB IDE.
Jouw eerste project
Stap 1: aanmaken van het project
We gaan nu een project aanmaken waarmee je de LEDs van het Dwengo-bord kan aansturen. Start daarvoor eerst MPLAB IDE op. Open vervolgens de Project Wizard in het menu Project. Klik op Next en selecteer het juiste Device: PIC18F4550.

Klik nogmaals op Next en selecteer de C18 Toolsuite. Controleer of de locatie naar de C18-compiler juist is aangegeven en corrigeer waar nodig.

Klik nogmaals op Next en geef een naam (bijv. BlinkingLeds) en locatie op voor je nieuwe project. Klik een laatste keer op Next en dan op Finish, je eerste project is nu aangemaakt. Merk op dat we stap 4, Add existing files to your project, overslaan.
Stap 2: schrijven van de code
De volgende stap is het aanmaken van een nieuw C-code bestand. Dit doe je door in het menu Project te kiezen voor Add New File to Project. Kies een naam voor je nieuwe bestand en zorg dat het nieuwe bestand de extensie .c meekrijgt (bijv. BlinkingLeds.c), je zal immers C18-code schrijven.
Dit bestand wordt automatisch toegevoegd aan de Source Files van het project. Een overzicht van de toegevoegde bestanden kan je zien door het aanvinken van Project in het menu View.
Je kan nu C18-code schrijven in het net aangemaakte code-bestand. Het eenvoudige programma dat we gaan schrijven bestaat uit vier delen:
- Toevoegen van de bibliotheekbestanden die je wenst te gebruiken, de zogenaamde header-bestanden
- Configureren van de microcontroller door het instellen van de fuses
- Het definiëren van macro's die de code leesbaarder maken
- De eigenlijke code in de hoofdlus: de main-functie
We hebben slechts twee bibliotheken nodig om de LEDs op het Dwengo-bord te doen flikkeren. Een eerste bibliotheek, p18f4550.h, bevat de nodige functies om de registers van de microcontroller aan te spreken. De tweede bibliotheek, delays.h, bevat de functies die we zullen nodig hebben om het programma een aantal cycli te laten wachten. Op die manier zullen we de knippersnelheid kunnen regelen. De bibliotheken kan je invoegen door middel van volgende code:
#include <p18f4550.h> #include <delays.h>
Vervolgens moet je de microcontroller goed configureren. Dit doe je door de zogenaamde fuses correct in te stellen. Een set van standaard fuses, goed voor de meeste toepassingen, is hier weergegeven met commentaar (voorafgegaan door een dubbele slash):
// Fuses configuration #pragma config PLLDIV = 5 // Divide by 5 (20 MHz oscillator input) #pragma config FOSC = HSPLL_HS // HS oscillator, PLL enabled, HS used by USB #pragma config IESO = OFF // Oscillator Switchover mode disabled #pragma config PWRT = OFF // PWRT disabled #pragma config BOR = OFF // Brown-out Reset enabled in hardware only (SBOREN is disabled) #pragma config WDT = OFF // HW Disabled - SW Controlled #pragma config WDTPS = 32768 // 1:32768 #pragma config MCLRE = ON // MCLR pin enabled; RE3 input pin disabled #pragma config LVP = OFF // Disable low-voltage programming #pragma config CCP2MX = ON // Config3h #pragma config PBADEN = OFF // PORB digital IO on powerup
Sommige van deze fuses kan je aanpassen. Andere worden bepaald door de eigenschappen van het Dwengo-bord (zoals de frequentie van de kristaloscillator) en zullen dezelfde zijn voor al je projecten die je met het Dwengo-bord maakt. Meer informatie over de betekenis van de verschillende fuses kan je vinden in het document Veelgebruikte configuratiebits van het Dwengo-bord.
De programmeertaal C laat toe een aantal zaken op voorhand te definiëren door middel van macro's waardoor de code aanzienlijk leesbaarder wordt. Zeker voor grotere projecten zal je merken dat dit belangrijk is. Voor dit project definiëren we de macro TRUE als 1 zodat deze later in de hoofdlus gebruikt kan worden. Tijdens het compileren van het project zal de compiler dan automatisch overal waar er TRUE staat in onze code vervangen door de waarde 1.
#define TRUE 1
Je bent nu toegekomen tot het schrijven van de main-functie van het programma:
void main(void) { TRISD = 0x00; // Configure PORTD-pins as outputs while (TRUE) { PORTD = 0b11111111; // LED0-7 on Delay10KTCYx(240); // TCx = 83.333ns, 1 ms = 12000 TCx, 200 ms = 2400 KTCx PORTD = 0b00000000; // LED0-7 off Delay10KTCYx(240); } }
Telkens wanneer de microcontroller aangeschakeld wordt, zal de main-functie worden opgeroepen. Deze functie wordt sequentieel uitgevoerd, d.w.z. regel voor regel, net zoals in elke klassieke programmeertaal (bijv. Java, C, C++, Basic, ...). In tegenstelling tot wat gebeurt in klassieke programmeeromgevingen, willen we niet dat het programma eindigt: de microcontroller moet zijn functie blijven uitvoeren totdat de stroom uitgeschakeld wordt. Daarom zorgen we ervoor dat de hoofdlus voortdurend herhaald wordt. Dit gebeurt met de while (TRUE) opdracht. De main-functie kan dus opgesplitst worden in twee componenten. Lijn 2 doet de iniitalizatie, deze gebeurt slechts éénmaal, na het aanschakelen. Lijnen 4-7 vormen de hoofdlus, deze wordt – eens de initializatie voltooid is – continu uitgevoerd. Deze structuur is typisch voor alle embedded programma's.
Op het schema van het Dwengo-bord kan je zien dat de 8 LEDs verbonden zijn met de pin RD0 tot en met pin RD7. Al deze pinnen kan je aanspreken met het PORTD register, elk van de bits in dit 8-bit register komt overeen met één pin. Voordat je een pin kan gebruiken als uitgang moet je deze als dusdanig configureren. Dit gebeurt met behulp van een TRIS-register: als je hier een 1 schrijft naar een bit zal de corresponderende pin zijn uitgang laten zweven, en dus geen 0 of 1 waarde forceren. De pin kan dan als ingang gebruikt worden. Aangezien we alle 8 de RD-pinnen als uitgang wensen te gebruiken zetten we het volledige TRISD-register op 0. Vervolgens maken we een oneindige lus aan waarin we steeds volgende acties doorlopen:
- een 1 schrijven naar alle 8 RD-pinnen door PORTD als dusdanig te configureren, hierdoor worden alle 8 de LEDs aangeschakeld
- 200 ms wachten
- een 0 te schrijven naar alle 8 RD-pinnen door PORTD als dusdanig te configureren waardoor alle LEDs uitgeschakeld worden
- 200 ms wachten
De wachttijd wordt geregeld met behulp van de functie Delay10KTCYx in de Delays.h-bibliotheek. De klok is ingesteld op 48 MHz door middel van de fuses. Iedere instructiecyclus neemt 4 klokcycli in beslag, deze tijd wordt ook aangeduid met TCYx. Concreet is dus TCYx gelijk aan 1/12000000 is gelijk aan 83.333 ns. Eén ms neemt dus 12000 TCYx en 200 ms duurt neemt dus 2400 KTCYx in beslag.
Wie het Dwengo-bord gekocht heeft, kan het volledige programma downloaden in de bijlage. Hiervoor moet je ingelogd zijn.
Stap 3: compileren van het programma
Nu je de eerste regels code geschreven hebt voor het Dwengo-bord wil je dat testen. Daarvoor moet je de code eerst omvormen naar binaire code die door de microcontroller uitgevoerd kan worden. Dit proces noemt men compileren. Het proces vereist dat je een linker-script toevoegt aan het project. Dit doe je door in het menu Project te kiezen voor Add Files to Project en vervolgens te navigeren naar de locatie waar de bestanden voor de Microchip C18-compiler geïnstalleerd staan (gewoonlijk onder het pad C:\MCC18). In de map C:\MCC18\bin\LKR vind je het bestand 18f4550_g.lkr dat je moet toevoegen aan het project.

Als het goed is, wordt dit linker-script nu vermeld onder Linker Scripts. Je kan nu je project compileren door in het menu Project te kiezen voor Build All. Wanneer het compileren succesvol is verschijnt er Build Succeeded op het scherm.
Als je één van de stappen niet goed uitvoerde zal er verschijnen Build Failed. Je moet dan uitzoeken wat er fout ging. Voor eenvoudige programma's zoals dit is de meest voorkomende fout een typefout. Mocht je zeker zijn dat je de voorgaande stappen allemaal goed doorlopen hebt (geen typefouten, linker-script goed toegevoegd) en je krijgt steeds volgende fout:
Error - could not find file 'c018i.o'
dan kan het zijn dat MPLAB IDE de C18-bibliotheek en linker-bestanden niet goed kan vinden. Dit kan je oplossen als volgt:
- Navigeer in het menu Project naar Build Options
- Selecteer Directories
- Kies in Show directories for voor Include Search Path
- Klik op New en geef het pad naar de h map op van de C18-bibliotheek, gewoonlijk is dit C:\MCC18\h
- Kies vervolgens in Show directories for voor Library Search Path
- Klik op New en geef het pad naar de lib map op, gewoonlijk is dit C:\MCC18\lib (zie figuur)
- Kies tenslotte in Show directories for voor Linker-Script Search Path
- Klik op New en geef het pad naar de lkr map op, gewoonlijk is dit C:\MCC18\bin\LKR
- Klik op Apply en dan op OK
Probeer nu het project opnieuw te compileren, normaal gezien zou alles in orde moeten zijn.
Stap 4: programmeren en testen van het programma
Je bent nu klaar om het programma op het Dwengo-bord te programmeren. Dit doe je door middel van de Dwengo-programmer. Sluit hiervoor de programmer aan op de computer met de USB-kabel. Sluit vervolgens de programmer aan op het Dwengo-bord. Let hierbij op dat de programmer correct wordt aangesloten (zie figuur)!

Kies in het menu Programmer onder Select Programmer voor de PICkit2. Als je de programmer en het Dwengo-bord goed hebt aangesloten verschijnt er op het scherm nu PICkit 2 Ready, bovendien zal de Power-LED branden op het Dwengo-bord om aan te geven dat het bord onder spanning staat.
Om het bord te programmeren kies je nu in het menu Programmer voor Program. Even later is het bord geprogrammeerd. Om het te testen kan je nu via MPLAB het bord resetten, kies daarvoor in het menu Programmer voor Hold in Reset en daarna kies je voor Release from Reset. Je kan nu alle 8 de LEDs zien flikkeren op het Dwengo-bord.
Stap 5: loskoppelen, code bijwerken, verder experimenteren
Nu het Dwengo-experimenteerbord geprogrammeerd is, kan je de programmer loskoppelen van het bord. Je zal merken dat de LEDs ophouden met flikkeren. Het experimenteerbord krijgt nu immers geen stroom meer. Koppel het bord rechtstreeks aan de computer met de USB-kabel. De LEDs zullen opnieuw beginnen te flikkeren.
Je hebt de eerste tutorial met succes afgerond. Je kan nu zelf verder experimenteren.
Probeer misschien eens de snelheid van het knipperen aan te passen. Als je de code hebt aangepast, kan je ze opnieuw compileren (Build All) en programmeren. Voor die laatste stap moet uiteraard de programmer opnieuw aangesloten worden. Nadat die fysisch aangesloten is, moet je in MPLAB in het menu Programmer kiezen voor Connect. Pas daarna verschijnt er op het scherm nu PICkit 2 Ready.

Uw winkelwagen
