![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
UEBUNG - Statemachine Schalter - NO CLASS
main.cpp@0:339ca0be8739, 2019-01-31 (annotated)
- Committer:
- Powers
- Date:
- Thu Jan 31 23:17:43 2019 +0000
- Revision:
- 0:339ca0be8739
UEBUNG - Statemachine SCHALTER - NO_CLASS
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Powers | 0:339ca0be8739 | 1 | |
Powers | 0:339ca0be8739 | 2 | /* |
Powers | 0:339ca0be8739 | 3 | ANGABE |
Powers | 0:339ca0be8739 | 4 | Schreiben Sie ein Programm für das M3 Board, dass einen Lichtschalter simuliert. |
Powers | 0:339ca0be8739 | 5 | Es soll LED1 nach betätigen des Schalters sw1 (Joy-Stick-Pins) ein bzw. ausgeschaltet |
Powers | 0:339ca0be8739 | 6 | werden (sie Interrupts, wobei Sie die Tasten-ISR nur für ein Flag verwenden dürfen, |
Powers | 0:339ca0be8739 | 7 | dass dem Programm ein Ein-/Ausschalten der Led signalisiert. |
Powers | 0:339ca0be8739 | 8 | |
Powers | 0:339ca0be8739 | 9 | |
Powers | 0:339ca0be8739 | 10 | Weitere Aufgaben |
Powers | 0:339ca0be8739 | 11 | |
Powers | 0:339ca0be8739 | 12 | Verwenden Sie für das Blinken der Led4 das Ticker Interface |
Powers | 0:339ca0be8739 | 13 | Messen Sie die Zeit zwischen zwei Tastendrücken durch die Verwendung des Timer Interfaces |
Powers | 0:339ca0be8739 | 14 | Fügen Sie den Zustand TimeOut hinzu (wie sieht das Zustandsdiagramm nun aus), der nach d |
Powers | 0:339ca0be8739 | 15 | rücken der Taste SW2 aus dem Zustand Ein in diesen Zustand TimeOut wechselt und die gemessene |
Powers | 0:339ca0be8739 | 16 | Zeit im Sekundentakt auf die Serielle Schnittstelle schreibt. |
Powers | 0:339ca0be8739 | 17 | |
Powers | 0:339ca0be8739 | 18 | Fügen Sie den Zustand TempOut hinzu (wie sieht das Zustandsdiagramm nun aus), |
Powers | 0:339ca0be8739 | 19 | der nach einem weiteren druck der Taste SW2 aus dem Zustand TimeOut in diesen |
Powers | 0:339ca0be8739 | 20 | Zustand TempOut wechselt und die Temperatur vom Temperatursensor LM75B im Sekundentakt |
Powers | 0:339ca0be8739 | 21 | auf die Serielle Schnittstelle schreibt. Durch nachmaliges drücken von SW2 soll wieder |
Powers | 0:339ca0be8739 | 22 | in den Zustand Ein geschaltet werden. |
Powers | 0:339ca0be8739 | 23 | |
Powers | 0:339ca0be8739 | 24 | Erweitern Sie das Zustandsdiagramm um den Error-State: Wenn für 10 Sekunden |
Powers | 0:339ca0be8739 | 25 | keine Taste gedrückt wird soll in den Zustand (Error) verzweigt werden. Verwenden |
Powers | 0:339ca0be8739 | 26 | Sie dafür das Timeout Interface |
Powers | 0:339ca0be8739 | 27 | */ |
Powers | 0:339ca0be8739 | 28 | |
Powers | 0:339ca0be8739 | 29 | |
Powers | 0:339ca0be8739 | 30 | |
Powers | 0:339ca0be8739 | 31 | #include "mbed.h" |
Powers | 0:339ca0be8739 | 32 | #include "LM75B.h" |
Powers | 0:339ca0be8739 | 33 | // WICHTIG - SENSOR LIBRARY HINZUFÜGEN - von Chris Styles - die mit den meisten Hits |
Powers | 0:339ca0be8739 | 34 | |
Powers | 0:339ca0be8739 | 35 | |
Powers | 0:339ca0be8739 | 36 | LM75B tmp(p28, p27); |
Powers | 0:339ca0be8739 | 37 | |
Powers | 0:339ca0be8739 | 38 | DigitalOut led1(LED1); |
Powers | 0:339ca0be8739 | 39 | DigitalOut led2(LED2); |
Powers | 0:339ca0be8739 | 40 | DigitalOut led3(LED3); |
Powers | 0:339ca0be8739 | 41 | DigitalOut led4(LED4); |
Powers | 0:339ca0be8739 | 42 | |
Powers | 0:339ca0be8739 | 43 | InterruptIn sw1(p14); // JoyCenter |
Powers | 0:339ca0be8739 | 44 | InterruptIn sw2(p15); // JoyUp |
Powers | 0:339ca0be8739 | 45 | |
Powers | 0:339ca0be8739 | 46 | // Prototyping |
Powers | 0:339ca0be8739 | 47 | |
Powers | 0:339ca0be8739 | 48 | void ON(void); |
Powers | 0:339ca0be8739 | 49 | void IDLE(void); |
Powers | 0:339ca0be8739 | 50 | void sw1Rise(void); |
Powers | 0:339ca0be8739 | 51 | void sw2Rise(void); |
Powers | 0:339ca0be8739 | 52 | bool checker(void); |
Powers | 0:339ca0be8739 | 53 | bool checkersw2(void); |
Powers | 0:339ca0be8739 | 54 | void time(void); |
Powers | 0:339ca0be8739 | 55 | void timeOut(void); |
Powers | 0:339ca0be8739 | 56 | void flipper(void); |
Powers | 0:339ca0be8739 | 57 | void tempOut(void); |
Powers | 0:339ca0be8739 | 58 | void timeOutError(void); |
Powers | 0:339ca0be8739 | 59 | void errorBlinken(void); |
Powers | 0:339ca0be8739 | 60 | void timeOver(void); |
Powers | 0:339ca0be8739 | 61 | |
Powers | 0:339ca0be8739 | 62 | bool volatile sw1Pressed; // Taster 1 pressed or not |
Powers | 0:339ca0be8739 | 63 | bool volatile sw2Pressed; // Taster 2 pressed or not |
Powers | 0:339ca0be8739 | 64 | enum Status {ST_IDLE=0, ST_ON, ST_TimeOut, ST_TempOut, ST_Error}; |
Powers | 0:339ca0be8739 | 65 | Status volatile status; |
Powers | 0:339ca0be8739 | 66 | Timer getTime; |
Powers | 0:339ca0be8739 | 67 | Ticker tickerflipper; |
Powers | 0:339ca0be8739 | 68 | Timeout removeTime; |
Powers | 0:339ca0be8739 | 69 | int counter; |
Powers | 0:339ca0be8739 | 70 | |
Powers | 0:339ca0be8739 | 71 | |
Powers | 0:339ca0be8739 | 72 | // Im main wird die Hauptschleife gestartet, welche mittels switch/case |
Powers | 0:339ca0be8739 | 73 | // die verschiedenen Zustände abfragt und die zugehörige Funktion startet |
Powers | 0:339ca0be8739 | 74 | // In jeder State-Funktion ist eine while Schleife die den eingabestatus |
Powers | 0:339ca0be8739 | 75 | // abfragt nur bei positiver Rueckmeldung diese verlässt |
Powers | 0:339ca0be8739 | 76 | int main(void) |
Powers | 0:339ca0be8739 | 77 | { |
Powers | 0:339ca0be8739 | 78 | sw1.rise(&sw1Rise); // Interrupt |
Powers | 0:339ca0be8739 | 79 | sw2.rise(&sw2Rise); // Interrupt |
Powers | 0:339ca0be8739 | 80 | |
Powers | 0:339ca0be8739 | 81 | // Initialisierung - Standard(START) Werte setzen |
Powers | 0:339ca0be8739 | 82 | status = ST_IDLE; |
Powers | 0:339ca0be8739 | 83 | sw1Pressed = 0; sw2Pressed = 0; |
Powers | 0:339ca0be8739 | 84 | led1 = 0; led2 = 0; led3 = 0; led4 = 0; |
Powers | 0:339ca0be8739 | 85 | counter = 0; |
Powers | 0:339ca0be8739 | 86 | |
Powers | 0:339ca0be8739 | 87 | |
Powers | 0:339ca0be8739 | 88 | // Diese while Schleife ist die Hauptschleife die nie verlassen wird |
Powers | 0:339ca0be8739 | 89 | // von ihr werden die Funktionen gestartet und in diesen wieder while |
Powers | 0:339ca0be8739 | 90 | // Schleifen, so kommt man mit fast keinen Variablen aus |
Powers | 0:339ca0be8739 | 91 | while(1) |
Powers | 0:339ca0be8739 | 92 | { |
Powers | 0:339ca0be8739 | 93 | switch(status) |
Powers | 0:339ca0be8739 | 94 | { |
Powers | 0:339ca0be8739 | 95 | case ST_IDLE: IDLE() ; break; |
Powers | 0:339ca0be8739 | 96 | case ST_ON: ON() ; break; |
Powers | 0:339ca0be8739 | 97 | case ST_TimeOut: timeOut() ; break; |
Powers | 0:339ca0be8739 | 98 | case ST_TempOut: tempOut() ; break; |
Powers | 0:339ca0be8739 | 99 | case ST_Error: timeOver() ; break; |
Powers | 0:339ca0be8739 | 100 | default: printf("ERROR") ; break; |
Powers | 0:339ca0be8739 | 101 | } |
Powers | 0:339ca0be8739 | 102 | |
Powers | 0:339ca0be8739 | 103 | } |
Powers | 0:339ca0be8739 | 104 | } |
Powers | 0:339ca0be8739 | 105 | |
Powers | 0:339ca0be8739 | 106 | // TIMEOUT |
Powers | 0:339ca0be8739 | 107 | void timeOver(void) |
Powers | 0:339ca0be8739 | 108 | { |
Powers | 0:339ca0be8739 | 109 | printf("Ende gut, Alles gut \n"); |
Powers | 0:339ca0be8739 | 110 | while(1) |
Powers | 0:339ca0be8739 | 111 | {} |
Powers | 0:339ca0be8739 | 112 | } |
Powers | 0:339ca0be8739 | 113 | |
Powers | 0:339ca0be8739 | 114 | // Für den Error TIcker im Zusstand TimeOut |
Powers | 0:339ca0be8739 | 115 | void errorBlinken(void) |
Powers | 0:339ca0be8739 | 116 | { |
Powers | 0:339ca0be8739 | 117 | led4 = !led4; |
Powers | 0:339ca0be8739 | 118 | } |
Powers | 0:339ca0be8739 | 119 | |
Powers | 0:339ca0be8739 | 120 | void timeOutError(void) |
Powers | 0:339ca0be8739 | 121 | { |
Powers | 0:339ca0be8739 | 122 | status = ST_Error; |
Powers | 0:339ca0be8739 | 123 | tickerflipper.attach(&errorBlinken, 0.3); |
Powers | 0:339ca0be8739 | 124 | printf("ERROR TIMEOUT \n"); |
Powers | 0:339ca0be8739 | 125 | printf("Status: %i \n", status); |
Powers | 0:339ca0be8739 | 126 | |
Powers | 0:339ca0be8739 | 127 | } |
Powers | 0:339ca0be8739 | 128 | |
Powers | 0:339ca0be8739 | 129 | void tempOut(void) |
Powers | 0:339ca0be8739 | 130 | { |
Powers | 0:339ca0be8739 | 131 | printf("void tempOut(void) \n"); |
Powers | 0:339ca0be8739 | 132 | int countertemp = 0; |
Powers | 0:339ca0be8739 | 133 | while(1) |
Powers | 0:339ca0be8739 | 134 | { |
Powers | 0:339ca0be8739 | 135 | printf("%f \n", tmp.read()); |
Powers | 0:339ca0be8739 | 136 | countertemp++; |
Powers | 0:339ca0be8739 | 137 | wait(1); |
Powers | 0:339ca0be8739 | 138 | |
Powers | 0:339ca0be8739 | 139 | if(checkersw2() == true) |
Powers | 0:339ca0be8739 | 140 | { |
Powers | 0:339ca0be8739 | 141 | status = ST_ON; |
Powers | 0:339ca0be8739 | 142 | return; |
Powers | 0:339ca0be8739 | 143 | } |
Powers | 0:339ca0be8739 | 144 | } |
Powers | 0:339ca0be8739 | 145 | } |
Powers | 0:339ca0be8739 | 146 | |
Powers | 0:339ca0be8739 | 147 | void timeOut(void) |
Powers | 0:339ca0be8739 | 148 | { |
Powers | 0:339ca0be8739 | 149 | printf("void timeOut(void) \n"); |
Powers | 0:339ca0be8739 | 150 | int counterto = 0; |
Powers | 0:339ca0be8739 | 151 | while(1) |
Powers | 0:339ca0be8739 | 152 | { |
Powers | 0:339ca0be8739 | 153 | printf("%i \n", counterto); |
Powers | 0:339ca0be8739 | 154 | counterto++; |
Powers | 0:339ca0be8739 | 155 | wait(1); |
Powers | 0:339ca0be8739 | 156 | if(checkersw2() == true) |
Powers | 0:339ca0be8739 | 157 | { |
Powers | 0:339ca0be8739 | 158 | status = ST_TempOut; |
Powers | 0:339ca0be8739 | 159 | return; |
Powers | 0:339ca0be8739 | 160 | } |
Powers | 0:339ca0be8739 | 161 | } |
Powers | 0:339ca0be8739 | 162 | } |
Powers | 0:339ca0be8739 | 163 | |
Powers | 0:339ca0be8739 | 164 | void sw2Rise(void) |
Powers | 0:339ca0be8739 | 165 | { |
Powers | 0:339ca0be8739 | 166 | printf("sw2Rise \n"); |
Powers | 0:339ca0be8739 | 167 | if(status == ST_ON || status == ST_TimeOut || status == ST_TempOut) sw2Pressed = true; |
Powers | 0:339ca0be8739 | 168 | wait(0.2); |
Powers | 0:339ca0be8739 | 169 | } |
Powers | 0:339ca0be8739 | 170 | |
Powers | 0:339ca0be8739 | 171 | bool checkersw2(void) |
Powers | 0:339ca0be8739 | 172 | { |
Powers | 0:339ca0be8739 | 173 | if(sw2Pressed == true) |
Powers | 0:339ca0be8739 | 174 | { |
Powers | 0:339ca0be8739 | 175 | printf("chckersw2 \n"); |
Powers | 0:339ca0be8739 | 176 | sw2Pressed = false; |
Powers | 0:339ca0be8739 | 177 | return true; |
Powers | 0:339ca0be8739 | 178 | } |
Powers | 0:339ca0be8739 | 179 | |
Powers | 0:339ca0be8739 | 180 | return false; |
Powers | 0:339ca0be8739 | 181 | } |
Powers | 0:339ca0be8739 | 182 | |
Powers | 0:339ca0be8739 | 183 | void time(void) |
Powers | 0:339ca0be8739 | 184 | { |
Powers | 0:339ca0be8739 | 185 | printf("time(void) \n"); |
Powers | 0:339ca0be8739 | 186 | if(getTime.read() == 0) getTime.start(); |
Powers | 0:339ca0be8739 | 187 | else |
Powers | 0:339ca0be8739 | 188 | { |
Powers | 0:339ca0be8739 | 189 | printf("Sekunden: %f \n", getTime.read()); |
Powers | 0:339ca0be8739 | 190 | getTime.reset(); |
Powers | 0:339ca0be8739 | 191 | } |
Powers | 0:339ca0be8739 | 192 | } |
Powers | 0:339ca0be8739 | 193 | |
Powers | 0:339ca0be8739 | 194 | bool checker(void) |
Powers | 0:339ca0be8739 | 195 | { |
Powers | 0:339ca0be8739 | 196 | if(sw1Pressed == true) |
Powers | 0:339ca0be8739 | 197 | { |
Powers | 0:339ca0be8739 | 198 | printf("checker(void) \n"); |
Powers | 0:339ca0be8739 | 199 | time(); |
Powers | 0:339ca0be8739 | 200 | sw1Pressed = false; |
Powers | 0:339ca0be8739 | 201 | return true; |
Powers | 0:339ca0be8739 | 202 | } |
Powers | 0:339ca0be8739 | 203 | |
Powers | 0:339ca0be8739 | 204 | return false; |
Powers | 0:339ca0be8739 | 205 | } |
Powers | 0:339ca0be8739 | 206 | |
Powers | 0:339ca0be8739 | 207 | void sw1Rise(void) |
Powers | 0:339ca0be8739 | 208 | { |
Powers | 0:339ca0be8739 | 209 | printf("sw1Rise(void) \n"); |
Powers | 0:339ca0be8739 | 210 | if(status == ST_ON || status == ST_IDLE) sw1Pressed = true; |
Powers | 0:339ca0be8739 | 211 | wait(0.2); |
Powers | 0:339ca0be8739 | 212 | } |
Powers | 0:339ca0be8739 | 213 | |
Powers | 0:339ca0be8739 | 214 | void ON(void) |
Powers | 0:339ca0be8739 | 215 | { |
Powers | 0:339ca0be8739 | 216 | printf("ON(void) \n"); |
Powers | 0:339ca0be8739 | 217 | tickerflipper.attach(&flipper, 0.5); |
Powers | 0:339ca0be8739 | 218 | removeTime.attach(&timeOutError, 10); |
Powers | 0:339ca0be8739 | 219 | led1 = true; |
Powers | 0:339ca0be8739 | 220 | while(1) |
Powers | 0:339ca0be8739 | 221 | { |
Powers | 0:339ca0be8739 | 222 | if(status == ST_Error) |
Powers | 0:339ca0be8739 | 223 | { |
Powers | 0:339ca0be8739 | 224 | printf("ON verlassen \n"); |
Powers | 0:339ca0be8739 | 225 | led1 = false; |
Powers | 0:339ca0be8739 | 226 | return; |
Powers | 0:339ca0be8739 | 227 | } |
Powers | 0:339ca0be8739 | 228 | |
Powers | 0:339ca0be8739 | 229 | if(checkersw2() == true) |
Powers | 0:339ca0be8739 | 230 | { |
Powers | 0:339ca0be8739 | 231 | status = ST_TimeOut; |
Powers | 0:339ca0be8739 | 232 | removeTime.detach(); |
Powers | 0:339ca0be8739 | 233 | return; |
Powers | 0:339ca0be8739 | 234 | } |
Powers | 0:339ca0be8739 | 235 | |
Powers | 0:339ca0be8739 | 236 | if(checker() == true) |
Powers | 0:339ca0be8739 | 237 | { |
Powers | 0:339ca0be8739 | 238 | status = ST_IDLE; |
Powers | 0:339ca0be8739 | 239 | led1 = false; |
Powers | 0:339ca0be8739 | 240 | removeTime.detach(); |
Powers | 0:339ca0be8739 | 241 | return; |
Powers | 0:339ca0be8739 | 242 | } |
Powers | 0:339ca0be8739 | 243 | } |
Powers | 0:339ca0be8739 | 244 | } |
Powers | 0:339ca0be8739 | 245 | |
Powers | 0:339ca0be8739 | 246 | void flipper(void) |
Powers | 0:339ca0be8739 | 247 | { |
Powers | 0:339ca0be8739 | 248 | printf("void flipper(void) \n"); |
Powers | 0:339ca0be8739 | 249 | |
Powers | 0:339ca0be8739 | 250 | led4 = !led4; |
Powers | 0:339ca0be8739 | 251 | |
Powers | 0:339ca0be8739 | 252 | if(counter == 3) |
Powers | 0:339ca0be8739 | 253 | { |
Powers | 0:339ca0be8739 | 254 | tickerflipper.detach(); |
Powers | 0:339ca0be8739 | 255 | counter = 0; |
Powers | 0:339ca0be8739 | 256 | } |
Powers | 0:339ca0be8739 | 257 | else counter++; |
Powers | 0:339ca0be8739 | 258 | } |
Powers | 0:339ca0be8739 | 259 | |
Powers | 0:339ca0be8739 | 260 | |
Powers | 0:339ca0be8739 | 261 | void IDLE(void) |
Powers | 0:339ca0be8739 | 262 | { |
Powers | 0:339ca0be8739 | 263 | removeTime.attach(&timeOutError, 10); |
Powers | 0:339ca0be8739 | 264 | printf("void IDLE(void) \n"); |
Powers | 0:339ca0be8739 | 265 | while(1) |
Powers | 0:339ca0be8739 | 266 | { |
Powers | 0:339ca0be8739 | 267 | |
Powers | 0:339ca0be8739 | 268 | if(status == ST_Error) |
Powers | 0:339ca0be8739 | 269 | { |
Powers | 0:339ca0be8739 | 270 | printf("IDLE verlassen \n"); |
Powers | 0:339ca0be8739 | 271 | return; |
Powers | 0:339ca0be8739 | 272 | } |
Powers | 0:339ca0be8739 | 273 | if(checker() == true) |
Powers | 0:339ca0be8739 | 274 | { |
Powers | 0:339ca0be8739 | 275 | status = ST_ON; |
Powers | 0:339ca0be8739 | 276 | removeTime.detach(); |
Powers | 0:339ca0be8739 | 277 | return; |
Powers | 0:339ca0be8739 | 278 | } |
Powers | 0:339ca0be8739 | 279 | } |
Powers | 0:339ca0be8739 | 280 | } |