homework 7

Dependencies:   mbed-rtos mbed C12832_lcd LM75B

Committer:
gatedClock
Date:
Sat Sep 07 20:31:06 2013 +0000
Revision:
9:cfdb9aa5857c
Parent:
8:7d85205aa1ab
Child:
10:2b0a9fc39109
start out with homework 4 as a base.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gatedClock 0:fcca4db7b32a 1 /*----------------------------------------------//------------------------------
gatedClock 0:fcca4db7b32a 2 student : m-moore
gatedClock 0:fcca4db7b32a 3 class : rtos
gatedClock 9:cfdb9aa5857c 4 directory : RTOS_HW_04
gatedClock 0:fcca4db7b32a 5 file : main.cpp
gatedClock 0:fcca4db7b32a 6 ----description---------------------------------//------------------------------
gatedClock 9:cfdb9aa5857c 7 Joystick-Controlled Metronome
gatedClock 9:cfdb9aa5857c 8
gatedClock 9:cfdb9aa5857c 9 features:
gatedClock 9:cfdb9aa5857c 10 1. joystick-controlled.
gatedClock 9:cfdb9aa5857c 11 2. turns off after one minute.
gatedClock 9:cfdb9aa5857c 12 3. ISR's for all joystick inputs.
gatedClock 9:cfdb9aa5857c 13 4. joystick debounce.
gatedClock 9:cfdb9aa5857c 14 5. LED and LCD displays.
gatedClock 9:cfdb9aa5857c 15 6. BPM rate adjustable even when metronome is off.
gatedClock 9:cfdb9aa5857c 16 7. BPM saturates at defined lower/upper bounds.
gatedClock 0:fcca4db7b32a 17
gatedClock 9:cfdb9aa5857c 18 controls:
gatedClock 9:cfdb9aa5857c 19 1. joystick-left - increase metronome rate.
gatedClock 9:cfdb9aa5857c 20 2. joystick-right - decrease metronome rate.
gatedClock 9:cfdb9aa5857c 21 3. joystick-down - start metronome.
gatedClock 9:cfdb9aa5857c 22 4. joystick-up - stop metronome.
gatedClock 9:cfdb9aa5857c 23 5. joystick-center - set metronome to 60BPM.
gatedClock 9:cfdb9aa5857c 24
gatedClock 9:cfdb9aa5857c 25 notes:
gatedClock 9:cfdb9aa5857c 26 1. adding the mbed-rtos library to this project prevents the
gatedClock 9:cfdb9aa5857c 27 LED from blinking and the LCD from displaying, even if
gatedClock 9:cfdb9aa5857c 28 there is no #include "rtos.h" statement.
gatedClock 9:cfdb9aa5857c 29 2. i was considering having the BPM up/down ISRs set up self-
gatedClock 9:cfdb9aa5857c 30 ending threads for continuous button press for rapid rate
gatedClock 9:cfdb9aa5857c 31 change, but again, rtos.h was causing trouble.
gatedClock 9:cfdb9aa5857c 32 3. I'm making use of disable-interrupts for bounce suppression.
gatedClock 9:cfdb9aa5857c 33 this could microscopically delay the metronome while its
gatedClock 9:cfdb9aa5857c 34 BPM is being adjusted, since I can't turn off only the
gatedClock 9:cfdb9aa5857c 35 interrupt involved with joystick input.
gatedClock 9:cfdb9aa5857c 36
gatedClock 9:cfdb9aa5857c 37 testing:
gatedClock 9:cfdb9aa5857c 38 1. start metronome - verify it blinks, and stops after a minute.
gatedClock 9:cfdb9aa5857c 39 2. stop metronome - verity it stops metronome.
gatedClock 9:cfdb9aa5857c 40 3. verify display indicates ON and OFF state.
gatedClock 9:cfdb9aa5857c 41 4. verify display indicates BPM rate.
gatedClock 9:cfdb9aa5857c 42 5. operate left/right joystick, inspect for BPM jumps (bounce).
gatedClock 9:cfdb9aa5857c 43 6. verify lower/upper BPM bounds. (only lower-bound tested).
gatedClock 0:fcca4db7b32a 44 -----includes-----------------------------------//----------------------------*/
gatedClock 0:fcca4db7b32a 45 #include "mbed.h" // mbed class.
gatedClock 9:cfdb9aa5857c 46 // #include "rtos.h"
gatedClock 9:cfdb9aa5857c 47 #include "C12832_lcd.h" // LCD class.
gatedClock 0:fcca4db7b32a 48 //---defines------------------------------------//------------------------------
gatedClock 9:cfdb9aa5857c 49 #define LCD1 lcd.locate(0, 0); // LCD line 1.
gatedClock 9:cfdb9aa5857c 50 #define LCD2 lcd.locate(0,11); // LCD line 2.
gatedClock 9:cfdb9aa5857c 51 #define LCD3 lcd.locate(0,22); // LCD line 3.
gatedClock 9:cfdb9aa5857c 52
gatedClock 9:cfdb9aa5857c 53 #define METROMAX 800 // max. beats per minute.
gatedClock 9:cfdb9aa5857c 54 #define METROMIN 8 // min. beats per minute.
gatedClock 9:cfdb9aa5857c 55 #define METROTIME 60.0 // metronome on-time in seconds.
gatedClock 9:cfdb9aa5857c 56 #define UDSAMPLERATE 0.1 // how often to sample U/D joystick.
gatedClock 9:cfdb9aa5857c 57 #define LCDSAMPLERATE 0.1 // how often to redraw the LCD.
gatedClock 9:cfdb9aa5857c 58 #define PULSELENGTH 0.0625 // how long the LED-on-time is.
gatedClock 9:cfdb9aa5857c 59 #define DEBOUNCE 0.16 // debounce pause duration in S.
gatedClock 0:fcca4db7b32a 60 //--global_definitions--------------------------//------------------------------
gatedClock 0:fcca4db7b32a 61 //--global_variables----------------------------//------------------------------
gatedClock 9:cfdb9aa5857c 62 float fMetroDelay; // time between ticks, in seconds.
gatedClock 9:cfdb9aa5857c 63 float fMetroDuty; // duration of metro high, in seconds.
gatedClock 9:cfdb9aa5857c 64 int dMetroBPM; // master parameter.
gatedClock 9:cfdb9aa5857c 65 char cMetronomeOn; // 1 = allow blink.
gatedClock 0:fcca4db7b32a 66 //--global_instances----------------------------//------------------------------
gatedClock 9:cfdb9aa5857c 67 C12832_LCD lcd; // LCD object.
gatedClock 0:fcca4db7b32a 68
gatedClock 0:fcca4db7b32a 69 InterruptIn iJoyStickUp (p15); // joystick up rising edge.
gatedClock 0:fcca4db7b32a 70 InterruptIn iJoyStickDown (p12); // joystick down rising edge.
gatedClock 0:fcca4db7b32a 71 InterruptIn iJoyStickLeft (p13); // joystick left rising edge.
gatedClock 0:fcca4db7b32a 72 InterruptIn iJoyStickRight (p16); // joystick right rising edge.
gatedClock 0:fcca4db7b32a 73 InterruptIn iJoyStickCenter(p14); // 1 if joystick middle pressed.
gatedClock 0:fcca4db7b32a 74
gatedClock 0:fcca4db7b32a 75 DigitalOut led3(LED1); // leftmost LED.
gatedClock 0:fcca4db7b32a 76
gatedClock 9:cfdb9aa5857c 77 Ticker tickerMetronome; // blinking LED.
gatedClock 9:cfdb9aa5857c 78 Ticker tickerLCD; // display ticker.
gatedClock 9:cfdb9aa5857c 79 Timeout timeoutDutyCycle; // LED duty cycle delay.
gatedClock 9:cfdb9aa5857c 80 Timeout timeoutMetronome;
gatedClock 0:fcca4db7b32a 81 //-------prototypes-----------------------------//------------------------------
gatedClock 9:cfdb9aa5857c 82 void initialization(); // initialize settings.
gatedClock 9:cfdb9aa5857c 83 void lcd_display(); // display on LCD.
gatedClock 9:cfdb9aa5857c 84 void interrupt_service_M(); // metronome tick.
gatedClock 9:cfdb9aa5857c 85 void led3_off(); // attachable LED control.
gatedClock 9:cfdb9aa5857c 86 void led3_on(); // attachable LED control.
gatedClock 9:cfdb9aa5857c 87 void ISR_up(); // stop metronome.
gatedClock 9:cfdb9aa5857c 88 void ISR_down(); // start metronome.
gatedClock 9:cfdb9aa5857c 89 void ISR_right_rising(); // decrease BPM.
gatedClock 9:cfdb9aa5857c 90 void ISR_right_falling(); // bounce protection.
gatedClock 9:cfdb9aa5857c 91 void ISR_left_rising(); // increase BPM.
gatedClock 9:cfdb9aa5857c 92 void ISR_left_falling(); // bounce protection.
gatedClock 9:cfdb9aa5857c 93 void ISR_center(); // set to 60BPM.
gatedClock 9:cfdb9aa5857c 94 void turn_off_metronome(); // turn off blinker.
gatedClock 0:fcca4db7b32a 95 //==============================================//==============================
gatedClock 0:fcca4db7b32a 96 int main(void)
gatedClock 0:fcca4db7b32a 97 {
gatedClock 9:cfdb9aa5857c 98 iJoyStickUp.rise (&ISR_up); // metronome stop.
gatedClock 9:cfdb9aa5857c 99 iJoyStickDown.rise (&ISR_down); // metronome start.
gatedClock 9:cfdb9aa5857c 100
gatedClock 9:cfdb9aa5857c 101 iJoyStickLeft.rise (&ISR_left_rising); // increase BPM.
gatedClock 9:cfdb9aa5857c 102 iJoyStickLeft.fall (&ISR_left_falling); // anti-bounce.
gatedClock 9:cfdb9aa5857c 103
gatedClock 9:cfdb9aa5857c 104 iJoyStickRight.rise(&ISR_right_rising); // decrease BPM.
gatedClock 9:cfdb9aa5857c 105 iJoyStickRight.fall(&ISR_right_falling); // anti-bounce.
gatedClock 7:9fbd1d540863 106
gatedClock 9:cfdb9aa5857c 107 iJoyStickCenter.rise(&ISR_center); // 60BPM.
gatedClock 9:cfdb9aa5857c 108
gatedClock 9:cfdb9aa5857c 109 initialization(); // initialize variables.
gatedClock 0:fcca4db7b32a 110
gatedClock 9:cfdb9aa5857c 111 // metronome ticker.
gatedClock 9:cfdb9aa5857c 112 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 9:cfdb9aa5857c 113
gatedClock 9:cfdb9aa5857c 114 // LCD ticker.
gatedClock 9:cfdb9aa5857c 115 tickerLCD.attach(&lcd_display,LCDSAMPLERATE);
gatedClock 0:fcca4db7b32a 116
gatedClock 0:fcca4db7b32a 117 while(1) // all timer/interrupt driven.
gatedClock 0:fcca4db7b32a 118 {
gatedClock 9:cfdb9aa5857c 119 wait(10.0);
gatedClock 0:fcca4db7b32a 120 }
gatedClock 0:fcca4db7b32a 121 }
gatedClock 0:fcca4db7b32a 122 /*----------------------------------------------//----------------------------*/
gatedClock 0:fcca4db7b32a 123 void initialization(void) // program initializations.
gatedClock 0:fcca4db7b32a 124 {
gatedClock 9:cfdb9aa5857c 125 dMetroBPM = 60; // initialize to 60BPM.
gatedClock 9:cfdb9aa5857c 126 fMetroDelay = 60.0 / (float) (dMetroBPM);
gatedClock 9:cfdb9aa5857c 127 fMetroDuty = PULSELENGTH; // initialize LED on-duration.
gatedClock 9:cfdb9aa5857c 128 cMetronomeOn = 0;
gatedClock 0:fcca4db7b32a 129 }
gatedClock 0:fcca4db7b32a 130 /*----------------------------------------------//----------------------------*/
gatedClock 9:cfdb9aa5857c 131 void ISR_left_rising(void) // increase BPM.
gatedClock 1:9188d4668a88 132 {
gatedClock 9:cfdb9aa5857c 133 __disable_irq(); // anti-bounce.
gatedClock 9:cfdb9aa5857c 134
gatedClock 9:cfdb9aa5857c 135 dMetroBPM++; // increase BPM.
gatedClock 9:cfdb9aa5857c 136
gatedClock 9:cfdb9aa5857c 137 // saturate metronome BPM.
gatedClock 9:cfdb9aa5857c 138 if (dMetroBPM > METROMAX) dMetroBPM = METROMAX;
gatedClock 9:cfdb9aa5857c 139 if (dMetroBPM < METROMIN) dMetroBPM = METROMIN;
gatedClock 9:cfdb9aa5857c 140 fMetroDelay = 60.0 / (float) (dMetroBPM); // calculate Ticker delay time.
gatedClock 9:cfdb9aa5857c 141
gatedClock 9:cfdb9aa5857c 142 wait(DEBOUNCE); // debounce time.
gatedClock 9:cfdb9aa5857c 143
gatedClock 9:cfdb9aa5857c 144 __enable_irq(); // safe by now.
gatedClock 1:9188d4668a88 145 }
gatedClock 1:9188d4668a88 146 /*----------------------------------------------//----------------------------*/
gatedClock 9:cfdb9aa5857c 147 void ISR_left_falling(void) // ignore rising after falling edge.
gatedClock 1:9188d4668a88 148 {
gatedClock 9:cfdb9aa5857c 149 __disable_irq(); // anti-bounce.
gatedClock 9:cfdb9aa5857c 150
gatedClock 9:cfdb9aa5857c 151 wait(DEBOUNCE); // debounce time.
gatedClock 9:cfdb9aa5857c 152
gatedClock 9:cfdb9aa5857c 153 __enable_irq(); // safe by now.
gatedClock 1:9188d4668a88 154 }
gatedClock 1:9188d4668a88 155 /*----------------------------------------------//----------------------------*/
gatedClock 9:cfdb9aa5857c 156 void ISR_right_rising(void) // decrease BPM.
gatedClock 1:9188d4668a88 157 {
gatedClock 9:cfdb9aa5857c 158 __disable_irq(); // anti-bounce.
gatedClock 9:cfdb9aa5857c 159
gatedClock 9:cfdb9aa5857c 160 dMetroBPM--; // decrease BPM.
gatedClock 9:cfdb9aa5857c 161
gatedClock 9:cfdb9aa5857c 162 // saturate metronome BPM.
gatedClock 9:cfdb9aa5857c 163 if (dMetroBPM > METROMAX) dMetroBPM = METROMAX;
gatedClock 9:cfdb9aa5857c 164 if (dMetroBPM < METROMIN) dMetroBPM = METROMIN;
gatedClock 9:cfdb9aa5857c 165 fMetroDelay = 60.0 / (float) (dMetroBPM); // calculate Ticker delay time.
gatedClock 9:cfdb9aa5857c 166
gatedClock 9:cfdb9aa5857c 167 wait(DEBOUNCE); // debounce time.
gatedClock 9:cfdb9aa5857c 168
gatedClock 9:cfdb9aa5857c 169 __enable_irq(); // safe by now.
gatedClock 1:9188d4668a88 170 }
gatedClock 1:9188d4668a88 171 /*----------------------------------------------//----------------------------*/
gatedClock 9:cfdb9aa5857c 172 void ISR_right_falling(void) // ignore rising after falling edge.
gatedClock 1:9188d4668a88 173 {
gatedClock 9:cfdb9aa5857c 174 __disable_irq(); // anti-bounce.
gatedClock 9:cfdb9aa5857c 175
gatedClock 9:cfdb9aa5857c 176 wait(DEBOUNCE); // debounce time.
gatedClock 9:cfdb9aa5857c 177
gatedClock 9:cfdb9aa5857c 178 __enable_irq(); // safe by now.
gatedClock 9:cfdb9aa5857c 179 }
gatedClock 9:cfdb9aa5857c 180 /*----------------------------------------------//----------------------------*/
gatedClock 9:cfdb9aa5857c 181 void ISR_up(void) // turn off metronome.
gatedClock 9:cfdb9aa5857c 182 {
gatedClock 9:cfdb9aa5857c 183 cMetronomeOn = 0;
gatedClock 1:9188d4668a88 184 }
gatedClock 1:9188d4668a88 185 /*----------------------------------------------//----------------------------*/
gatedClock 9:cfdb9aa5857c 186 void ISR_down(void) // metronome on with timeout.
gatedClock 1:9188d4668a88 187 {
gatedClock 9:cfdb9aa5857c 188 cMetronomeOn = 1;
gatedClock 9:cfdb9aa5857c 189 timeoutMetronome.detach();
gatedClock 9:cfdb9aa5857c 190 timeoutMetronome.attach(&turn_off_metronome,METROTIME);
gatedClock 1:9188d4668a88 191 }
gatedClock 1:9188d4668a88 192 /*----------------------------------------------//----------------------------*/
gatedClock 9:cfdb9aa5857c 193 void ISR_center(void) // set BPM = 60.
gatedClock 2:665ffa57031f 194 {
gatedClock 9:cfdb9aa5857c 195 dMetroBPM = 60;
gatedClock 9:cfdb9aa5857c 196 fMetroDelay = 60.0 / (float) (dMetroBPM); // calculate Ticker delay time.
gatedClock 9:cfdb9aa5857c 197 tickerMetronome.detach(); // change BPM immediately.
gatedClock 9:cfdb9aa5857c 198 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 2:665ffa57031f 199 }
gatedClock 2:665ffa57031f 200 /*----------------------------------------------//----------------------------*/
gatedClock 9:cfdb9aa5857c 201 void lcd_display(void) // display metronome info.
gatedClock 2:665ffa57031f 202 {
gatedClock 9:cfdb9aa5857c 203 lcd.cls(); // clear display.
gatedClock 9:cfdb9aa5857c 204
gatedClock 9:cfdb9aa5857c 205 LCD1; // line 1.
gatedClock 9:cfdb9aa5857c 206
gatedClock 9:cfdb9aa5857c 207 if (cMetronomeOn)
gatedClock 9:cfdb9aa5857c 208 lcd.printf(" metronome ON");
gatedClock 9:cfdb9aa5857c 209 else
gatedClock 9:cfdb9aa5857c 210 lcd.printf(" metronome OFF");
gatedClock 9:cfdb9aa5857c 211
gatedClock 9:cfdb9aa5857c 212 LCD2; // line 2.
gatedClock 9:cfdb9aa5857c 213
gatedClock 9:cfdb9aa5857c 214 if (dMetroBPM == METROMIN) // BPM, with saturation notification.
gatedClock 9:cfdb9aa5857c 215 lcd.printf(" %5.2d BPM minimum",dMetroBPM);
gatedClock 9:cfdb9aa5857c 216 else
gatedClock 9:cfdb9aa5857c 217 if (dMetroBPM == METROMAX)
gatedClock 9:cfdb9aa5857c 218 lcd.printf(" %5.2d BPM maximum",dMetroBPM);
gatedClock 9:cfdb9aa5857c 219 else
gatedClock 9:cfdb9aa5857c 220 lcd.printf(" %5.2d BPM",dMetroBPM);
gatedClock 9:cfdb9aa5857c 221
gatedClock 9:cfdb9aa5857c 222 LCD3; // line 3.
gatedClock 9:cfdb9aa5857c 223
gatedClock 9:cfdb9aa5857c 224 lcd.printf(" RTOS HW 4");
gatedClock 2:665ffa57031f 225 }
gatedClock 2:665ffa57031f 226 /*----------------------------------------------//----------------------------*/
gatedClock 9:cfdb9aa5857c 227 // this metronome tick ISR will self-adjust to the current user-selected
gatedClock 9:cfdb9aa5857c 228 // metronome rate. that has to be done here, and at the start of the function,
gatedClock 9:cfdb9aa5857c 229 // in order to maintain a constant phase and to prevent a beat-skip.
gatedClock 9:cfdb9aa5857c 230
gatedClock 9:cfdb9aa5857c 231 void interrupt_service_M() // metronome tick.
gatedClock 9:cfdb9aa5857c 232 {
gatedClock 9:cfdb9aa5857c 233 if (cMetronomeOn)
gatedClock 9:cfdb9aa5857c 234 {
gatedClock 9:cfdb9aa5857c 235 tickerMetronome.detach(); // only one attachment.
gatedClock 9:cfdb9aa5857c 236 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 9:cfdb9aa5857c 237 led3_on();
gatedClock 9:cfdb9aa5857c 238 timeoutDutyCycle.attach(&led3_off,fMetroDuty);
gatedClock 9:cfdb9aa5857c 239 } else led3_off();
gatedClock 2:665ffa57031f 240 }
gatedClock 9:cfdb9aa5857c 241 /*----------------------------------------------//----------------------------*/
gatedClock 9:cfdb9aa5857c 242 void turn_off_metronome(void) // turn off metronome.
gatedClock 9:cfdb9aa5857c 243 {
gatedClock 9:cfdb9aa5857c 244 cMetronomeOn = 0;
gatedClock 9:cfdb9aa5857c 245 }
gatedClock 9:cfdb9aa5857c 246 /*----------------------------------------------//----------------------------*/
gatedClock 9:cfdb9aa5857c 247 void led3_off(void) {led3 = 0;} // turn off the LED.
gatedClock 9:cfdb9aa5857c 248 /*----------------------------------------------//----------------------------*/
gatedClock 9:cfdb9aa5857c 249 void led3_on( void) {led3 = 1;} // turn on the led.
gatedClock 9:cfdb9aa5857c 250 /*----------------------------------------------//----------------------------*/
gatedClock 2:665ffa57031f 251
gatedClock 2:665ffa57031f 252