Main voorbeeld#

Algemeen#

Het voorbeeld uit de onderstaande code doet de volgende dingen:

  • Het leest een i2c temperatuursensor uit en laat deze op de oled zien

  • Het laat een golvende sinus op de oled zien

  • het checkt voor RFID kaartjes en laat succes! of niets! zien op het oled

Opbouw#

De while(1) loop in de main functie wordt elke sysTick uitgevoerd. Na de uitvoer gaat de microcontroller weer slapen. De microcontroller wordt wakker gemaakt door de timerinterrupt (sysTick) welke nu staat ingesteld op 20 milliseconden. Door in de main-loop te kijken hoeveel ticks er voorbij zijn gekomen kun je bepaalde taken met een bepaalde frequentie uitvoeren. In het voorbeeld wordt de sinus elke 20ms uitgevoerd, de RFID wordt elke 100ms uitgelezen en de temperatuursensor wordt elke 1000ms uitgelezen. Deze opzet zorgt ervoor dat je nergens hoeft te wachten en je dus meerdere dingen makkelijk tegelijk kunt doen.

Zorg er wel voor dat je langzaamste taak altijd sneller uitvoert dan de sysTick (in dit voorbeeld 20ms). Als het uitlezen van de RFID bijvoorbeeld 100ms in beslag neemt dan worden alsnog alle taken vertraagd en werkt het systeem niet meer goed.

Broncode#

  1#include <msp430.h> 
  2#include <stdint.h>
  3#include <string.h>
  4#include <stdbool.h>
  5#include "lib/gpio.h"
  6#include "lib/i2c.h"
  7#include "lib/oled.h"
  8#include "lib/fonts.h"
  9#include "lib/temperatuur.h"
 10#include "lib/rfid.h"
 11#include "lib/spi.h"
 12
 13
 14/**
 15 * \mainpage MSP430G2553 Library
 16 *
 17 * Deze libary dient ter ondersteuning van het lesmateriaal bij
 18 * EMS10. De library is niet compleet maar voorziet in
 19 * de benodigde functionaliteiten voor het aansturen van de
 20 * meegeleverde OLED Display.
 21 *
 22 * Alle informatie is te vinden in bij de modules
 23 * - Er zijn functies om de GPIO in te stellen
 24 * - De i2c bus is beperkt geimplementeerd, alleen de master modus
 25 * - Het kloksysteem heeft een aantal functies
 26 * - En het belangrijkste, een aantal functionaliteiten van het display zijn ook geimplementeerd.
 27 *
 28 */
 29
 30//een pagebuffer van 2 rijen hoog. 
 31uint8_t pageBuffer[2][128] = {0};
 32
 33const uint8_t sine[] =
 34{
 35 0x7,0x8,0xa,0xb,0xc,0xd,0xd,0xe,
 36 0xe,0xe,0xd,0xd,0xc,0xb,0xa,0x8,
 37 0x7,0x6,0x4,0x3,0x2,0x1,0x1,0x0,
 38 0x0,0x0,0x1,0x1,0x2,0x3,0x4,0x6,
 39};
 40
 41#pragma vector = TIMER0_A1_VECTOR
 42__interrupt void sysTick(void){
 43    TA0CTL &= ~TAIFG;
 44
 45    //nu main loop 1 maal uitvoeren voor we weer gaan slapen
 46    //tot de volgende timer interrupt
 47    __low_power_mode_off_on_exit();
 48}
 49
 50void timerInit(){
 51    TA0CTL = TASSEL_2 | ID_3 | MC_1 | TAIE;
 52    // 16MHz/8 clock, 2000->1ms ticks (0...19999) -> 50Hz/20ms interrupt
 53    TA0CCR0 = 39999;
 54}
 55
 56void printSinus()
 57{
 58    static uint8_t n=0;
 59    uint8_t kolom;
 60
 61    n++;
 62    n=n%32;
 63
 64    for(kolom=0; kolom<128;kolom++)
 65    {
 66        oledSetBufferPixel(pageBuffer, kolom,sine[(kolom+n+1)%32]);
 67        oledClearBufferPixel(pageBuffer, kolom,sine[(kolom+n)%32]);
 68    }
 69    oledWriteBuffer(pageBuffer, 3,2);
 70}
 71
 72//Dit stukje code leest een i2c temperatuur
 73//sensor uit.
 74//zie https://www.farnell.com/datasheets/2794261.pdf
 75void printTemperatuur()
 76{
 77    char temp[6];
 78    int16_t t;
 79    uint8_t data[2];
 80
 81    //selecteer register 0 en ontvang de 2 bytes
 82    //i2cReceiveFromRegister(0x48, 0x00, 2, data);
 83    i2cReceiveBytes(0x48, 2, data);
 84
 85    //samenvoegen
 86    t=(data[1] <<8|data[0]);
 87    //12 bit dus verschuiven
 88    t >>= 4;
 89    //0.0625 graden per bit
 90    itoa((int)(t*0.625),temp);
 91
 92    oledClearBox(70, 1, 100, 1);
 93    oledPrint(70,1, temp, small);
 94}
 95
 96bool isAantalTicks(uint16_t teller, uint16_t ticks)
 97{
 98    return (teller%ticks)==0;
 99}
100
101void main(void) {
102    WDTCTL = WDTPW | WDTHOLD;	// Stop watchdog timer
103
104    DCOCTL = 0;
105    BCSCTL1 = CALBC1_16MHZ; // Set range
106    DCOCTL = CALDCO_16MHZ;  // Set DCO step + modulation */
107
108
109    i2cInitialize(MASTER);
110    spiInitialize(0);
111    rfidInitialize(BIT3,BIT0);
112
113    oledInitialize();
114    oledSetOrientation(FLIPPED);
115    oledClearScreen();
116    oledPrint(20,1, "Temp: ", small);
117    oledPrint(40,6, "sin(w*t)", small);
118
119
120    timerInit();
121    __enable_interrupt();
122
123    uint16_t tijd=0;
124    while(1){
125
126
127        if (isAantalTicks(tijd, 1)) //20ms
128        {
129            printSinus();
130        }
131
132        if (isAantalTicks(tijd, 5)) //100ms
133        {
134            int8_t ret=0;
135            uint8_t blok[18];
136            ret = rfidGetBlok(10, blok);
137            oledClearBox(40, 2, 40+7*5, 2);
138            if (ret >= 0)
139            {
140                oledPrint(40,2, "Succes!", small);
141            }else{
142                oledPrint(40,2, "Niets..", small);
143            }
144
145
146        }
147
148        if (isAantalTicks(tijd, 50)) //1s
149        {
150            printTemperatuur();
151        }
152
153        tijd++;
154        tijd%=50; //reset bij max.
155
156        //Nu gaan slapen. Timer loopt door.
157        __low_power_mode_1();
158
159	}
160
161}