Craig Evans / Mbed 2 deprecated ELEC2645_FSM_UpDown_Counter_Transition_Table

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }