Demonstrates how to implement a simple FSM counter

Dependencies:   mbed

Committer:
eencae
Date:
Wed Jan 06 12:24:45 2016 +0000
Revision:
1:81b129bec569
Parent:
0:e8be38c50b44
Child:
2:bdd8b01141d1
Corrected name in comments.

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 0:e8be38c50b44 5 Sample code from ELEC2645 Week 16 Lab
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 0:e8be38c50b44 23 // LEDs to display counter output
eencae 0:e8be38c50b44 24 // connect up external LEDs to these pins with appropriate current-limiting resistor
eencae 0:e8be38c50b44 25 BusOut output(PTB2,PTB3,PTB10,PTB11);
eencae 0:e8be38c50b44 26
eencae 0:e8be38c50b44 27 // array of states in the FSM, each element is the output of the counter
eencae 0:e8be38c50b44 28 int fsm[4] = {1,2,4,8};
eencae 0:e8be38c50b44 29
eencae 0:e8be38c50b44 30 // function prototypes
eencae 0:e8be38c50b44 31 // error function hangs flashing an LED
eencae 0:e8be38c50b44 32 void error();
eencae 0:e8be38c50b44 33 // set-up the on-board LEDs and switches
eencae 0:e8be38c50b44 34 void init_K64F();
eencae 0:e8be38c50b44 35
eencae 0:e8be38c50b44 36 int main()
eencae 0:e8be38c50b44 37 {
eencae 0:e8be38c50b44 38 init_K64F();
eencae 0:e8be38c50b44 39 // set inital state
eencae 0:e8be38c50b44 40 int state = 0;
eencae 0:e8be38c50b44 41
eencae 0:e8be38c50b44 42 while(1) { // loop forever
eencae 0:e8be38c50b44 43
eencae 0:e8be38c50b44 44 output = fsm[state]; // output current state
eencae 0:e8be38c50b44 45
eencae 0:e8be38c50b44 46 // check which state we are in and see which the next state should be
eencae 0:e8be38c50b44 47 switch(state) {
eencae 0:e8be38c50b44 48 case 0:
eencae 0:e8be38c50b44 49 state = 1;
eencae 0:e8be38c50b44 50 break;
eencae 0:e8be38c50b44 51 case 1:
eencae 0:e8be38c50b44 52 state = 2;
eencae 0:e8be38c50b44 53 break;
eencae 0:e8be38c50b44 54 case 2:
eencae 0:e8be38c50b44 55 state = 3;
eencae 0:e8be38c50b44 56 break;
eencae 0:e8be38c50b44 57 case 3:
eencae 0:e8be38c50b44 58 state = 0;
eencae 0:e8be38c50b44 59 break;
eencae 0:e8be38c50b44 60 default:
eencae 0:e8be38c50b44 61 error(); //invalid state - call error routine
eencae 0:e8be38c50b44 62 // or could jump to starting state i.e. state = 0
eencae 0:e8be38c50b44 63 break;
eencae 0:e8be38c50b44 64 }
eencae 0:e8be38c50b44 65
eencae 0:e8be38c50b44 66 wait(0.2); // small delay
eencae 0:e8be38c50b44 67
eencae 0:e8be38c50b44 68 }
eencae 0:e8be38c50b44 69 }
eencae 0:e8be38c50b44 70
eencae 0:e8be38c50b44 71 void init_K64F()
eencae 0:e8be38c50b44 72 {
eencae 0:e8be38c50b44 73 // on-board LEDs are active-low, so set pin high to turn them off.
eencae 0:e8be38c50b44 74 r_led = 1;
eencae 0:e8be38c50b44 75 g_led = 1;
eencae 0:e8be38c50b44 76 b_led = 1;
eencae 0:e8be38c50b44 77
eencae 0:e8be38c50b44 78 // since the on-board switches have external pull-ups, we should disable the internal pull-down
eencae 0:e8be38c50b44 79 // resistors that are enabled by default using InterruptIn
eencae 0:e8be38c50b44 80 sw2.mode(PullNone);
eencae 0:e8be38c50b44 81 sw3.mode(PullNone);
eencae 0:e8be38c50b44 82
eencae 0:e8be38c50b44 83 }
eencae 0:e8be38c50b44 84
eencae 0:e8be38c50b44 85 void error()
eencae 0:e8be38c50b44 86 {
eencae 0:e8be38c50b44 87 while(1) { // if error, hang while flashing error message
eencae 0:e8be38c50b44 88 r_led = 0;
eencae 0:e8be38c50b44 89 wait(0.2);
eencae 0:e8be38c50b44 90 r_led = 1;
eencae 0:e8be38c50b44 91 wait(0.2);
eencae 0:e8be38c50b44 92 }
eencae 0:e8be38c50b44 93 }