Nicholas Outram
/
Task525Solution
Task 5.2.5 Solution
Diff: main.cpp
- Revision:
- 0:3506f73fe611
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Sep 24 12:32:09 2015 +0000 @@ -0,0 +1,97 @@ +#include "mbed.h" + +//Global PWM object +PwmOut pwmRed(D7); + +InterruptIn SWOn(D4); //Fade ON +InterruptIn SWOff(D3); //Fade OFF + +int T = 100; //100uS +volatile int Tmark = 0; //0us +volatile int delta = 1; //1us + +//Timer +Ticker t; + +//Function prototype +void doTwinkle(); +void doSwitchON(); +void doSwitchOFF(); + +//Flags +volatile int switchONFlag=0; +volatile int switchOFFFlag=0; +volatile int tickerFlag = 0; + +int main() { + //Setup switch interrupts + SWOn.rise(doSwitchON); + SWOff.rise(doSwitchOFF); + + //Initial PWM state + pwmRed.period_us(T); + pwmRed.pulsewidth_us(Tmark); + + + printf("Ready\n"); + + while(1) { + sleep(); + + //Which interrupt occured? + if (switchONFlag == 1) { + switchONFlag = 0; + delta = 5; + t.attach(doTwinkle, 0.1); + printf("ON button pressed\n"); + } + else if (switchOFFFlag == 1) { + switchOFFFlag = 0; + delta = -5; + t.attach(doTwinkle, 0.1); + printf("OFF button pressed\n"); + } + + //Has ticker hit the end stop? + if (tickerFlag == 1) { + tickerFlag = 0; + delta = 0; //Pedantic + t.detach(); //Turn off ticker + printf("Timer finished\n"); + } + //Update PWM + pwmRed.pulsewidth_us(Tmark); + + printf("Tmark = %d\n", Tmark); //Debug + } +} + +void doSwitchON() +{ + switchONFlag=1; +} + +void doSwitchOFF() +{ + switchOFFFlag=1; +} + +//ISR for Timer +void doTwinkle() +{ + //Add on delta + Tmark += delta; + + //Cap at extremes + if (Tmark > 100) { + Tmark = 100; + } + else if (Tmark < 0) { + Tmark = 0; + } + + //Check bounds + if ((Tmark == 100) || (Tmark == 0)) { + tickerFlag = 1; + } +} \ No newline at end of file