Starter firmware project for the Imperial College EEE SWITCH lab

Dependencies:   Adafruit_GFX mbed

main.cpp

Committer:
estott
Date:
2016-04-19
Revision:
2:a5b7373c4644
Parent:
1:5aebe57872ed

File content as of revision 2:a5b7373c4644:

#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;
}