Markus Müller
/
StateMachine_02
StateMachine
Diff: main.cpp
- Revision:
- 0:965e1122fba3
diff -r 000000000000 -r 965e1122fba3 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Oct 28 17:52:40 2014 +0000 @@ -0,0 +1,218 @@ +#include "mbed.h" + +/* Modulname: SM_FahrradLeuchte1.c Version:1.0 */ +/* Funktion: State-Machine-Programm */ +/* Erstellt von: p0ckin3d am: 2014-10-28 */ +/* Beschreibung: */ +// Fahrradrückleuchte mit 4 roten LEDs am PORTC +// ----------------------------------- +// Zum Schalten: 1 Taster PINA PA0 +// 1. Funktion +// Start-Taste 1x betätigen: +// Dauerlicht aller 4 LEDs +// 2. Funktion +// Start-Taste ein 2.mal betätigen: +// LEDs blinken im ca. 400 Millisekunden-Takt; 200 msec Ein, 200 msec Aus +// Ausschalten des Rücklichts +// Die Start-Taste ein 3.mal betätigen: +// Alle LEDs aus. + + +//volatile uint8_t count; +volatile unsigned int count; +volatile unsigned int newEvent =0; +volatile unsigned int event=0, state=0; + +Ticker timer0; +BusOut myleds(LED1, LED2, LED3, LED4); +DigitalIn center(p14); + +/* Prototypen der Funktionen */ +int no_fu(); +int ledsEin(); +int msec300TimerOn(); +int ledsAusTimerOff(); +int ledsTogglen(); +int nightRiderTest(); +int nightRider(); + +bool doNightRider = false; +bool upwards = true; +int ledCounter = 1; + +/****************************************************/ +/* Tabelle fuer die naechsten Zustaende bei Eingabe */ +/****************************************************/ +unsigned char nextstate_tab[3][4]= +//present state 0 1 2 3 +//------------------------ +/* event 0 */{{ 1, 2, 3, 0 }, // next +/* event 1 */ { 0, 1, 2, 3 }, // state +/* event 2 */ { 0, 1, 2, 3 }}; // state +// state=nextstate_tab[event][state]; // gehe auf naechsten Zustand + +/*************************************************************/ +/* Tabelle fuer Aktionsroutinen fuer die Zustaende bei Input */ +/*************************************************************/ +// p r e s e n t s t a t e +int(*action[3][4])()= // 0 1 2 3 +/* event 0 */ {{ ledsEin, msec300TimerOn, nightRiderTest, ledsAusTimerOff }, +/* event 1 */ { no_fu, no_fu, ledsTogglen, no_fu }, +/* event 2 */ { no_fu, no_fu, no_fu, nightRider }}; +// (*action[event][state])(); // suche in Tabelle nach Funktion + + +/* Aktionsroutinen, functions */ +int no_fu() // keine function - tue nichts +{ + return(0); +} + +int nightRiderTest() +{ + doNightRider = true; + return(2); +} + +int nightRider() +{ + myleds = ledCounter; + + if(ledCounter == 8) + upwards = false; + else if(ledCounter == 1) + upwards = true; + + if(upwards) + ledCounter*=2; + else + ledCounter/=2; + + return 4; +} + +// interrupt SR +void timer0_int() +{ + //Increment our variable + count++; + if(count==10) + { + count=0; + + if(doNightRider) + event=2; + else + event=1; + + newEvent = 1; + } +} + +int msec300TimerOn() +{ + timer0.attach(&timer0_int, 0.032); + doNightRider = false; + return(1); +} + +int ledsAusTimerOff() +{ + timer0.detach(); + myleds = 0; + doNightRider = false; + return(3); +} + +int ledsTogglen() +{ + myleds = ~myleds; + return(3); +} + +int ledsEin() +{ + myleds = 0x0F; + return(4); +} + +// functions +void initTimer0() +{ + count=0; +} + +// Diese Funktion ist zum Entprellen von Tastern geeignet: +// Durch den zusätzlichen Code kann eine Entprellzeit von durchschnittlich 1,5-4ms +// (mindestens 8*150us = 1,2ms) erreicht werden. +// Grundsätzlich prüft die Funktion den Pegel der Pins auf einem bestimmten Port. +// Wenn die/der Pegel 8 Mal konstant war, wird die Schleife verlassen. +// Diese Funktion kann sehr gut eingesetzt werden, um in einer Endlosschleife Taster anzufragen, +// da sie, wie erwähnt, eine kurze Wartezeit hat. +unsigned char debounce(PinName name, unsigned char samples) +{ + DigitalIn joystick(name); + + unsigned char i = 0; + + for(unsigned char j=0; j < samples; j++) + { + if(joystick == 1) + j++; + else + { + j = 0; + i++; + } + + if(j == samples) + break; + + if(i == samples) + break; + + wait(0.001); + } + return joystick; +} + + +int main() +{ + unsigned char released = 0; + + myleds = 0; + initTimer0(); + + newEvent = 0; + state=0; + event=0; + + while(1) + { + //debounce(p14, 6); + if(debounce(P0_10, 6)) // jetzt stabilen Wert einlesen + { + if (released == 1) + { + event =0; + newEvent =1; + released =0; + } + } + else + { + released =1; + } + + if (newEvent) + { + timer0.detach(); + newEvent =0; + (*action[event][state])(); // suche in Tabelle nach Funktion + state=nextstate_tab[event][state]; // gehe auf naechsten Zustand + timer0.attach(&timer0_int, 0.032); + } + } +} +