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}