Markus Höbel
/
TINF_Test_STM_Hoebel
Projekt TINF 7ABELI
mAIn_1.cpp@0:603870fc1af3, 2018-11-29 (annotated)
- Committer:
- markus286
- Date:
- Thu Nov 29 17:15:55 2018 +0000
- Revision:
- 0:603870fc1af3
- Child:
- 1:125e4981a54c
Projekt TINF 7ABELI
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
markus286 | 0:603870fc1af3 | 1 | #include "mbed.h" |
markus286 | 0:603870fc1af3 | 2 | #include "C12832.h" |
markus286 | 0:603870fc1af3 | 3 | |
markus286 | 0:603870fc1af3 | 4 | BusOut doLeds(LED1,LED2,LED3,LED4); |
markus286 | 0:603870fc1af3 | 5 | InterruptIn SW1(p14); |
markus286 | 0:603870fc1af3 | 6 | InterruptIn SW2(p15); |
markus286 | 0:603870fc1af3 | 7 | InterruptIn SW3(p12); |
markus286 | 0:603870fc1af3 | 8 | InterruptIn SW4(p16); |
markus286 | 0:603870fc1af3 | 9 | |
markus286 | 0:603870fc1af3 | 10 | Ticker T1; |
markus286 | 0:603870fc1af3 | 11 | Timer T2; |
markus286 | 0:603870fc1af3 | 12 | volatile float timerValue = 0; |
markus286 | 0:603870fc1af3 | 13 | volatile int blinkCount = 0; |
markus286 | 0:603870fc1af3 | 14 | |
markus286 | 0:603870fc1af3 | 15 | //************** LCD **************** |
markus286 | 0:603870fc1af3 | 16 | |
markus286 | 0:603870fc1af3 | 17 | C12832 lcd(p5, p7, p6, p8, p11); |
markus286 | 0:603870fc1af3 | 18 | |
markus286 | 0:603870fc1af3 | 19 | //************* VARIABLEN **************** |
markus286 | 0:603870fc1af3 | 20 | |
markus286 | 0:603870fc1af3 | 21 | enum State {ST_AUS=0, ST_EIN, ST_TIMEOUT}; |
markus286 | 0:603870fc1af3 | 22 | State state; |
markus286 | 0:603870fc1af3 | 23 | |
markus286 | 0:603870fc1af3 | 24 | bool pressed1 = false, pressed2 = false; |
markus286 | 0:603870fc1af3 | 25 | |
markus286 | 0:603870fc1af3 | 26 | //************* andere Funktionen **************** |
markus286 | 0:603870fc1af3 | 27 | |
markus286 | 0:603870fc1af3 | 28 | void blink() |
markus286 | 0:603870fc1af3 | 29 | { |
markus286 | 0:603870fc1af3 | 30 | blinkCount++; |
markus286 | 0:603870fc1af3 | 31 | |
markus286 | 0:603870fc1af3 | 32 | Led4 = !Led4; |
markus286 | 0:603870fc1af3 | 33 | } |
markus286 | 0:603870fc1af3 | 34 | |
markus286 | 0:603870fc1af3 | 35 | |
markus286 | 0:603870fc1af3 | 36 | //************* EREIGNISSE **************** |
markus286 | 0:603870fc1af3 | 37 | |
markus286 | 0:603870fc1af3 | 38 | void rise1(void) |
markus286 | 0:603870fc1af3 | 39 | { |
markus286 | 0:603870fc1af3 | 40 | wait_ms(100); //Entprellung |
markus286 | 0:603870fc1af3 | 41 | pressed1 = true; |
markus286 | 0:603870fc1af3 | 42 | |
markus286 | 0:603870fc1af3 | 43 | timerValue = T2.read(); |
markus286 | 0:603870fc1af3 | 44 | T2.reset(); |
markus286 | 0:603870fc1af3 | 45 | T2.start(); |
markus286 | 0:603870fc1af3 | 46 | } |
markus286 | 0:603870fc1af3 | 47 | |
markus286 | 0:603870fc1af3 | 48 | bool CheckFlag1() |
markus286 | 0:603870fc1af3 | 49 | { |
markus286 | 0:603870fc1af3 | 50 | if (pressed1) { |
markus286 | 0:603870fc1af3 | 51 | pressed1=false; |
markus286 | 0:603870fc1af3 | 52 | return true; |
markus286 | 0:603870fc1af3 | 53 | } |
markus286 | 0:603870fc1af3 | 54 | return false; |
markus286 | 0:603870fc1af3 | 55 | } |
markus286 | 0:603870fc1af3 | 56 | |
markus286 | 0:603870fc1af3 | 57 | void rise2(void) |
markus286 | 0:603870fc1af3 | 58 | { |
markus286 | 0:603870fc1af3 | 59 | wait_ms(100); |
markus286 | 0:603870fc1af3 | 60 | if(state == ST_EIN) pressed2 = true; |
markus286 | 0:603870fc1af3 | 61 | } |
markus286 | 0:603870fc1af3 | 62 | |
markus286 | 0:603870fc1af3 | 63 | bool CheckFlag2() |
markus286 | 0:603870fc1af3 | 64 | { |
markus286 | 0:603870fc1af3 | 65 | if (pressed2) { |
markus286 | 0:603870fc1af3 | 66 | pressed2=false; |
markus286 | 0:603870fc1af3 | 67 | return true; |
markus286 | 0:603870fc1af3 | 68 | } |
markus286 | 0:603870fc1af3 | 69 | return false; |
markus286 | 0:603870fc1af3 | 70 | } |
markus286 | 0:603870fc1af3 | 71 | |
markus286 | 0:603870fc1af3 | 72 | //************* STATES **************** |
markus286 | 0:603870fc1af3 | 73 | |
markus286 | 0:603870fc1af3 | 74 | void ST_Aus (void) |
markus286 | 0:603870fc1af3 | 75 | { |
markus286 | 0:603870fc1af3 | 76 | //Status auf LCD und Serial |
markus286 | 0:603870fc1af3 | 77 | lcd.cls(); // löscht lcd (clear screen) |
markus286 | 0:603870fc1af3 | 78 | lcd.locate(0,0); // x-position, y-position (x: 0-128; y: 0-32) |
markus286 | 0:603870fc1af3 | 79 | lcd.printf("State: 1 (Aus)"); |
markus286 | 0:603870fc1af3 | 80 | printf("State: 1 (Aus)"); |
markus286 | 0:603870fc1af3 | 81 | // entry |
markus286 | 0:603870fc1af3 | 82 | |
markus286 | 0:603870fc1af3 | 83 | // do |
markus286 | 0:603870fc1af3 | 84 | while(true) { |
markus286 | 0:603870fc1af3 | 85 | Led1 = 0; |
markus286 | 0:603870fc1af3 | 86 | |
markus286 | 0:603870fc1af3 | 87 | if(CheckFlag1()) { |
markus286 | 0:603870fc1af3 | 88 | state = ST_EIN; |
markus286 | 0:603870fc1af3 | 89 | |
markus286 | 0:603870fc1af3 | 90 | // exit |
markus286 | 0:603870fc1af3 | 91 | return; |
markus286 | 0:603870fc1af3 | 92 | } |
markus286 | 0:603870fc1af3 | 93 | } |
markus286 | 0:603870fc1af3 | 94 | } |
markus286 | 0:603870fc1af3 | 95 | |
markus286 | 0:603870fc1af3 | 96 | void ST_Ein (void) |
markus286 | 0:603870fc1af3 | 97 | { |
markus286 | 0:603870fc1af3 | 98 | //Status auf LCD und Serial |
markus286 | 0:603870fc1af3 | 99 | lcd.cls(); // löscht lcd (clear screen) |
markus286 | 0:603870fc1af3 | 100 | lcd.locate(0,0); // x-position, y-position (x: 0-128; y: 0-32) |
markus286 | 0:603870fc1af3 | 101 | lcd.printf("State: 2 (Ein)"); |
markus286 | 0:603870fc1af3 | 102 | printf("State: 2 (Ein)"); |
markus286 | 0:603870fc1af3 | 103 | |
markus286 | 0:603870fc1af3 | 104 | // entry |
markus286 | 0:603870fc1af3 | 105 | T1.attach(&blink, 0.3); |
markus286 | 0:603870fc1af3 | 106 | while (true) |
markus286 | 0:603870fc1af3 | 107 | { |
markus286 | 0:603870fc1af3 | 108 | if(blinkCount >= 4) break; |
markus286 | 0:603870fc1af3 | 109 | } |
markus286 | 0:603870fc1af3 | 110 | T1.detach(); |
markus286 | 0:603870fc1af3 | 111 | blinkCount = 0; |
markus286 | 0:603870fc1af3 | 112 | |
markus286 | 0:603870fc1af3 | 113 | // do |
markus286 | 0:603870fc1af3 | 114 | while(true) { |
markus286 | 0:603870fc1af3 | 115 | Led1 = 1; |
markus286 | 0:603870fc1af3 | 116 | |
markus286 | 0:603870fc1af3 | 117 | if(CheckFlag1()) { |
markus286 | 0:603870fc1af3 | 118 | state = ST_AUS; |
markus286 | 0:603870fc1af3 | 119 | // exit |
markus286 | 0:603870fc1af3 | 120 | return; |
markus286 | 0:603870fc1af3 | 121 | } |
markus286 | 0:603870fc1af3 | 122 | |
markus286 | 0:603870fc1af3 | 123 | if(CheckFlag2()) { |
markus286 | 0:603870fc1af3 | 124 | state = ST_TIMEOUT; |
markus286 | 0:603870fc1af3 | 125 | // exit |
markus286 | 0:603870fc1af3 | 126 | return; |
markus286 | 0:603870fc1af3 | 127 | } |
markus286 | 0:603870fc1af3 | 128 | } |
markus286 | 0:603870fc1af3 | 129 | } |
markus286 | 0:603870fc1af3 | 130 | |
markus286 | 0:603870fc1af3 | 131 | void ST_TimeOut (void) |
markus286 | 0:603870fc1af3 | 132 | { |
markus286 | 0:603870fc1af3 | 133 | //Status auf LCD und Serial |
markus286 | 0:603870fc1af3 | 134 | lcd.cls(); // löscht lcd (clear screen) |
markus286 | 0:603870fc1af3 | 135 | lcd.locate(0,0); // x-position, y-position (x: 0-128; y: 0-32) |
markus286 | 0:603870fc1af3 | 136 | lcd.printf("State: 3 (TimeOut)"); |
markus286 | 0:603870fc1af3 | 137 | printf("State: 3 (TimeOut)"); |
markus286 | 0:603870fc1af3 | 138 | |
markus286 | 0:603870fc1af3 | 139 | // entry |
markus286 | 0:603870fc1af3 | 140 | |
markus286 | 0:603870fc1af3 | 141 | |
markus286 | 0:603870fc1af3 | 142 | // do |
markus286 | 0:603870fc1af3 | 143 | while(true) { |
markus286 | 0:603870fc1af3 | 144 | lcd.locate(0,12); // x-position, y-position (x: 0-128; y: 0-32) |
markus286 | 0:603870fc1af3 | 145 | lcd.printf("Time: %f", timerValue); |
markus286 | 0:603870fc1af3 | 146 | printf("Time: %f", timerValue); |
markus286 | 0:603870fc1af3 | 147 | |
markus286 | 0:603870fc1af3 | 148 | // exit |
markus286 | 0:603870fc1af3 | 149 | |
markus286 | 0:603870fc1af3 | 150 | } |
markus286 | 0:603870fc1af3 | 151 | } |
markus286 | 0:603870fc1af3 | 152 | |
markus286 | 0:603870fc1af3 | 153 | void ST_Error (void) |
markus286 | 0:603870fc1af3 | 154 | { |
markus286 | 0:603870fc1af3 | 155 | //Status auf LCD und Serial |
markus286 | 0:603870fc1af3 | 156 | lcd.cls(); // löscht lcd (clear screen) |
markus286 | 0:603870fc1af3 | 157 | lcd.locate(0,0); // x-position, y-position (x: 0-128; y: 0-32) |
markus286 | 0:603870fc1af3 | 158 | lcd.printf("State: ERROR!!!"); |
markus286 | 0:603870fc1af3 | 159 | printf("State: ERROR!!!"); |
markus286 | 0:603870fc1af3 | 160 | return; |
markus286 | 0:603870fc1af3 | 161 | } |
markus286 | 0:603870fc1af3 | 162 | |
markus286 | 0:603870fc1af3 | 163 | //************* STATE MACHINE **************** |
markus286 | 0:603870fc1af3 | 164 | |
markus286 | 0:603870fc1af3 | 165 | void stateMachine() |
markus286 | 0:603870fc1af3 | 166 | { |
markus286 | 0:603870fc1af3 | 167 | switch (state) |
markus286 | 0:603870fc1af3 | 168 | { |
markus286 | 0:603870fc1af3 | 169 | case ST_AUS: ST_Aus(); |
markus286 | 0:603870fc1af3 | 170 | break; |
markus286 | 0:603870fc1af3 | 171 | case ST_EIN: ST_Ein(); |
markus286 | 0:603870fc1af3 | 172 | break; |
markus286 | 0:603870fc1af3 | 173 | case ST_TIMEOUT: ST_TimeOut(); |
markus286 | 0:603870fc1af3 | 174 | break; |
markus286 | 0:603870fc1af3 | 175 | default: ST_Error(); // sollte nicht auftreten :-) |
markus286 | 0:603870fc1af3 | 176 | break; |
markus286 | 0:603870fc1af3 | 177 | } |
markus286 | 0:603870fc1af3 | 178 | } |
markus286 | 0:603870fc1af3 | 179 | |
markus286 | 0:603870fc1af3 | 180 | //************* MAIN **************** |
markus286 | 0:603870fc1af3 | 181 | |
markus286 | 0:603870fc1af3 | 182 | int main() |
markus286 | 0:603870fc1af3 | 183 | { |
markus286 | 0:603870fc1af3 | 184 | SW1.rise(&rise1); //.fall(&fall); |
markus286 | 0:603870fc1af3 | 185 | SW2.rise(&rise2); |
markus286 | 0:603870fc1af3 | 186 | state = ST_AUS; |
markus286 | 0:603870fc1af3 | 187 | while(true){ |
markus286 | 0:603870fc1af3 | 188 | stateMachine(); |
markus286 | 0:603870fc1af3 | 189 | } |
markus286 | 0:603870fc1af3 | 190 | } |
markus286 | 0:603870fc1af3 | 191 | |
markus286 | 0:603870fc1af3 | 192 | class IsAnEvent : public InterruptIn { |
markus286 | 0:603870fc1af3 | 193 | volatile int16_t _pressed; |
markus286 | 0:603870fc1af3 | 194 | void _RisingISR(); |
markus286 | 0:603870fc1af3 | 195 | public: |
markus286 | 0:603870fc1af3 | 196 | IsAnEvent() : InterruptIn(p15) {}; |
markus286 | 0:603870fc1af3 | 197 | IsAnEvent(PinName pin) : InterruptIn(pin) { |
markus286 | 0:603870fc1af3 | 198 | rise(callback(this, &IsAnEvent::_RisingISR)); |
markus286 | 0:603870fc1af3 | 199 | _pressed=0; |
markus286 | 0:603870fc1af3 | 200 | }; |
markus286 | 0:603870fc1af3 | 201 | int CheckFlag(); |
markus286 | 0:603870fc1af3 | 202 | void InitIsr(); |
markus286 | 0:603870fc1af3 | 203 | }; |
markus286 | 0:603870fc1af3 | 204 | |
markus286 | 0:603870fc1af3 | 205 | void IsAnEvent::InitIsr() { |
markus286 | 0:603870fc1af3 | 206 | rise(callback(this, &IsAnEvent::_RisingISR)); |
markus286 | 0:603870fc1af3 | 207 | } |
markus286 | 0:603870fc1af3 | 208 | |
markus286 | 0:603870fc1af3 | 209 | void IsAnEvent::_RisingISR() { |
markus286 | 0:603870fc1af3 | 210 | wait_ms(50); |
markus286 | 0:603870fc1af3 | 211 | if( read() ) |
markus286 | 0:603870fc1af3 | 212 | _pressed = true; |
markus286 | 0:603870fc1af3 | 213 | } |
markus286 | 0:603870fc1af3 | 214 | int IsAnEvent::CheckFlag() { |
markus286 | 0:603870fc1af3 | 215 | if( _pressed ) { |
markus286 | 0:603870fc1af3 | 216 | _pressed = false; |
markus286 | 0:603870fc1af3 | 217 | return 1; |
markus286 | 0:603870fc1af3 | 218 | } |
markus286 | 0:603870fc1af3 | 219 | return 0; |
markus286 | 0:603870fc1af3 | 220 | } |
markus286 | 0:603870fc1af3 | 221 |