The present code executes a counter that checks current state and determines the next state.
Fork of 2645_FSM_Counter by
main.cpp@0:e8be38c50b44, 2016-01-06 (annotated)
- Committer:
- eencae
- Date:
- Wed Jan 06 12:08:57 2016 +0000
- Revision:
- 0:e8be38c50b44
- Child:
- 1:81b129bec569
Initial commit.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eencae | 0:e8be38c50b44 | 1 | /* |
eencae | 0:e8be38c50b44 | 2 | |
eencae | 0:e8be38c50b44 | 3 | 2645_Ticker |
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 | } |