Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@1:9d9040c75f6b, 2017-01-19 (annotated)
- Committer:
- eencae
- Date:
- Thu Jan 19 19:38:13 2017 +0000
- Revision:
- 1:9d9040c75f6b
- Parent:
- 0:49ec0f45aa1c
- Child:
- 2:15b8db916ece
Remove C-like typedef from State struct and leave it as C++-type struct
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| eencae | 0:49ec0f45aa1c | 1 | /* |
| eencae | 0:49ec0f45aa1c | 2 | |
| eencae | 0:49ec0f45aa1c | 3 | 2645_FSM_UpDown_Counter_Transition_Table |
| eencae | 0:49ec0f45aa1c | 4 | |
| eencae | 0:49ec0f45aa1c | 5 | Sample code from ELEC2645 Week 16 Lab |
| eencae | 0:49ec0f45aa1c | 6 | |
| eencae | 0:49ec0f45aa1c | 7 | Demonstrates how to implement a simple FSM up/down counter using a transition table |
| eencae | 0:49ec0f45aa1c | 8 | |
| eencae | 0:49ec0f45aa1c | 9 | (c) Craig A. Evans, University of Leeds, Jan 2016 |
| eencae | 0:49ec0f45aa1c | 10 | |
| eencae | 0:49ec0f45aa1c | 11 | */ |
| eencae | 0:49ec0f45aa1c | 12 | |
| eencae | 0:49ec0f45aa1c | 13 | #include "mbed.h" |
| eencae | 0:49ec0f45aa1c | 14 | |
| eencae | 0:49ec0f45aa1c | 15 | // pre-processor directives |
| eencae | 0:49ec0f45aa1c | 16 | |
| eencae | 0:49ec0f45aa1c | 17 | // defines directions as 0/1. Note UPPERCASE |
| eencae | 0:49ec0f45aa1c | 18 | #define UP 0 |
| eencae | 0:49ec0f45aa1c | 19 | #define DOWN 1 |
| eencae | 0:49ec0f45aa1c | 20 | |
| eencae | 0:49ec0f45aa1c | 21 | // K64F on-board LEDs |
| eencae | 0:49ec0f45aa1c | 22 | DigitalOut r_led(LED_RED); |
| eencae | 0:49ec0f45aa1c | 23 | DigitalOut g_led(LED_GREEN); |
| eencae | 0:49ec0f45aa1c | 24 | DigitalOut b_led(LED_BLUE); |
| eencae | 0:49ec0f45aa1c | 25 | // K64F on-board switches |
| eencae | 0:49ec0f45aa1c | 26 | InterruptIn sw2(SW2); |
| eencae | 0:49ec0f45aa1c | 27 | InterruptIn sw3(SW3); |
| eencae | 0:49ec0f45aa1c | 28 | // LEDs to display counter output |
| eencae | 0:49ec0f45aa1c | 29 | // connect up external LEDs to these pins with appropriate current-limiting resistor |
| eencae | 0:49ec0f45aa1c | 30 | BusOut output(PTB2,PTB3,PTB10,PTB11); |
| eencae | 0:49ec0f45aa1c | 31 | |
| eencae | 0:49ec0f45aa1c | 32 | // struct for state |
| eencae | 0:49ec0f45aa1c | 33 | struct State { |
| eencae | 0:49ec0f45aa1c | 34 | int output; // output value for current state |
| eencae | 0:49ec0f45aa1c | 35 | float time; // wait time for state |
| eencae | 0:49ec0f45aa1c | 36 | int next_state[2]; // next state (depending on direction 0 - UP, 1 - DOWN) |
| eencae | 0:49ec0f45aa1c | 37 | }; |
| eencae | 1:9d9040c75f6b | 38 | //typedef const struct State STyp; |
| eencae | 0:49ec0f45aa1c | 39 | |
| eencae | 0:49ec0f45aa1c | 40 | // array of states in the FSM, each element is the output of the counter, wait time, next state(s) |
| eencae | 1:9d9040c75f6b | 41 | State fsm[4] = { |
| eencae | 0:49ec0f45aa1c | 42 | {1,0.2,{1,3}}, |
| eencae | 0:49ec0f45aa1c | 43 | {2,0.2,{2,0}}, |
| eencae | 0:49ec0f45aa1c | 44 | {4,0.2,{3,1}}, |
| eencae | 0:49ec0f45aa1c | 45 | {8,0.2,{0,2}} |
| eencae | 0:49ec0f45aa1c | 46 | }; |
| eencae | 0:49ec0f45aa1c | 47 | |
| eencae | 0:49ec0f45aa1c | 48 | // flag - must be volatile as changes within ISR |
| eencae | 0:49ec0f45aa1c | 49 | // g_ prefix makes it easier to distinguish it as global |
| eencae | 0:49ec0f45aa1c | 50 | volatile int g_sw2_flag = 0; |
| eencae | 0:49ec0f45aa1c | 51 | |
| eencae | 0:49ec0f45aa1c | 52 | // function prototypes |
| eencae | 0:49ec0f45aa1c | 53 | // error function hangs flashing an LED |
| eencae | 0:49ec0f45aa1c | 54 | void error(); |
| eencae | 0:49ec0f45aa1c | 55 | // set-up the on-board LEDs and switches |
| eencae | 0:49ec0f45aa1c | 56 | void init_K64F(); |
| eencae | 0:49ec0f45aa1c | 57 | // SW2 interrupt service routine |
| eencae | 0:49ec0f45aa1c | 58 | void sw2_isr(); |
| eencae | 0:49ec0f45aa1c | 59 | |
| eencae | 0:49ec0f45aa1c | 60 | int main() |
| eencae | 0:49ec0f45aa1c | 61 | { |
| eencae | 0:49ec0f45aa1c | 62 | // initialise on-board LED and switches |
| eencae | 0:49ec0f45aa1c | 63 | init_K64F(); |
| eencae | 0:49ec0f45aa1c | 64 | |
| eencae | 0:49ec0f45aa1c | 65 | // SW2 has a pull-up resistor, so the pin will be at 3.3 V by default |
| eencae | 0:49ec0f45aa1c | 66 | // and fall to 0 V when pressed. We therefore need to look for a falling edge |
| eencae | 0:49ec0f45aa1c | 67 | // on the pin to fire the interrupt |
| eencae | 0:49ec0f45aa1c | 68 | sw2.fall(&sw2_isr); |
| eencae | 0:49ec0f45aa1c | 69 | |
| eencae | 0:49ec0f45aa1c | 70 | // set initial state |
| eencae | 0:49ec0f45aa1c | 71 | int state = 0; |
| eencae | 0:49ec0f45aa1c | 72 | // set initial direction |
| eencae | 0:49ec0f45aa1c | 73 | int direction = UP; |
| eencae | 0:49ec0f45aa1c | 74 | |
| eencae | 0:49ec0f45aa1c | 75 | while(1) { // loop forever |
| eencae | 0:49ec0f45aa1c | 76 | |
| eencae | 0:49ec0f45aa1c | 77 | // check if flag i.e. interrupt has occured |
| eencae | 0:49ec0f45aa1c | 78 | if (g_sw2_flag) { |
| eencae | 0:49ec0f45aa1c | 79 | g_sw2_flag = 0; // if it has, clear the flag |
| eencae | 0:49ec0f45aa1c | 80 | // swap direction when button has been pressed |
| eencae | 0:49ec0f45aa1c | 81 | direction = ! direction; |
| eencae | 0:49ec0f45aa1c | 82 | } |
| eencae | 0:49ec0f45aa1c | 83 | |
| eencae | 0:49ec0f45aa1c | 84 | // set output of current state (use dot syntax to access struct members) |
| eencae | 0:49ec0f45aa1c | 85 | output = fsm[state].output; |
| eencae | 0:49ec0f45aa1c | 86 | // implement required delay |
| eencae | 0:49ec0f45aa1c | 87 | wait(fsm[state].time); |
| eencae | 0:49ec0f45aa1c | 88 | // set the next state depending on direction |
| eencae | 0:49ec0f45aa1c | 89 | state = fsm[state].next_state[direction]; |
| eencae | 0:49ec0f45aa1c | 90 | |
| eencae | 0:49ec0f45aa1c | 91 | } |
| eencae | 0:49ec0f45aa1c | 92 | } |
| eencae | 0:49ec0f45aa1c | 93 | |
| eencae | 0:49ec0f45aa1c | 94 | void init_K64F() |
| eencae | 0:49ec0f45aa1c | 95 | { |
| eencae | 0:49ec0f45aa1c | 96 | // on-board LEDs are active-low, so set pin high to turn them off. |
| eencae | 0:49ec0f45aa1c | 97 | r_led = 1; |
| eencae | 0:49ec0f45aa1c | 98 | g_led = 1; |
| eencae | 0:49ec0f45aa1c | 99 | b_led = 1; |
| eencae | 0:49ec0f45aa1c | 100 | |
| eencae | 0:49ec0f45aa1c | 101 | // since the on-board switches have external pull-ups, we should disable the internal pull-down |
| eencae | 0:49ec0f45aa1c | 102 | // resistors that are enabled by default using InterruptIn |
| eencae | 0:49ec0f45aa1c | 103 | sw2.mode(PullNone); |
| eencae | 0:49ec0f45aa1c | 104 | sw3.mode(PullNone); |
| eencae | 0:49ec0f45aa1c | 105 | |
| eencae | 0:49ec0f45aa1c | 106 | } |
| eencae | 0:49ec0f45aa1c | 107 | |
| eencae | 0:49ec0f45aa1c | 108 | void error() |
| eencae | 0:49ec0f45aa1c | 109 | { |
| eencae | 0:49ec0f45aa1c | 110 | while(1) { // if error, hang while flashing error message |
| eencae | 0:49ec0f45aa1c | 111 | r_led = 0; |
| eencae | 0:49ec0f45aa1c | 112 | wait(0.2); |
| eencae | 0:49ec0f45aa1c | 113 | r_led = 1; |
| eencae | 0:49ec0f45aa1c | 114 | wait(0.2); |
| eencae | 0:49ec0f45aa1c | 115 | } |
| eencae | 0:49ec0f45aa1c | 116 | } |
| eencae | 0:49ec0f45aa1c | 117 | |
| eencae | 0:49ec0f45aa1c | 118 | // SW2 event-triggered interrupt |
| eencae | 0:49ec0f45aa1c | 119 | void sw2_isr() |
| eencae | 0:49ec0f45aa1c | 120 | { |
| eencae | 0:49ec0f45aa1c | 121 | g_sw2_flag = 1; // set flag in ISR |
| eencae | 0:49ec0f45aa1c | 122 | } |