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:fb324de02b7f, 2017-12-20 (annotated)
- Committer:
- eencae
- Date:
- Wed Dec 20 11:53:00 2017 +0000
- Revision:
- 1:fb324de02b7f
- Parent:
- 0:c5278b91719f
- Child:
- 2:2a0738a294df
Updated mbed library and pins/outputs for Gamepad.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| eencae | 0:c5278b91719f | 1 | /* |
| eencae | 0:c5278b91719f | 2 | |
| eencae | 0:c5278b91719f | 3 | 2645_FSM_UpDown_Counter |
| eencae | 0:c5278b91719f | 4 | |
| eencae | 1:fb324de02b7f | 5 | Sample code from ELEC2645 |
| eencae | 0:c5278b91719f | 6 | |
| eencae | 0:c5278b91719f | 7 | Demonstrates how to implement a simple FSM up/down counter |
| eencae | 0:c5278b91719f | 8 | |
| eencae | 0:c5278b91719f | 9 | (c) Craig A. Evans, University of Leeds, Jan 2016 |
| eencae | 0:c5278b91719f | 10 | |
| eencae | 0:c5278b91719f | 11 | */ |
| eencae | 0:c5278b91719f | 12 | |
| eencae | 0:c5278b91719f | 13 | #include "mbed.h" |
| eencae | 0:c5278b91719f | 14 | |
| eencae | 0:c5278b91719f | 15 | // pre-processor directives |
| eencae | 0:c5278b91719f | 16 | |
| eencae | 0:c5278b91719f | 17 | // defines directions as 0/1. Note UPPERCASE |
| eencae | 0:c5278b91719f | 18 | #define UP 0 |
| eencae | 0:c5278b91719f | 19 | #define DOWN 1 |
| eencae | 0:c5278b91719f | 20 | |
| eencae | 0:c5278b91719f | 21 | // K64F on-board LEDs |
| eencae | 0:c5278b91719f | 22 | DigitalOut r_led(LED_RED); |
| eencae | 0:c5278b91719f | 23 | DigitalOut g_led(LED_GREEN); |
| eencae | 0:c5278b91719f | 24 | DigitalOut b_led(LED_BLUE); |
| eencae | 0:c5278b91719f | 25 | // K64F on-board switches |
| eencae | 0:c5278b91719f | 26 | InterruptIn sw2(SW2); |
| eencae | 0:c5278b91719f | 27 | InterruptIn sw3(SW3); |
| eencae | 1:fb324de02b7f | 28 | // Gamepad Button A |
| eencae | 1:fb324de02b7f | 29 | InterruptIn buttonA(PTB9); |
| eencae | 0:c5278b91719f | 30 | |
| eencae | 1:fb324de02b7f | 31 | // LEDs on Gamepad (1 to 4) - active-low 0 = on and 1 = off |
| eencae | 1:fb324de02b7f | 32 | BusOut output(PTA1,PTA2,PTC2,PTC3); |
| eencae | 0:c5278b91719f | 33 | |
| eencae | 0:c5278b91719f | 34 | // array of states in the FSM, each element is the output of the counter |
| eencae | 1:fb324de02b7f | 35 | // set the output in binary to make it easier, 0 is LED on, 1 is LED off |
| eencae | 1:fb324de02b7f | 36 | int fsm[4] = {0b0111,0b1011,0b1101,0b1110}; |
| eencae | 0:c5278b91719f | 37 | |
| eencae | 0:c5278b91719f | 38 | // flag - must be volatile as changes within ISR |
| eencae | 0:c5278b91719f | 39 | // g_ prefix makes it easier to distinguish it as global |
| eencae | 1:fb324de02b7f | 40 | volatile int g_buttonA_flag = 0; |
| eencae | 0:c5278b91719f | 41 | |
| eencae | 0:c5278b91719f | 42 | // function prototypes |
| eencae | 0:c5278b91719f | 43 | // set-up the on-board LEDs and switches |
| eencae | 0:c5278b91719f | 44 | void init_K64F(); |
| eencae | 1:fb324de02b7f | 45 | // Button A interrupt service routine |
| eencae | 1:fb324de02b7f | 46 | void buttonA_isr(); |
| eencae | 0:c5278b91719f | 47 | |
| eencae | 0:c5278b91719f | 48 | int main() |
| eencae | 0:c5278b91719f | 49 | { |
| eencae | 0:c5278b91719f | 50 | // initialise on-board LED and switches |
| eencae | 0:c5278b91719f | 51 | init_K64F(); |
| eencae | 0:c5278b91719f | 52 | |
| eencae | 1:fb324de02b7f | 53 | // Button A is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister |
| eencae | 1:fb324de02b7f | 54 | buttonA.mode(PullDown); |
| eencae | 1:fb324de02b7f | 55 | |
| eencae | 1:fb324de02b7f | 56 | // It will return 0 by default and a 1 when pressed i.e. cause a rising edge |
| eencae | 1:fb324de02b7f | 57 | buttonA.rise(&buttonA_isr); |
| eencae | 0:c5278b91719f | 58 | |
| eencae | 0:c5278b91719f | 59 | // set inital state |
| eencae | 0:c5278b91719f | 60 | int state = 0; |
| eencae | 0:c5278b91719f | 61 | // set initial direction |
| eencae | 0:c5278b91719f | 62 | int direction = UP; |
| eencae | 0:c5278b91719f | 63 | |
| eencae | 0:c5278b91719f | 64 | while(1) { // loop forever |
| eencae | 0:c5278b91719f | 65 | |
| eencae | 0:c5278b91719f | 66 | // check if flag i.e. interrupt has occured |
| eencae | 1:fb324de02b7f | 67 | if (g_buttonA_flag) { |
| eencae | 1:fb324de02b7f | 68 | g_buttonA_flag = 0; // if it has, clear the flag |
| eencae | 0:c5278b91719f | 69 | |
| eencae | 0:c5278b91719f | 70 | // swap direction when button has been pressed |
| eencae | 0:c5278b91719f | 71 | // (could just use ! but want this to be explicit to aid understanding) |
| eencae | 0:c5278b91719f | 72 | if (direction == UP) { |
| eencae | 0:c5278b91719f | 73 | direction = DOWN; |
| eencae | 0:c5278b91719f | 74 | } |
| eencae | 0:c5278b91719f | 75 | else { |
| eencae | 0:c5278b91719f | 76 | direction = UP; |
| eencae | 0:c5278b91719f | 77 | } |
| eencae | 0:c5278b91719f | 78 | } |
| eencae | 0:c5278b91719f | 79 | |
| eencae | 0:c5278b91719f | 80 | output = fsm[state]; // output current state |
| eencae | 0:c5278b91719f | 81 | |
| eencae | 0:c5278b91719f | 82 | // check which state we are in and see which the next state should be next depending on direction |
| eencae | 0:c5278b91719f | 83 | switch(state) { |
| eencae | 0:c5278b91719f | 84 | case 0: |
| eencae | 0:c5278b91719f | 85 | switch(direction) { |
| eencae | 0:c5278b91719f | 86 | case UP: |
| eencae | 0:c5278b91719f | 87 | state = 1; |
| eencae | 0:c5278b91719f | 88 | break; |
| eencae | 0:c5278b91719f | 89 | case DOWN: |
| eencae | 0:c5278b91719f | 90 | state = 3; |
| eencae | 0:c5278b91719f | 91 | break; |
| eencae | 0:c5278b91719f | 92 | } |
| eencae | 0:c5278b91719f | 93 | break; |
| eencae | 0:c5278b91719f | 94 | case 1: |
| eencae | 0:c5278b91719f | 95 | switch(direction) { |
| eencae | 0:c5278b91719f | 96 | case UP: |
| eencae | 0:c5278b91719f | 97 | state = 2; |
| eencae | 0:c5278b91719f | 98 | break; |
| eencae | 0:c5278b91719f | 99 | case DOWN: |
| eencae | 0:c5278b91719f | 100 | state = 0; |
| eencae | 0:c5278b91719f | 101 | break; |
| eencae | 0:c5278b91719f | 102 | } |
| eencae | 0:c5278b91719f | 103 | break; |
| eencae | 0:c5278b91719f | 104 | case 2: |
| eencae | 0:c5278b91719f | 105 | switch(direction) { |
| eencae | 0:c5278b91719f | 106 | case UP: |
| eencae | 0:c5278b91719f | 107 | state = 3; |
| eencae | 0:c5278b91719f | 108 | break; |
| eencae | 0:c5278b91719f | 109 | case DOWN: |
| eencae | 0:c5278b91719f | 110 | state = 1; |
| eencae | 0:c5278b91719f | 111 | break; |
| eencae | 0:c5278b91719f | 112 | } |
| eencae | 0:c5278b91719f | 113 | break; |
| eencae | 0:c5278b91719f | 114 | case 3: |
| eencae | 0:c5278b91719f | 115 | switch(direction) { |
| eencae | 0:c5278b91719f | 116 | case UP: |
| eencae | 0:c5278b91719f | 117 | state = 0; |
| eencae | 0:c5278b91719f | 118 | break; |
| eencae | 0:c5278b91719f | 119 | case DOWN: |
| eencae | 0:c5278b91719f | 120 | state = 2; |
| eencae | 0:c5278b91719f | 121 | break; |
| eencae | 0:c5278b91719f | 122 | } |
| eencae | 0:c5278b91719f | 123 | break; |
| eencae | 0:c5278b91719f | 124 | default: // default case |
| eencae | 1:fb324de02b7f | 125 | error("Invalid state!"); //invalid state - call error routine |
| eencae | 0:c5278b91719f | 126 | // or could jump to starting state i.e. state = 0 |
| eencae | 0:c5278b91719f | 127 | break; |
| eencae | 0:c5278b91719f | 128 | } |
| eencae | 0:c5278b91719f | 129 | |
| eencae | 1:fb324de02b7f | 130 | wait(0.5); // small delay |
| eencae | 0:c5278b91719f | 131 | |
| eencae | 0:c5278b91719f | 132 | |
| eencae | 0:c5278b91719f | 133 | } |
| eencae | 0:c5278b91719f | 134 | } |
| eencae | 0:c5278b91719f | 135 | |
| eencae | 0:c5278b91719f | 136 | void init_K64F() |
| eencae | 0:c5278b91719f | 137 | { |
| eencae | 0:c5278b91719f | 138 | // on-board LEDs are active-low, so set pin high to turn them off. |
| eencae | 0:c5278b91719f | 139 | r_led = 1; |
| eencae | 0:c5278b91719f | 140 | g_led = 1; |
| eencae | 0:c5278b91719f | 141 | b_led = 1; |
| eencae | 0:c5278b91719f | 142 | |
| eencae | 0:c5278b91719f | 143 | // since the on-board switches have external pull-ups, we should disable the internal pull-down |
| eencae | 0:c5278b91719f | 144 | // resistors that are enabled by default using InterruptIn |
| eencae | 0:c5278b91719f | 145 | sw2.mode(PullNone); |
| eencae | 0:c5278b91719f | 146 | sw3.mode(PullNone); |
| eencae | 0:c5278b91719f | 147 | |
| eencae | 0:c5278b91719f | 148 | } |
| eencae | 0:c5278b91719f | 149 | |
| eencae | 1:fb324de02b7f | 150 | // Button A event-triggered interrupt |
| eencae | 1:fb324de02b7f | 151 | void buttonA_isr() |
| eencae | 0:c5278b91719f | 152 | { |
| eencae | 1:fb324de02b7f | 153 | g_buttonA_flag = 1; // set flag in ISR |
| eencae | 0:c5278b91719f | 154 | } |