Demonstrates how to implement a simple FSM counter

Dependencies:   mbed

Committer:
eencae
Date:
Wed Dec 20 11:40:20 2017 +0000
Revision:
2:bdd8b01141d1
Parent:
1:81b129bec569
Updated pins and output values for Gamepad.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 0:e8be38c50b44 1 /*
eencae 0:e8be38c50b44 2
eencae 1:81b129bec569 3 2645_FSM_Counter
eencae 0:e8be38c50b44 4
eencae 2:bdd8b01141d1 5 Sample code from ELEC2645
eencae 0:e8be38c50b44 6
eencae 0:e8be38c50b44 7 Demonstrates how to implement a simple FSM counter
eencae 0:e8be38c50b44 8
eencae 0:e8be38c50b44 9 (c) Craig A. Evans, University of Leeds, Jan 2016
eencae 0:e8be38c50b44 10
eencae 0:e8be38c50b44 11 */
eencae 0:e8be38c50b44 12
eencae 0:e8be38c50b44 13 #include "mbed.h"
eencae 0:e8be38c50b44 14
eencae 0:e8be38c50b44 15 // K64F on-board LEDs
eencae 0:e8be38c50b44 16 DigitalOut r_led(LED_RED);
eencae 0:e8be38c50b44 17 DigitalOut g_led(LED_GREEN);
eencae 0:e8be38c50b44 18 DigitalOut b_led(LED_BLUE);
eencae 0:e8be38c50b44 19 // K64F on-board switches
eencae 0:e8be38c50b44 20 InterruptIn sw2(SW2);
eencae 0:e8be38c50b44 21 InterruptIn sw3(SW3);
eencae 0:e8be38c50b44 22
eencae 2:bdd8b01141d1 23 // LEDs on Gamepad (1 to 4) - active-low 0 = on and 1 = off
eencae 2:bdd8b01141d1 24 BusOut output(PTA1,PTA2,PTC2,PTC3);
eencae 0:e8be38c50b44 25
eencae 0:e8be38c50b44 26 // array of states in the FSM, each element is the output of the counter
eencae 2:bdd8b01141d1 27 // set the output in binary to make it easier, 0 is LED on, 1 is LED off
eencae 2:bdd8b01141d1 28 int fsm[4] = {0b0111,0b1011,0b1101,0b1110};
eencae 0:e8be38c50b44 29
eencae 0:e8be38c50b44 30 // set-up the on-board LEDs and switches
eencae 0:e8be38c50b44 31 void init_K64F();
eencae 0:e8be38c50b44 32
eencae 0:e8be38c50b44 33 int main()
eencae 0:e8be38c50b44 34 {
eencae 0:e8be38c50b44 35 init_K64F();
eencae 0:e8be38c50b44 36 // set inital state
eencae 0:e8be38c50b44 37 int state = 0;
eencae 2:bdd8b01141d1 38
eencae 0:e8be38c50b44 39 while(1) { // loop forever
eencae 0:e8be38c50b44 40
eencae 0:e8be38c50b44 41 output = fsm[state]; // output current state
eencae 0:e8be38c50b44 42
eencae 0:e8be38c50b44 43 // check which state we are in and see which the next state should be
eencae 0:e8be38c50b44 44 switch(state) {
eencae 0:e8be38c50b44 45 case 0:
eencae 0:e8be38c50b44 46 state = 1;
eencae 0:e8be38c50b44 47 break;
eencae 0:e8be38c50b44 48 case 1:
eencae 0:e8be38c50b44 49 state = 2;
eencae 0:e8be38c50b44 50 break;
eencae 0:e8be38c50b44 51 case 2:
eencae 0:e8be38c50b44 52 state = 3;
eencae 0:e8be38c50b44 53 break;
eencae 0:e8be38c50b44 54 case 3:
eencae 0:e8be38c50b44 55 state = 0;
eencae 0:e8be38c50b44 56 break;
eencae 0:e8be38c50b44 57 default:
eencae 2:bdd8b01141d1 58 error("Invalid state"); //invalid state - call error routine
eencae 0:e8be38c50b44 59 // or could jump to starting state i.e. state = 0
eencae 0:e8be38c50b44 60 break;
eencae 0:e8be38c50b44 61 }
eencae 0:e8be38c50b44 62
eencae 2:bdd8b01141d1 63 wait(0.5); // small delay
eencae 0:e8be38c50b44 64
eencae 0:e8be38c50b44 65 }
eencae 0:e8be38c50b44 66 }
eencae 0:e8be38c50b44 67
eencae 0:e8be38c50b44 68 void init_K64F()
eencae 0:e8be38c50b44 69 {
eencae 0:e8be38c50b44 70 // on-board LEDs are active-low, so set pin high to turn them off.
eencae 0:e8be38c50b44 71 r_led = 1;
eencae 0:e8be38c50b44 72 g_led = 1;
eencae 0:e8be38c50b44 73 b_led = 1;
eencae 0:e8be38c50b44 74
eencae 0:e8be38c50b44 75 // since the on-board switches have external pull-ups, we should disable the internal pull-down
eencae 0:e8be38c50b44 76 // resistors that are enabled by default using InterruptIn
eencae 0:e8be38c50b44 77 sw2.mode(PullNone);
eencae 0:e8be38c50b44 78 sw3.mode(PullNone);
eencae 0:e8be38c50b44 79
eencae 0:e8be38c50b44 80 }