chad

Dependencies:   MCP23017 WattBob_TextLCD mbed-rtos mbed

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?

UserRevisionLine numberNew 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