1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
#include "mbed.h"
#include "Adafruit_SSD1306.h"
//Switch input definition
#define SW_PIN p22
//Sampling period for the switch oscillator (us)
#define SW_PERIOD 20000
//Display interface pin definitions
#define D_MOSI_PIN p5
#define D_CLK_PIN p7
#define D_DC_PIN p8
#define D_RST_PIN p9
#define D_CS_PIN p10
//an SPI sub-class that sets up format and clock speed
class SPIPreInit:public SPI {
public:
SPIPreInit(PinName mosi, PinName miso, PinName clk):SPI(mosi, miso, clk) {
format(8, 3);
frequency(2000000);
};
};
//Interrupt Service Routine prototypes (functions defined below)
void sedge();
void tout();
//Output for the alive LED
DigitalOut alive(LED1);
//External interrupt input from the switch oscillator
InterruptIn swin(SW_PIN);
//Switch sampling timer
Ticker swtimer;
//Registers for the switch counter, switch counter latch register and update flag
volatile uint16_t scounter = 0;
volatile uint16_t scount = 0;
volatile uint16_t update = 0;
//Initialise SPI instance for communication with the display
SPIPreInit gSpi(D_MOSI_PIN, NC, D_CLK_PIN); //MOSI,MISO,CLK
//Initialise display driver instance
Adafruit_SSD1306_Spi gOled1(gSpi, D_DC_PIN, D_RST_PIN, D_CS_PIN, 64, 128); //SPI,DC,RST,CS,Height,Width
int main()
{
//Initialisation
gOled1.setRotation(2); //Set display rotation
//Attach switch oscillator counter ISR to the switch input instance for a rising edge
swin.rise(&sedge);
//Attach switch sampling timer ISR to the timer instance with the required period
swtimer.attach_us(&tout, SW_PERIOD);
//Write some sample text
gOled1.printf("%ux%u OLED Display\r\n", gOled1.width(),
gOled1.height());
//Main loop
while (1) {
//Has the update flag been set?
if (update) {
//Clear the update flag
update = 0;
//Set text cursor
gOled1.setTextCursor(0, 0);
//Write the latest switch osciallor count
gOled1.printf("\n%05u ", scount);
//Copy the display buffer to the display
gOled1.display();
//Toggle the alive LED
alive = !alive;
}
}
}
//Interrupt Service Routine for rising edge on the switch oscillator input
void sedge()
{
//Increment the edge counter
scounter++;
}
//Interrupt Service Routine for the switch sampling timer
void tout()
{
//Read the edge counter into the output register
scount = scounter;
//Reset the edge counter
scounter = 0;
//Trigger a display update in the main loop
update = 1;
}
|