RTOS homework 4

Dependencies:   C12832_lcd mbed

Committer:
gatedClock
Date:
Fri Sep 13 04:16:05 2013 +0000
Revision:
26:986b539170fc
Parent:
25:fe4425b11e3c
Child:
27:c380923f02d8
still doesn't recognise phy power down.  why?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gatedClock 0:1013288b8e43 1 /*----------------------------------------------//------------------------------
gatedClock 0:1013288b8e43 2 student : m-moore
gatedClock 0:1013288b8e43 3 class : rtos
gatedClock 1:5f41e2df0e85 4 directory : RTOS_HW_04
gatedClock 0:1013288b8e43 5 file : main.cpp
gatedClock 0:1013288b8e43 6 ----description---------------------------------//------------------------------
gatedClock 0:1013288b8e43 7 Joystick-Controlled Metronome
gatedClock 0:1013288b8e43 8
gatedClock 0:1013288b8e43 9 features:
gatedClock 19:0db1451d19ef 10 1. joystick-controlled.
gatedClock 19:0db1451d19ef 11 2. turns off after one minute.
gatedClock 19:0db1451d19ef 12 3. ISR's for all joystick inputs.
gatedClock 19:0db1451d19ef 13 4. joystick debounce.
gatedClock 19:0db1451d19ef 14 5. LED and LCD displays.
gatedClock 19:0db1451d19ef 15 6. BPM rate adjustable even when metronome is off.
gatedClock 19:0db1451d19ef 16 7. BPM saturates at defined lower/upper bounds.
gatedClock 18:f19721f1069e 17
gatedClock 0:1013288b8e43 18 controls:
gatedClock 19:0db1451d19ef 19 1. joystick-left - increase metronome rate.
gatedClock 19:0db1451d19ef 20 2. joystick-right - decrease metronome rate.
gatedClock 19:0db1451d19ef 21 3. joystick-down - start metronome.
gatedClock 19:0db1451d19ef 22 4. joystick-up - stop metronome.
gatedClock 19:0db1451d19ef 23 5. joystick-center - set metronome to 60BPM.
gatedClock 0:1013288b8e43 24
gatedClock 0:1013288b8e43 25 notes:
gatedClock 19:0db1451d19ef 26 1. adding the mbed-rtos library to this project prevents the
gatedClock 19:0db1451d19ef 27 LED from blinking and the LCD from displaying, even if
gatedClock 19:0db1451d19ef 28 there is no #include "rtos.h" statement.
gatedClock 19:0db1451d19ef 29 2. i was considering having the BPM up/down ISRs set up self-
gatedClock 19:0db1451d19ef 30 ending threads for continuous button press for rapid rate
gatedClock 19:0db1451d19ef 31 change, but again, rtos.h was causing trouble.
gatedClock 19:0db1451d19ef 32 3. I'm making use of disable-interrupts for bounce suppression.
gatedClock 19:0db1451d19ef 33 this could microscopically delay the metronome while its
gatedClock 19:0db1451d19ef 34 BPM is being adjusted, since I can't turn off only the
gatedClock 19:0db1451d19ef 35 interrupt involved with joystick input.
gatedClock 0:1013288b8e43 36
gatedClock 0:1013288b8e43 37 testing:
gatedClock 19:0db1451d19ef 38 1. start metronome - verify it blinks, and stops after a minute.
gatedClock 19:0db1451d19ef 39 2. stop metronome - verity it stops metronome.
gatedClock 19:0db1451d19ef 40 3. verify display indicates ON and OFF state.
gatedClock 19:0db1451d19ef 41 4. verify display indicates BPM rate.
gatedClock 19:0db1451d19ef 42 5. operate left/right joystick, inspect for BPM jumps (bounce).
gatedClock 19:0db1451d19ef 43 6. verify lower/upper BPM bounds. (only lower-bound tested).
gatedClock 0:1013288b8e43 44 -----includes-----------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 45 #include "mbed.h" // mbed class.
gatedClock 15:7c0a94d2a439 46 // #include "rtos.h"
gatedClock 14:fb4c76ac43a1 47 #include "C12832_lcd.h" // LCD class.
gatedClock 21:eb692e90ae8d 48 #include "PowerControl.h"
gatedClock 21:eb692e90ae8d 49
gatedClock 0:1013288b8e43 50 //---defines------------------------------------//------------------------------
gatedClock 0:1013288b8e43 51 #define LCD1 lcd.locate(0, 0); // LCD line 1.
gatedClock 0:1013288b8e43 52 #define LCD2 lcd.locate(0,11); // LCD line 2.
gatedClock 0:1013288b8e43 53 #define LCD3 lcd.locate(0,22); // LCD line 3.
gatedClock 7:562f136c7681 54
gatedClock 0:1013288b8e43 55 #define METROMAX 800 // max. beats per minute.
gatedClock 0:1013288b8e43 56 #define METROMIN 8 // min. beats per minute.
gatedClock 19:0db1451d19ef 57 #define METROTIME 60.0 // metronome on-time in seconds.
gatedClock 0:1013288b8e43 58 #define UDSAMPLERATE 0.1 // how often to sample U/D joystick.
gatedClock 0:1013288b8e43 59 #define LCDSAMPLERATE 0.1 // how often to redraw the LCD.
gatedClock 0:1013288b8e43 60 #define PULSELENGTH 0.0625 // how long the LED-on-time is.
gatedClock 10:4f2fa66cc430 61 #define DEBOUNCE 0.16 // debounce pause duration in S.
gatedClock 0:1013288b8e43 62 //--global_definitions--------------------------//------------------------------
gatedClock 0:1013288b8e43 63 //--global_variables----------------------------//------------------------------
gatedClock 0:1013288b8e43 64 float fMetroDelay; // time between ticks, in seconds.
gatedClock 0:1013288b8e43 65 float fMetroDuty; // duration of metro high, in seconds.
gatedClock 0:1013288b8e43 66 int dMetroBPM; // master parameter.
gatedClock 12:fab8e658ae76 67 char cMetronomeOn; // 1 = allow blink.
gatedClock 0:1013288b8e43 68 //--global_instances----------------------------//------------------------------
gatedClock 18:f19721f1069e 69 C12832_LCD lcd; // LCD object.
gatedClock 0:1013288b8e43 70
gatedClock 18:f19721f1069e 71 InterruptIn iJoyStickUp (p15); // joystick up rising edge.
gatedClock 18:f19721f1069e 72 InterruptIn iJoyStickDown (p12); // joystick down rising edge.
gatedClock 18:f19721f1069e 73 InterruptIn iJoyStickLeft (p13); // joystick left rising edge.
gatedClock 18:f19721f1069e 74 InterruptIn iJoyStickRight (p16); // joystick right rising edge.
gatedClock 18:f19721f1069e 75 InterruptIn iJoyStickCenter(p14); // 1 if joystick middle pressed.
gatedClock 0:1013288b8e43 76
gatedClock 25:fe4425b11e3c 77 DigitalOut led0(LED4); // magnetron enunciator (not magnatron control)
gatedClock 25:fe4425b11e3c 78 DigitalOut led1(LED3); // carousel enunciator (not carousel control)
gatedClock 25:fe4425b11e3c 79 DigitalOut led2(LED2); // magnetron CONTROL.
gatedClock 25:fe4425b11e3c 80 DigitalOut led3(LED1); // carousel CONTROL.
gatedClock 0:1013288b8e43 81
gatedClock 0:1013288b8e43 82 Ticker tickerMetronome; // blinking LED.
gatedClock 0:1013288b8e43 83 Ticker tickerLCD; // display ticker.
gatedClock 0:1013288b8e43 84 Timeout timeoutDutyCycle; // LED duty cycle delay.
gatedClock 12:fab8e658ae76 85 Timeout timeoutMetronome;
gatedClock 24:fe4e288bbca3 86
gatedClock 24:fe4e288bbca3 87
gatedClock 0:1013288b8e43 88 //-------prototypes-----------------------------//------------------------------
gatedClock 0:1013288b8e43 89 void initialization(); // initialize settings.
gatedClock 0:1013288b8e43 90 void lcd_display(); // display on LCD.
gatedClock 18:f19721f1069e 91 void interrupt_service_M(); // metronome tick.
gatedClock 0:1013288b8e43 92 void led3_off(); // attachable LED control.
gatedClock 0:1013288b8e43 93 void led3_on(); // attachable LED control.
gatedClock 18:f19721f1069e 94 void ISR_up(); // stop metronome.
gatedClock 18:f19721f1069e 95 void ISR_down(); // start metronome.
gatedClock 18:f19721f1069e 96 void ISR_right_rising(); // decrease BPM.
gatedClock 18:f19721f1069e 97 void ISR_right_falling(); // bounce protection.
gatedClock 18:f19721f1069e 98 void ISR_left_rising(); // increase BPM.
gatedClock 18:f19721f1069e 99 void ISR_left_falling(); // bounce protection.
gatedClock 18:f19721f1069e 100 void ISR_center(); // set to 60BPM.
gatedClock 18:f19721f1069e 101 void turn_off_metronome(); // turn off blinker.
gatedClock 24:fe4e288bbca3 102
gatedClock 24:fe4e288bbca3 103
gatedClock 24:fe4e288bbca3 104
gatedClock 24:fe4e288bbca3 105 class Watchdog {
gatedClock 24:fe4e288bbca3 106 public:
gatedClock 24:fe4e288bbca3 107 // Load timeout value in watchdog timer and enable
gatedClock 24:fe4e288bbca3 108 void kick(float s) {
gatedClock 24:fe4e288bbca3 109 LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK
gatedClock 24:fe4e288bbca3 110 uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4
gatedClock 24:fe4e288bbca3 111 LPC_WDT->WDTC = s * (float)clk;
gatedClock 24:fe4e288bbca3 112 LPC_WDT->WDMOD = 0x3; // Enabled and Reset
gatedClock 24:fe4e288bbca3 113 kick();
gatedClock 24:fe4e288bbca3 114 }
gatedClock 24:fe4e288bbca3 115 // "kick" or "feed" the dog - reset the watchdog timer
gatedClock 24:fe4e288bbca3 116 // by writing this required bit pattern
gatedClock 24:fe4e288bbca3 117 void kick() {
gatedClock 24:fe4e288bbca3 118 LPC_WDT->WDFEED = 0xAA;
gatedClock 24:fe4e288bbca3 119 LPC_WDT->WDFEED = 0x55;
gatedClock 24:fe4e288bbca3 120 }
gatedClock 24:fe4e288bbca3 121 };
gatedClock 24:fe4e288bbca3 122 Watchdog wdt; // add a wachdog timer.
gatedClock 0:1013288b8e43 123 //==============================================//==============================
gatedClock 0:1013288b8e43 124 int main(void)
gatedClock 0:1013288b8e43 125 {
gatedClock 25:fe4425b11e3c 126
gatedClock 25:fe4425b11e3c 127
gatedClock 25:fe4425b11e3c 128 // On reset, indicate a watchdog reset or a pushbutton reset on LED 4 or 3
gatedClock 26:986b539170fc 129 if ((LPC_WDT->WDMOD >> 2) & 1) led0 = 1; else led1 = 1;
gatedClock 25:fe4425b11e3c 130
gatedClock 25:fe4425b11e3c 131
gatedClock 25:fe4425b11e3c 132
gatedClock 25:fe4425b11e3c 133
gatedClock 18:f19721f1069e 134 iJoyStickUp.rise (&ISR_up); // metronome stop.
gatedClock 18:f19721f1069e 135 iJoyStickDown.rise (&ISR_down); // metronome start.
gatedClock 11:e764ed79553a 136
gatedClock 18:f19721f1069e 137 iJoyStickLeft.rise (&ISR_left_rising); // increase BPM.
gatedClock 18:f19721f1069e 138 iJoyStickLeft.fall (&ISR_left_falling); // anti-bounce.
gatedClock 10:4f2fa66cc430 139
gatedClock 18:f19721f1069e 140 iJoyStickRight.rise(&ISR_right_rising); // decrease BPM.
gatedClock 18:f19721f1069e 141 iJoyStickRight.fall(&ISR_right_falling); // anti-bounce.
gatedClock 10:4f2fa66cc430 142
gatedClock 18:f19721f1069e 143 iJoyStickCenter.rise(&ISR_center); // 60BPM.
gatedClock 6:bb5f989e3425 144
gatedClock 18:f19721f1069e 145 initialization(); // initialize variables.
gatedClock 6:bb5f989e3425 146
gatedClock 18:f19721f1069e 147 // metronome ticker.
gatedClock 15:7c0a94d2a439 148 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 6:bb5f989e3425 149
gatedClock 15:7c0a94d2a439 150 // LCD ticker.
gatedClock 15:7c0a94d2a439 151 tickerLCD.attach(&lcd_display,LCDSAMPLERATE);
gatedClock 6:bb5f989e3425 152
gatedClock 26:986b539170fc 153 // #ifdef NOETHER
gatedClock 22:5d9bcc7f4440 154 // Normal mbed power level for this setup is around 690mW
gatedClock 22:5d9bcc7f4440 155 // assuming 5V used on Vin pin
gatedClock 22:5d9bcc7f4440 156 // If you don't need networking...
gatedClock 22:5d9bcc7f4440 157 // Power down Ethernet interface - saves around 175mW
gatedClock 22:5d9bcc7f4440 158 // Also need to unplug network cable - just a cable sucks power
gatedClock 22:5d9bcc7f4440 159 PHY_PowerDown();
gatedClock 26:986b539170fc 160 //#endif
gatedClock 26:986b539170fc 161
gatedClock 26:986b539170fc 162 wdt.kick(10.0);
gatedClock 22:5d9bcc7f4440 163
gatedClock 18:f19721f1069e 164 while(1) // all timer/interrupt driven.
gatedClock 6:bb5f989e3425 165 {
gatedClock 23:99a13f79cdad 166 Sleep();
gatedClock 26:986b539170fc 167
gatedClock 26:986b539170fc 168
gatedClock 26:986b539170fc 169
gatedClock 6:bb5f989e3425 170 }
gatedClock 0:1013288b8e43 171 }
gatedClock 0:1013288b8e43 172 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 173 void initialization(void) // program initializations.
gatedClock 0:1013288b8e43 174 {
gatedClock 0:1013288b8e43 175 dMetroBPM = 60; // initialize to 60BPM.
gatedClock 0:1013288b8e43 176 fMetroDelay = 60.0 / (float) (dMetroBPM);
gatedClock 0:1013288b8e43 177 fMetroDuty = PULSELENGTH; // initialize LED on-duration.
gatedClock 17:cd6c76be8046 178 cMetronomeOn = 0;
gatedClock 0:1013288b8e43 179 }
gatedClock 0:1013288b8e43 180 /*----------------------------------------------//----------------------------*/
gatedClock 11:e764ed79553a 181 void ISR_left_rising(void) // increase BPM.
gatedClock 1:5f41e2df0e85 182 {
gatedClock 18:f19721f1069e 183 __disable_irq(); // anti-bounce.
gatedClock 11:e764ed79553a 184
gatedClock 11:e764ed79553a 185 dMetroBPM++; // increase BPM.
gatedClock 11:e764ed79553a 186
gatedClock 12:fab8e658ae76 187 // saturate metronome BPM.
gatedClock 12:fab8e658ae76 188 if (dMetroBPM > METROMAX) dMetroBPM = METROMAX;
gatedClock 12:fab8e658ae76 189 if (dMetroBPM < METROMIN) dMetroBPM = METROMIN;
gatedClock 20:64f1671c57ec 190 fMetroDelay = 60.0 / (float) (dMetroBPM); // calculate Ticker delay time.
gatedClock 12:fab8e658ae76 191
gatedClock 11:e764ed79553a 192 wait(DEBOUNCE); // debounce time.
gatedClock 11:e764ed79553a 193
gatedClock 18:f19721f1069e 194 __enable_irq(); // safe by now.
gatedClock 1:5f41e2df0e85 195 }
gatedClock 1:5f41e2df0e85 196 /*----------------------------------------------//----------------------------*/
gatedClock 11:e764ed79553a 197 void ISR_left_falling(void) // ignore rising after falling edge.
gatedClock 11:e764ed79553a 198 {
gatedClock 18:f19721f1069e 199 __disable_irq(); // anti-bounce.
gatedClock 11:e764ed79553a 200
gatedClock 11:e764ed79553a 201 wait(DEBOUNCE); // debounce time.
gatedClock 11:e764ed79553a 202
gatedClock 18:f19721f1069e 203 __enable_irq(); // safe by now.
gatedClock 11:e764ed79553a 204 }
gatedClock 11:e764ed79553a 205 /*----------------------------------------------//----------------------------*/
gatedClock 10:4f2fa66cc430 206 void ISR_right_rising(void) // decrease BPM.
gatedClock 4:67d958cc00e8 207 {
gatedClock 18:f19721f1069e 208 __disable_irq(); // anti-bounce.
gatedClock 10:4f2fa66cc430 209
gatedClock 10:4f2fa66cc430 210 dMetroBPM--; // decrease BPM.
gatedClock 4:67d958cc00e8 211
gatedClock 12:fab8e658ae76 212 // saturate metronome BPM.
gatedClock 12:fab8e658ae76 213 if (dMetroBPM > METROMAX) dMetroBPM = METROMAX;
gatedClock 12:fab8e658ae76 214 if (dMetroBPM < METROMIN) dMetroBPM = METROMIN;
gatedClock 20:64f1671c57ec 215 fMetroDelay = 60.0 / (float) (dMetroBPM); // calculate Ticker delay time.
gatedClock 12:fab8e658ae76 216
gatedClock 10:4f2fa66cc430 217 wait(DEBOUNCE); // debounce time.
gatedClock 9:ea97a69b9b93 218
gatedClock 18:f19721f1069e 219 __enable_irq(); // safe by now.
gatedClock 10:4f2fa66cc430 220 }
gatedClock 10:4f2fa66cc430 221 /*----------------------------------------------//----------------------------*/
gatedClock 10:4f2fa66cc430 222 void ISR_right_falling(void) // ignore rising after falling edge.
gatedClock 10:4f2fa66cc430 223 {
gatedClock 18:f19721f1069e 224 __disable_irq(); // anti-bounce.
gatedClock 10:4f2fa66cc430 225
gatedClock 10:4f2fa66cc430 226 wait(DEBOUNCE); // debounce time.
gatedClock 10:4f2fa66cc430 227
gatedClock 18:f19721f1069e 228 __enable_irq(); // safe by now.
gatedClock 4:67d958cc00e8 229 }
gatedClock 4:67d958cc00e8 230 /*----------------------------------------------//----------------------------*/
gatedClock 18:f19721f1069e 231 void ISR_up(void) // turn off metronome.
gatedClock 1:5f41e2df0e85 232 {
gatedClock 17:cd6c76be8046 233 cMetronomeOn = 0;
gatedClock 1:5f41e2df0e85 234 }
gatedClock 1:5f41e2df0e85 235 /*----------------------------------------------//----------------------------*/
gatedClock 18:f19721f1069e 236 void ISR_down(void) // metronome on with timeout.
gatedClock 1:5f41e2df0e85 237 {
gatedClock 12:fab8e658ae76 238 cMetronomeOn = 1;
gatedClock 12:fab8e658ae76 239 timeoutMetronome.detach();
gatedClock 17:cd6c76be8046 240 timeoutMetronome.attach(&turn_off_metronome,METROTIME);
gatedClock 1:5f41e2df0e85 241 }
gatedClock 1:5f41e2df0e85 242 /*----------------------------------------------//----------------------------*/
gatedClock 3:8ff0c9c853be 243 void ISR_center(void) // set BPM = 60.
gatedClock 1:5f41e2df0e85 244 {
gatedClock 8:95f4f470ae28 245 dMetroBPM = 60;
gatedClock 20:64f1671c57ec 246 fMetroDelay = 60.0 / (float) (dMetroBPM); // calculate Ticker delay time.
gatedClock 19:0db1451d19ef 247 tickerMetronome.detach(); // change BPM immediately.
gatedClock 19:0db1451d19ef 248 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 1:5f41e2df0e85 249 }
gatedClock 1:5f41e2df0e85 250 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 251 void lcd_display(void) // display metronome info.
gatedClock 0:1013288b8e43 252 {
gatedClock 0:1013288b8e43 253 lcd.cls(); // clear display.
gatedClock 0:1013288b8e43 254
gatedClock 0:1013288b8e43 255 LCD1; // line 1.
gatedClock 17:cd6c76be8046 256
gatedClock 16:d7bbd641929c 257 if (cMetronomeOn)
gatedClock 16:d7bbd641929c 258 lcd.printf(" metronome ON");
gatedClock 16:d7bbd641929c 259 else
gatedClock 16:d7bbd641929c 260 lcd.printf(" metronome OFF");
gatedClock 0:1013288b8e43 261
gatedClock 0:1013288b8e43 262 LCD2; // line 2.
gatedClock 0:1013288b8e43 263
gatedClock 0:1013288b8e43 264 if (dMetroBPM == METROMIN) // BPM, with saturation notification.
gatedClock 0:1013288b8e43 265 lcd.printf(" %5.2d BPM minimum",dMetroBPM);
gatedClock 0:1013288b8e43 266 else
gatedClock 0:1013288b8e43 267 if (dMetroBPM == METROMAX)
gatedClock 0:1013288b8e43 268 lcd.printf(" %5.2d BPM maximum",dMetroBPM);
gatedClock 0:1013288b8e43 269 else
gatedClock 0:1013288b8e43 270 lcd.printf(" %5.2d BPM",dMetroBPM);
gatedClock 0:1013288b8e43 271
gatedClock 0:1013288b8e43 272 LCD3; // line 3.
gatedClock 0:1013288b8e43 273
gatedClock 8:95f4f470ae28 274 lcd.printf(" RTOS HW 4");
gatedClock 0:1013288b8e43 275 }
gatedClock 0:1013288b8e43 276 /*----------------------------------------------//----------------------------*/
gatedClock 17:cd6c76be8046 277 // this metronome tick ISR will self-adjust to the current user-selected
gatedClock 17:cd6c76be8046 278 // metronome rate. that has to be done here, and at the start of the function,
gatedClock 17:cd6c76be8046 279 // in order to maintain a constant phase and to prevent a beat-skip.
gatedClock 17:cd6c76be8046 280
gatedClock 17:cd6c76be8046 281 void interrupt_service_M() // metronome tick.
gatedClock 17:cd6c76be8046 282 {
gatedClock 17:cd6c76be8046 283 if (cMetronomeOn)
gatedClock 17:cd6c76be8046 284 {
gatedClock 18:f19721f1069e 285 tickerMetronome.detach(); // only one attachment.
gatedClock 17:cd6c76be8046 286 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 17:cd6c76be8046 287 led3_on();
gatedClock 17:cd6c76be8046 288 timeoutDutyCycle.attach(&led3_off,fMetroDuty);
gatedClock 17:cd6c76be8046 289 } else led3_off();
gatedClock 17:cd6c76be8046 290 }
gatedClock 17:cd6c76be8046 291 /*----------------------------------------------//----------------------------*/
gatedClock 18:f19721f1069e 292 void turn_off_metronome(void) // turn off metronome.
gatedClock 17:cd6c76be8046 293 {
gatedClock 17:cd6c76be8046 294 cMetronomeOn = 0;
gatedClock 17:cd6c76be8046 295 }
gatedClock 17:cd6c76be8046 296 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 297 void led3_off(void) {led3 = 0;} // turn off the LED.
gatedClock 0:1013288b8e43 298 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 299 void led3_on( void) {led3 = 1;} // turn on the led.
gatedClock 15:7c0a94d2a439 300 /*----------------------------------------------//----------------------------*/