UEBUNG - Statemachine Schalter - NO CLASS

Dependencies:   mbed LM75B

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?

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