
Starter firmware project for the Imperial College EEE SWITCH lab
Dependencies: Adafruit_GFX mbed
main.cpp
- Committer:
- estott
- Date:
- 2016-04-08
- Revision:
- 1:5aebe57872ed
- Parent:
- 0:775d3ce39c34
- Child:
- 2:a5b7373c4644
File content as of revision 1:5aebe57872ed:
#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, output register and update flag uint16_t scounter=0,scount=0,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 //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; }