Programmeren van een looplicht

In deze tutorial breiden we de flikkerende LEDs uit tot een heus LED-looplicht. Een aantal concepten van de programmeertaal C worden toegepast. Het project biedt tevens de gelegenheid om de zaken uit de vorige tutorial te herhalen.



Benodigdheden

  1. Een Dwengo-bord
  2. Een Dwengo-programmer
  3. De bijbehorende USB-kabel

Een LED-looplicht

We beginnen het programma met het toevoegen van de nodige bibliotheken:

  1. #include <dwengoConfig.h>
  2. #include <dwengoBoard.h>
  3. #include <dwengoDelay.h>

Hierbij bevat de header dwengoConfig.h en dwengoBoard.h de nodige basisfuncties en instellingen voor het Dwengo-bord terwijl de header dwengoDelay.h de nodige functies bevat om een programma gedurende een bepaalde tijd te laten wachten. Vervolgens maken we de hoofdlus aan. Deze bevat de eigenlijke logica van het programma:

  1. void main(void) {
  2. unsigned char i;
  3. initBoard();
  4. LEDS = 0b00000001;
  5. while (TRUE) {
  6. for (i=0; i<7; i++) {
  7. LEDS <<= 1; // Rotate to the right
  8. delay_ms(50);
  9. }
  10. for (i=0; i<7; i++) {
  11. LEDS >>= 1; // Rotate to the left
  12. delay_ms(50);
  13. }
  14. }
  15. }

We beginnen met het declareren van de variabele i dat we in het programma als teller zullen gebruiken. Als datatype kiezen we voor een unsigned char. Dat is de kleinst mogelijke variabele in onze processor. We kunnen er alle getallen van 0 tot en met 255 opslaan. In dit voorbeeld moet i enkel van 0 tot en met 6 tellen, dus dat volstaat.

Vervolgens roepen we de functie initBoard() op welke de pinnen voor de LEDs zal instellen als digitale uitgangen. De functie zet bovendien nog andere basisfunctionaliteit van het bord goed zoals bijvoorbeeld het LCD-scherm maar dit is nu nog niet van belang.

Vervolgens initialiseren we LEDS op 0b00000001 wat ervoor zorgt dat LED0 op het Dwengo-bord zal oplichten. We hebben hiervoor gebruik gemaakt van de binaire notatie waardoor de interpretatie gelijk is als deze van de LEDS op het Dwengo-bord zelf. Je kan evenwel een andere notatie gebruiken zoals de decimale notatie door LEDS op 1 te zetten of de hexadecimale door 0x01 te gebruiken.

Daarna maken we met behulp van de while(TRUE)-constructie een oneindige lus aan. De code die binnen deze lus staat zal herhaald worden totdat de stroom van het bord wegvalt.

De oneidige lus bevat twee for-lussen. De code binnen deze twee lussen wordt 7 maal uitgevoerd —van i=0 tot en met i=6— alvorens naar de volgende lus te springen. In de eerste lus wordt de inhoud van LEDS 1 bit naar links opgeschoven met behulp van de binaire schuifoperatie: <<. In de plaats die vrijkomt, helemaal rechts in de bitrij, wordt een 0 ingeschoven. Dit komt wiskundig neer op een vermenigvuldiging met 2. Vervolgens wordt er door middel van de functie-oproep delay_ms(50) 50 ms gewacht alvorens terug 1 bit naar links op te schuiven.

In de tweede lus wordt het omgekeerde gedaan als in de eerste lus en wordt de inhoud van LEDS telkens 1 bit naar rechts opgeschoven. Dit komt overeen met een deling door 2. Wat zich zal uiten op het bord dat de LEDs van rechts naar links verlopen (van LED7 naar LED0).

Doordat de twee for-lussen herhaaldelijk achtereen uitgevoerd worden, lijkt het alsof de LEDs heen en weer lopen zoals op het filmpje te zien is.

BroncodeBronbestanden zijn enkel toegankelijk voor geregistreerde gebruikers. Als je al een account hebt op de Dwengo site, gelieve dan in te loggen, anders kan je je eerst registreren.