The present code executes a counter that checks current state and determines the next state.
Fork of 2645_FSM_Counter by
main.cpp@2:324696ae91a9, 2016-05-09 (annotated)
- Committer:
- bonnyngangu
- Date:
- Mon May 09 11:45:19 2016 +0000
- Revision:
- 2:324696ae91a9
- Parent:
- 1:81b129bec569
The counter checks which state we are in and see which the next state should be.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eencae | 0:e8be38c50b44 | 1 | /* |
eencae | 0:e8be38c50b44 | 2 | |
bonnyngangu | 2:324696ae91a9 | 3 | Task1_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 | |
bonnyngangu | 2:324696ae91a9 | 9 | (c) Bonny Ngangu, 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 | |
bonnyngangu | 2:324696ae91a9 | 15 | // K64F on-board 4 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); |
bonnyngangu | 2:324696ae91a9 | 19 | DigitalOut y_led(LED_BLUE); |
bonnyngangu | 2:324696ae91a9 | 20 | |
eencae | 0:e8be38c50b44 | 21 | // K64F on-board switches |
eencae | 0:e8be38c50b44 | 22 | InterruptIn sw2(SW2); |
eencae | 0:e8be38c50b44 | 23 | InterruptIn sw3(SW3); |
eencae | 0:e8be38c50b44 | 24 | |
eencae | 0:e8be38c50b44 | 25 | // LEDs to display counter output |
eencae | 0:e8be38c50b44 | 26 | // connect up external LEDs to these pins with appropriate current-limiting resistor |
eencae | 0:e8be38c50b44 | 27 | BusOut output(PTB2,PTB3,PTB10,PTB11); |
eencae | 0:e8be38c50b44 | 28 | |
eencae | 0:e8be38c50b44 | 29 | // array of states in the FSM, each element is the output of the counter |
bonnyngangu | 2:324696ae91a9 | 30 | int fsm[4] = {8,4,2,1}; //reversed order counter going down |
eencae | 0:e8be38c50b44 | 31 | |
eencae | 0:e8be38c50b44 | 32 | // function prototypes |
eencae | 0:e8be38c50b44 | 33 | // error function hangs flashing an LED |
eencae | 0:e8be38c50b44 | 34 | void error(); |
eencae | 0:e8be38c50b44 | 35 | // set-up the on-board LEDs and switches |
eencae | 0:e8be38c50b44 | 36 | void init_K64F(); |
eencae | 0:e8be38c50b44 | 37 | |
eencae | 0:e8be38c50b44 | 38 | int main() |
eencae | 0:e8be38c50b44 | 39 | { |
eencae | 0:e8be38c50b44 | 40 | init_K64F(); |
eencae | 0:e8be38c50b44 | 41 | // set inital state |
eencae | 0:e8be38c50b44 | 42 | int state = 0; |
eencae | 0:e8be38c50b44 | 43 | |
eencae | 0:e8be38c50b44 | 44 | while(1) { // loop forever |
eencae | 0:e8be38c50b44 | 45 | |
eencae | 0:e8be38c50b44 | 46 | output = fsm[state]; // output current state |
eencae | 0:e8be38c50b44 | 47 | |
eencae | 0:e8be38c50b44 | 48 | // check which state we are in and see which the next state should be |
eencae | 0:e8be38c50b44 | 49 | switch(state) { |
bonnyngangu | 2:324696ae91a9 | 50 | case 0://0 |
bonnyngangu | 2:324696ae91a9 | 51 | state = 1;//1 |
eencae | 0:e8be38c50b44 | 52 | break; |
bonnyngangu | 2:324696ae91a9 | 53 | case 1://1 |
bonnyngangu | 2:324696ae91a9 | 54 | state = 2;//2 |
eencae | 0:e8be38c50b44 | 55 | break; |
bonnyngangu | 2:324696ae91a9 | 56 | case 2://2 |
bonnyngangu | 2:324696ae91a9 | 57 | state = 3;//3 |
eencae | 0:e8be38c50b44 | 58 | break; |
bonnyngangu | 2:324696ae91a9 | 59 | case 3://3 |
bonnyngangu | 2:324696ae91a9 | 60 | state = 0;//0 |
eencae | 0:e8be38c50b44 | 61 | break; |
eencae | 0:e8be38c50b44 | 62 | default: |
eencae | 0:e8be38c50b44 | 63 | error(); //invalid state - call error routine |
eencae | 0:e8be38c50b44 | 64 | // or could jump to starting state i.e. state = 0 |
eencae | 0:e8be38c50b44 | 65 | break; |
eencae | 0:e8be38c50b44 | 66 | } |
eencae | 0:e8be38c50b44 | 67 | |
eencae | 0:e8be38c50b44 | 68 | wait(0.2); // small delay |
eencae | 0:e8be38c50b44 | 69 | |
eencae | 0:e8be38c50b44 | 70 | } |
eencae | 0:e8be38c50b44 | 71 | } |
eencae | 0:e8be38c50b44 | 72 | |
eencae | 0:e8be38c50b44 | 73 | void init_K64F() |
eencae | 0:e8be38c50b44 | 74 | { |
eencae | 0:e8be38c50b44 | 75 | // on-board LEDs are active-low, so set pin high to turn them off. |
eencae | 0:e8be38c50b44 | 76 | r_led = 1; |
eencae | 0:e8be38c50b44 | 77 | g_led = 1; |
bonnyngangu | 2:324696ae91a9 | 78 | b_led = 1; |
bonnyngangu | 2:324696ae91a9 | 79 | y_led = 1; |
eencae | 0:e8be38c50b44 | 80 | |
eencae | 0:e8be38c50b44 | 81 | // since the on-board switches have external pull-ups, we should disable the internal pull-down |
eencae | 0:e8be38c50b44 | 82 | // resistors that are enabled by default using InterruptIn |
eencae | 0:e8be38c50b44 | 83 | sw2.mode(PullNone); |
eencae | 0:e8be38c50b44 | 84 | sw3.mode(PullNone); |
eencae | 0:e8be38c50b44 | 85 | |
eencae | 0:e8be38c50b44 | 86 | } |
eencae | 0:e8be38c50b44 | 87 | |
eencae | 0:e8be38c50b44 | 88 | void error() |
eencae | 0:e8be38c50b44 | 89 | { |
eencae | 0:e8be38c50b44 | 90 | while(1) { // if error, hang while flashing error message |
eencae | 0:e8be38c50b44 | 91 | r_led = 0; |
eencae | 0:e8be38c50b44 | 92 | wait(0.2); |
eencae | 0:e8be38c50b44 | 93 | r_led = 1; |
eencae | 0:e8be38c50b44 | 94 | wait(0.2); |
eencae | 0:e8be38c50b44 | 95 | } |
eencae | 0:e8be38c50b44 | 96 | } |