chad
Dependencies: MCP23017 WattBob_TextLCD mbed-rtos mbed
tasks.cpp@17:bc25d5f47bab, 2017-03-13 (annotated)
- Committer:
- f_legge
- Date:
- Mon Mar 13 14:51:55 2017 +0000
- Revision:
- 17:bc25d5f47bab
- Parent:
- 16:bebcc7d24f3e
Final Commit. ; All tasks working.; Timing added.; Commented and formatted.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
f_legge | 13:ad04937ca366 | 1 | #include "main.h" |
f_legge | 13:ad04937ca366 | 2 | |
f_legge | 17:bc25d5f47bab | 3 | //////////////////////////////////////////////////////////////////////////////// |
f_legge | 17:bc25d5f47bab | 4 | // |
f_legge | 17:bc25d5f47bab | 5 | // Task 1: Measure input frequency |
f_legge | 17:bc25d5f47bab | 6 | // 24ms max |
f_legge | 17:bc25d5f47bab | 7 | // |
f_legge | 15:85616bc0e2ae | 8 | void Task1(void) |
f_legge | 15:85616bc0e2ae | 9 | { |
f_legge | 17:bc25d5f47bab | 10 | //T5.reset(); |
f_legge | 17:bc25d5f47bab | 11 | //T5.start(); |
f_legge | 17:bc25d5f47bab | 12 | |
f_legge | 17:bc25d5f47bab | 13 | timer.reset(); // Timer used to time input frequency pulses |
f_legge | 17:bc25d5f47bab | 14 | |
f_legge | 16:bebcc7d24f3e | 15 | // Wait for Posedge |
f_legge | 17:bc25d5f47bab | 16 | if (Fq == 0){ // Case for starting on low pulse |
f_legge | 17:bc25d5f47bab | 17 | while (Fq == 0){ // Wait for high pulse |
f_legge | 17:bc25d5f47bab | 18 | wait_us (1); |
f_legge | 17:bc25d5f47bab | 19 | } |
f_legge | 17:bc25d5f47bab | 20 | if (Fq == 1){ // Start timer on high pulse |
f_legge | 16:bebcc7d24f3e | 21 | timer.start (); |
f_legge | 16:bebcc7d24f3e | 22 | } |
f_legge | 17:bc25d5f47bab | 23 | while (Fq == 1){ // Wait for low pulse |
f_legge | 17:bc25d5f47bab | 24 | wait_us (1); |
f_legge | 16:bebcc7d24f3e | 25 | } |
f_legge | 17:bc25d5f47bab | 26 | if (Fq == 0){ // Stop timer on low pulse |
f_legge | 16:bebcc7d24f3e | 27 | timer.stop (); |
f_legge | 15:85616bc0e2ae | 28 | } |
f_legge | 15:85616bc0e2ae | 29 | } |
f_legge | 15:85616bc0e2ae | 30 | |
f_legge | 17:bc25d5f47bab | 31 | else if (Fq == 1){ // Case for starting on high pulse |
f_legge | 17:bc25d5f47bab | 32 | while (Fq == 1){ // Wait for low pulse |
f_legge | 16:bebcc7d24f3e | 33 | wait_us (1); |
f_legge | 17:bc25d5f47bab | 34 | } |
f_legge | 17:bc25d5f47bab | 35 | if (Fq == 0){ // Start timer on low pulse |
f_legge | 16:bebcc7d24f3e | 36 | timer.start (); |
f_legge | 16:bebcc7d24f3e | 37 | } |
f_legge | 17:bc25d5f47bab | 38 | while (Fq == 0){ // Wait for high pulse |
f_legge | 17:bc25d5f47bab | 39 | wait_us (1); |
f_legge | 16:bebcc7d24f3e | 40 | } |
f_legge | 17:bc25d5f47bab | 41 | if (Fq == 1){ // Stop timer on high pulse |
f_legge | 16:bebcc7d24f3e | 42 | timer.stop (); |
f_legge | 15:85616bc0e2ae | 43 | } |
f_legge | 15:85616bc0e2ae | 44 | } |
f_legge | 14:ede0e7ed2745 | 45 | |
f_legge | 17:bc25d5f47bab | 46 | freq = (1/(2*timer.read())); // Calc frequency from timer |
f_legge | 17:bc25d5f47bab | 47 | |
f_legge | 17:bc25d5f47bab | 48 | //T5.stop(); |
f_legge | 17:bc25d5f47bab | 49 | |
f_legge | 17:bc25d5f47bab | 50 | //lcd->locate(0,0); |
f_legge | 17:bc25d5f47bab | 51 | //lcd->printf("F: %4.0f",freq); |
f_legge | 14:ede0e7ed2745 | 52 | |
f_legge | 17:bc25d5f47bab | 53 | //lcd->locate(1,0); |
f_legge | 17:bc25d5f47bab | 54 | //lcd->printf("%f",T5.read()); |
f_legge | 14:ede0e7ed2745 | 55 | } |
f_legge | 14:ede0e7ed2745 | 56 | |
f_legge | 13:ad04937ca366 | 57 | //////////////////////////////////////////////////////////////////////////////// |
f_legge | 13:ad04937ca366 | 58 | // |
f_legge | 17:bc25d5f47bab | 59 | // Read Digital input switch |
f_legge | 17:bc25d5f47bab | 60 | // 3us max |
f_legge | 13:ad04937ca366 | 61 | // |
f_legge | 13:ad04937ca366 | 62 | void Task2(void) |
f_legge | 13:ad04937ca366 | 63 | { |
f_legge | 17:bc25d5f47bab | 64 | //T5.reset(); |
f_legge | 17:bc25d5f47bab | 65 | //T5.start(); |
f_legge | 17:bc25d5f47bab | 66 | |
f_legge | 17:bc25d5f47bab | 67 | if(DS == 1) // If switch 1 is high set switch_state register high |
f_legge | 15:85616bc0e2ae | 68 | switch_state = 1; |
f_legge | 17:bc25d5f47bab | 69 | else if(DS == 0) // If switch 1 is low set switch_state register low |
f_legge | 15:85616bc0e2ae | 70 | switch_state = 0; |
f_legge | 17:bc25d5f47bab | 71 | |
f_legge | 17:bc25d5f47bab | 72 | //T5.stop(); |
f_legge | 17:bc25d5f47bab | 73 | |
f_legge | 17:bc25d5f47bab | 74 | //lcd->locate(0,0); |
f_legge | 17:bc25d5f47bab | 75 | //lcd->printf("Sw1: %d",switch_state); |
f_legge | 17:bc25d5f47bab | 76 | |
f_legge | 17:bc25d5f47bab | 77 | //lcd->locate(1,0); |
f_legge | 17:bc25d5f47bab | 78 | //lcd->printf("%f",(1000*T5.read())); |
f_legge | 13:ad04937ca366 | 79 | } |
f_legge | 13:ad04937ca366 | 80 | |
f_legge | 13:ad04937ca366 | 81 | |
f_legge | 13:ad04937ca366 | 82 | //////////////////////////////////////////////////////////////////////////////// |
f_legge | 13:ad04937ca366 | 83 | // |
f_legge | 17:bc25d5f47bab | 84 | // Output watchdog timer pulse 6.1ms max |
f_legge | 13:ad04937ca366 | 85 | // |
f_legge | 13:ad04937ca366 | 86 | void Task3(void) |
f_legge | 13:ad04937ca366 | 87 | { |
f_legge | 17:bc25d5f47bab | 88 | //T5.reset(); |
f_legge | 17:bc25d5f47bab | 89 | //T5.start(); |
f_legge | 17:bc25d5f47bab | 90 | |
f_legge | 17:bc25d5f47bab | 91 | WD_pulse = 1; // WatchDog pulse High |
f_legge | 13:ad04937ca366 | 92 | wait_us(WD); // Leave high for specified length |
f_legge | 17:bc25d5f47bab | 93 | WD_pulse = 0; // WatchDog pulse low |
f_legge | 17:bc25d5f47bab | 94 | |
f_legge | 17:bc25d5f47bab | 95 | //T5.stop(); |
f_legge | 17:bc25d5f47bab | 96 | |
f_legge | 17:bc25d5f47bab | 97 | //lcd->locate(1,0); |
f_legge | 17:bc25d5f47bab | 98 | //lcd->printf("%f",T5.read()); |
f_legge | 13:ad04937ca366 | 99 | } |
f_legge | 13:ad04937ca366 | 100 | |
f_legge | 13:ad04937ca366 | 101 | //////////////////////////////////////////////////////////////////////////////// |
f_legge | 13:ad04937ca366 | 102 | // |
f_legge | 17:bc25d5f47bab | 103 | // Read and filter 2 analogue inputs |
f_legge | 13:ad04937ca366 | 104 | // 3.3V max |
f_legge | 17:bc25d5f47bab | 105 | // 55us |
f_legge | 16:bebcc7d24f3e | 106 | // |
f_legge | 13:ad04937ca366 | 107 | void Task4(void) |
f_legge | 16:bebcc7d24f3e | 108 | { |
f_legge | 17:bc25d5f47bab | 109 | //T5.reset(); |
f_legge | 17:bc25d5f47bab | 110 | //T5.start(); |
f_legge | 17:bc25d5f47bab | 111 | |
f_legge | 17:bc25d5f47bab | 112 | A1_val = 0; // Reset analogue 1 variable |
f_legge | 17:bc25d5f47bab | 113 | A2_val = 0; // Reset analogue 2 variable |
f_legge | 16:bebcc7d24f3e | 114 | |
f_legge | 17:bc25d5f47bab | 115 | A1_In = (A1_ * 3.3); // Analogue input changed from 0->1 to 0-> 3.3 |
f_legge | 17:bc25d5f47bab | 116 | A2_In = (A2_ * 3.3); |
f_legge | 16:bebcc7d24f3e | 117 | |
f_legge | 17:bc25d5f47bab | 118 | for(int i=0; i<4; i++) { // Take three readings for each input |
f_legge | 17:bc25d5f47bab | 119 | A1_val = A1_val + A1_In; |
f_legge | 17:bc25d5f47bab | 120 | A2_val = A2_val + A2_In; |
f_legge | 13:ad04937ca366 | 121 | } |
f_legge | 16:bebcc7d24f3e | 122 | |
f_legge | 17:bc25d5f47bab | 123 | A1_val = (A1_val / 4); // Final analogue 1 input. Average taken of 3 readings |
f_legge | 17:bc25d5f47bab | 124 | A2_val = (A2_val / 4); // Final analogue 2 input. Average taken of 3 readings |
f_legge | 16:bebcc7d24f3e | 125 | |
f_legge | 17:bc25d5f47bab | 126 | //T5.stop(); |
f_legge | 17:bc25d5f47bab | 127 | |
f_legge | 16:bebcc7d24f3e | 128 | //lcd->locate(0,0); |
f_legge | 16:bebcc7d24f3e | 129 | //lcd->printf("A1:%1.2f A2:%1.2f",A1_val,A2_val); |
f_legge | 17:bc25d5f47bab | 130 | |
f_legge | 17:bc25d5f47bab | 131 | //lcd->locate(1,0); |
f_legge | 17:bc25d5f47bab | 132 | //lcd->printf("%f",T5.read()); |
f_legge | 13:ad04937ca366 | 133 | } |
f_legge | 13:ad04937ca366 | 134 | |
f_legge | 13:ad04937ca366 | 135 | //////////////////////////////////////////////////////////////////////////////// |
f_legge | 13:ad04937ca366 | 136 | // |
f_legge | 17:bc25d5f47bab | 137 | // Display Frequency, digital and filterd analogue values on LCD |
f_legge | 16:bebcc7d24f3e | 138 | // |
f_legge | 17:bc25d5f47bab | 139 | void Task5a(void) // 25.5 ms |
f_legge | 13:ad04937ca366 | 140 | { |
f_legge | 17:bc25d5f47bab | 141 | T5.reset(); // Reset timer for task 5 |
f_legge | 17:bc25d5f47bab | 142 | T5.start(); // Start task 5 timer |
f_legge | 17:bc25d5f47bab | 143 | |
f_legge | 17:bc25d5f47bab | 144 | lcd->locate(0,0); // First character set to top left |
f_legge | 17:bc25d5f47bab | 145 | // Print freqency, Switch 1 and Error code to LCD |
f_legge | 17:bc25d5f47bab | 146 | lcd->printf("%4.f %d %d",freq,switch_state,error_code); |
f_legge | 17:bc25d5f47bab | 147 | |
f_legge | 17:bc25d5f47bab | 148 | T5.stop(); // Stop task 5 timer |
f_legge | 16:bebcc7d24f3e | 149 | |
f_legge | 17:bc25d5f47bab | 150 | lcd->locate(1,9); // Printing time to complete task 5 (ms) |
f_legge | 17:bc25d5f47bab | 151 | lcd->printf("%.1f",(T5.read()*1000)); |
f_legge | 17:bc25d5f47bab | 152 | } |
f_legge | 16:bebcc7d24f3e | 153 | |
f_legge | 17:bc25d5f47bab | 154 | void Task5b(void) // 22.7 ms |
f_legge | 17:bc25d5f47bab | 155 | { |
f_legge | 17:bc25d5f47bab | 156 | T5.reset(); // Reset timer for task 5 |
f_legge | 17:bc25d5f47bab | 157 | T5.start(); // Start task 5 timer |
f_legge | 17:bc25d5f47bab | 158 | |
f_legge | 17:bc25d5f47bab | 159 | lcd->locate(1,0); // First character set to bottom left |
f_legge | 17:bc25d5f47bab | 160 | // Print Analogue values to LCD |
f_legge | 17:bc25d5f47bab | 161 | lcd->printf("%1.1f %1.1f",A1_val,A2_val); |
f_legge | 16:bebcc7d24f3e | 162 | |
f_legge | 17:bc25d5f47bab | 163 | T5.stop(); // Stop task 5 timer |
f_legge | 16:bebcc7d24f3e | 164 | |
f_legge | 17:bc25d5f47bab | 165 | lcd->locate(1,9); // Printing time to complete task 5 (ms) |
f_legge | 17:bc25d5f47bab | 166 | lcd->printf("%.1f",(T5.read()*1000)); |
f_legge | 13:ad04937ca366 | 167 | } |
f_legge | 13:ad04937ca366 | 168 | |
f_legge | 13:ad04937ca366 | 169 | //////////////////////////////////////////////////////////////////////////////// |
f_legge | 13:ad04937ca366 | 170 | // |
f_legge | 17:bc25d5f47bab | 171 | // Error check |
f_legge | 17:bc25d5f47bab | 172 | // 3us |
f_legge | 17:bc25d5f47bab | 173 | // |
f_legge | 13:ad04937ca366 | 174 | // Else error code 0 |
f_legge | 16:bebcc7d24f3e | 175 | // |
f_legge | 13:ad04937ca366 | 176 | void Task6(void) |
f_legge | 16:bebcc7d24f3e | 177 | { |
f_legge | 17:bc25d5f47bab | 178 | //T5.reset(); |
f_legge | 17:bc25d5f47bab | 179 | //T5.start(); |
f_legge | 17:bc25d5f47bab | 180 | |
f_legge | 17:bc25d5f47bab | 181 | // If switch_1 is ON & (average_analogue_in_1 > average_analogue_in_2) error code 3 |
f_legge | 17:bc25d5f47bab | 182 | if(switch_state == 1 && (A1_val > A2_val)) |
f_legge | 13:ad04937ca366 | 183 | error_code = 3; |
f_legge | 17:bc25d5f47bab | 184 | else // If conditions not met error code is 0 |
f_legge | 16:bebcc7d24f3e | 185 | error_code = 0; |
f_legge | 16:bebcc7d24f3e | 186 | |
f_legge | 17:bc25d5f47bab | 187 | //T5.stop(); |
f_legge | 16:bebcc7d24f3e | 188 | |
f_legge | 17:bc25d5f47bab | 189 | //lcd->locate(0,0); |
f_legge | 17:bc25d5f47bab | 190 | //lcd->printf("Error: %d", error_code); |
f_legge | 17:bc25d5f47bab | 191 | |
f_legge | 16:bebcc7d24f3e | 192 | //lcd->locate(1,0); |
f_legge | 17:bc25d5f47bab | 193 | //lcd->printf("%f",T5.read()); |
f_legge | 13:ad04937ca366 | 194 | } |
f_legge | 13:ad04937ca366 | 195 | |
f_legge | 13:ad04937ca366 | 196 | //////////////////////////////////////////////////////////////////////////////// |
f_legge | 13:ad04937ca366 | 197 | // |
f_legge | 13:ad04937ca366 | 198 | // Log frequency, digital and filtered analogue values to uSD |
f_legge | 17:bc25d5f47bab | 199 | // 21ms |
f_legge | 16:bebcc7d24f3e | 200 | // |
f_legge | 13:ad04937ca366 | 201 | void Task7(void) |
f_legge | 13:ad04937ca366 | 202 | { |
f_legge | 17:bc25d5f47bab | 203 | //T5.reset(); |
f_legge | 17:bc25d5f47bab | 204 | //T5.start(); |
f_legge | 17:bc25d5f47bab | 205 | |
f_legge | 17:bc25d5f47bab | 206 | logcount++; // Increment logcount |
f_legge | 17:bc25d5f47bab | 207 | // Saving logcount, frequency, Switch 1 and analogue input values to .txt |
f_legge | 17:bc25d5f47bab | 208 | fprintf(fp,"%d,%fHz,%d,%fV,%fV\n",logcount,freq,switch_state,A1_val,A2_val); |
f_legge | 17:bc25d5f47bab | 209 | |
f_legge | 17:bc25d5f47bab | 210 | //T5.stop(); |
f_legge | 17:bc25d5f47bab | 211 | |
f_legge | 17:bc25d5f47bab | 212 | //lcd->locate(1,0); |
f_legge | 17:bc25d5f47bab | 213 | //lcd->printf("%f",T5.read()); |
f_legge | 13:ad04937ca366 | 214 | } |
f_legge | 13:ad04937ca366 | 215 | |
f_legge | 13:ad04937ca366 | 216 | //////////////////////////////////////////////////////////////////////////////// |
f_legge | 13:ad04937ca366 | 217 | // |
f_legge | 16:bebcc7d24f3e | 218 | // Shutdown on switch |
f_legge | 17:bc25d5f47bab | 219 | // 3us when DS_s == 0 |
f_legge | 17:bc25d5f47bab | 220 | // N/A when DS_s == 1 |
f_legge | 16:bebcc7d24f3e | 221 | // |
f_legge | 16:bebcc7d24f3e | 222 | void Task8() |
f_legge | 13:ad04937ca366 | 223 | { |
f_legge | 17:bc25d5f47bab | 224 | //T5.reset(); |
f_legge | 17:bc25d5f47bab | 225 | //T5.start(); |
f_legge | 17:bc25d5f47bab | 226 | |
f_legge | 17:bc25d5f47bab | 227 | if(DS_s == 1) { // If shutdown switch is high |
f_legge | 17:bc25d5f47bab | 228 | ticker.detach(); // Stop ticker |
f_legge | 17:bc25d5f47bab | 229 | |
f_legge | 17:bc25d5f47bab | 230 | fprintf(fp, "\nCyclic Executive stopped\n"); // Show uSD detach |
f_legge | 17:bc25d5f47bab | 231 | fclose(fp); // Detach uSD |
f_legge | 17:bc25d5f47bab | 232 | |
f_legge | 17:bc25d5f47bab | 233 | //T5.stop(); |
f_legge | 17:bc25d5f47bab | 234 | |
f_legge | 17:bc25d5f47bab | 235 | //lcd->locate(1,0); |
f_legge | 17:bc25d5f47bab | 236 | //lcd->printf("%f",T5.read()); |
f_legge | 17:bc25d5f47bab | 237 | |
f_legge | 17:bc25d5f47bab | 238 | } |
f_legge | 17:bc25d5f47bab | 239 | else { |
f_legge | 17:bc25d5f47bab | 240 | //T5.stop(); |
f_legge | 13:ad04937ca366 | 241 | } |
f_legge | 13:ad04937ca366 | 242 | } |
f_legge | 14:ede0e7ed2745 | 243 | |
f_legge | 14:ede0e7ed2745 | 244 | |
f_legge | 14:ede0e7ed2745 | 245 | |
f_legge | 16:bebcc7d24f3e | 246 |