LED chaser, like Knightrider sequence. Speed of sequence is controlled using serial interrupts.

Dependencies:   mbed

Committer:
RandomSingh
Date:
Thu Jul 29 11:56:42 2010 +0000
Revision:
0:b44ffe9b1e5b

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RandomSingh 0:b44ffe9b1e5b 1 /******************************************************************************
RandomSingh 0:b44ffe9b1e5b 2 ¬ Knightrider.c ¬
RandomSingh 0:b44ffe9b1e5b 3 ¬ Uses the onboard LEDS on mBED to continuously perform LED chaser sequence ¬
RandomSingh 0:b44ffe9b1e5b 4 ¬ LED Chaser sequence timimg can be changed by using the serial comms and ¬
RandomSingh 0:b44ffe9b1e5b 5 ¬ activity on digital port. ¬
RandomSingh 0:b44ffe9b1e5b 6 ¬ ¬
RandomSingh 0:b44ffe9b1e5b 7 ¬ Written by RandomSingh. 05/2010 ¬
RandomSingh 0:b44ffe9b1e5b 8 ¬ ¬
RandomSingh 0:b44ffe9b1e5b 9 ******************************************************************************/
RandomSingh 0:b44ffe9b1e5b 10
RandomSingh 0:b44ffe9b1e5b 11 /* Libraries */
RandomSingh 0:b44ffe9b1e5b 12 #include "mbed.h"
RandomSingh 0:b44ffe9b1e5b 13
RandomSingh 0:b44ffe9b1e5b 14 /* Output Assignements */
RandomSingh 0:b44ffe9b1e5b 15 DigitalOut myled(LED1);
RandomSingh 0:b44ffe9b1e5b 16 DigitalOut myled2(LED2);
RandomSingh 0:b44ffe9b1e5b 17 DigitalOut myled3(LED3);
RandomSingh 0:b44ffe9b1e5b 18 DigitalOut myled4(LED4);
RandomSingh 0:b44ffe9b1e5b 19
RandomSingh 0:b44ffe9b1e5b 20 /* Input Assignments */
RandomSingh 0:b44ffe9b1e5b 21 DigitalIn enable(p5);
RandomSingh 0:b44ffe9b1e5b 22
RandomSingh 0:b44ffe9b1e5b 23 /* Interrupt Assignemnts */
RandomSingh 0:b44ffe9b1e5b 24 InterruptIn event(USBRX);
RandomSingh 0:b44ffe9b1e5b 25 InterruptIn event2(p16);
RandomSingh 0:b44ffe9b1e5b 26
RandomSingh 0:b44ffe9b1e5b 27 /* Serial Port Assignment */
RandomSingh 0:b44ffe9b1e5b 28 Serial pc(USBTX, USBRX); // tx, rx
RandomSingh 0:b44ffe9b1e5b 29
RandomSingh 0:b44ffe9b1e5b 30
RandomSingh 0:b44ffe9b1e5b 31 /* Macro Definitions */
RandomSingh 0:b44ffe9b1e5b 32 #define LONGER 0.9
RandomSingh 0:b44ffe9b1e5b 33 #define LONG 0.4
RandomSingh 0:b44ffe9b1e5b 34 #define SHORT 0.05
RandomSingh 0:b44ffe9b1e5b 35 #define FWD 0
RandomSingh 0:b44ffe9b1e5b 36 #define REV 1
RandomSingh 0:b44ffe9b1e5b 37 #define SLOW 0
RandomSingh 0:b44ffe9b1e5b 38 #define MEDIUM 1
RandomSingh 0:b44ffe9b1e5b 39 #define FAST 2
RandomSingh 0:b44ffe9b1e5b 40 #define ON 1
RandomSingh 0:b44ffe9b1e5b 41 #define OFF 0
RandomSingh 0:b44ffe9b1e5b 42
RandomSingh 0:b44ffe9b1e5b 43 /* Prototype Function declartions */
RandomSingh 0:b44ffe9b1e5b 44 void initialise_LEDS();
RandomSingh 0:b44ffe9b1e5b 45 void trigger();
RandomSingh 0:b44ffe9b1e5b 46 void LED_chaser_sequence();
RandomSingh 0:b44ffe9b1e5b 47
RandomSingh 0:b44ffe9b1e5b 48 /* External Variables */
RandomSingh 0:b44ffe9b1e5b 49 int timer;
RandomSingh 0:b44ffe9b1e5b 50 short speed;
RandomSingh 0:b44ffe9b1e5b 51 int direction = FWD;
RandomSingh 0:b44ffe9b1e5b 52 int phase;
RandomSingh 0:b44ffe9b1e5b 53
RandomSingh 0:b44ffe9b1e5b 54
RandomSingh 0:b44ffe9b1e5b 55
RandomSingh 0:b44ffe9b1e5b 56 int main() {
RandomSingh 0:b44ffe9b1e5b 57
RandomSingh 0:b44ffe9b1e5b 58 event.rise(&trigger); // Set up interrupts
RandomSingh 0:b44ffe9b1e5b 59 event2.rise(&trigger);
RandomSingh 0:b44ffe9b1e5b 60 initialise_LEDS();
RandomSingh 0:b44ffe9b1e5b 61 pc.printf("Speed is slow\r\n"); // Default speed is slow
RandomSingh 0:b44ffe9b1e5b 62
RandomSingh 0:b44ffe9b1e5b 63 while(1)
RandomSingh 0:b44ffe9b1e5b 64 {// Start of while
RandomSingh 0:b44ffe9b1e5b 65
RandomSingh 0:b44ffe9b1e5b 66 LED_chaser_sequence();
RandomSingh 0:b44ffe9b1e5b 67
RandomSingh 0:b44ffe9b1e5b 68 }// End of while
RandomSingh 0:b44ffe9b1e5b 69 }// End of main
RandomSingh 0:b44ffe9b1e5b 70
RandomSingh 0:b44ffe9b1e5b 71
RandomSingh 0:b44ffe9b1e5b 72 /******************************************************************************
RandomSingh 0:b44ffe9b1e5b 73 ¬ trigger function - ISR ¬
RandomSingh 0:b44ffe9b1e5b 74 ¬ If activity on the rx line of the serial port then this ISR executes ¬
RandomSingh 0:b44ffe9b1e5b 75 ¬ This ISR changes the external variable 'speed' value, which is used for ¬
RandomSingh 0:b44ffe9b1e5b 76 ¬ timing of the sequence. ¬
RandomSingh 0:b44ffe9b1e5b 77 ¬ ¬
RandomSingh 0:b44ffe9b1e5b 78 ¬ The objective of this ISR is to change the 'speed' value & transmit a ¬
RandomSingh 0:b44ffe9b1e5b 79 ¬ a message to the serial port. ¬
RandomSingh 0:b44ffe9b1e5b 80 ¬ ¬
RandomSingh 0:b44ffe9b1e5b 81 ******************************************************************************/
RandomSingh 0:b44ffe9b1e5b 82 void trigger()
RandomSingh 0:b44ffe9b1e5b 83 {// Start of trigger
RandomSingh 0:b44ffe9b1e5b 84 if(speed > FAST) // This bit of the code limits value of speed to 2
RandomSingh 0:b44ffe9b1e5b 85 {// Start of if // as there are only three levels of timing
RandomSingh 0:b44ffe9b1e5b 86 speed = SLOW;
RandomSingh 0:b44ffe9b1e5b 87 pc.printf("Speed is slow\r\n");
RandomSingh 0:b44ffe9b1e5b 88 }// End of if
RandomSingh 0:b44ffe9b1e5b 89 else
RandomSingh 0:b44ffe9b1e5b 90 {// Start of else
RandomSingh 0:b44ffe9b1e5b 91 speed++;
RandomSingh 0:b44ffe9b1e5b 92 }// End of else
RandomSingh 0:b44ffe9b1e5b 93
RandomSingh 0:b44ffe9b1e5b 94 if(speed == MEDIUM)
RandomSingh 0:b44ffe9b1e5b 95 pc.printf("Speed is medium\r\n");
RandomSingh 0:b44ffe9b1e5b 96
RandomSingh 0:b44ffe9b1e5b 97 if(speed == FAST)
RandomSingh 0:b44ffe9b1e5b 98 pc.printf("Speed is fast\r\n");
RandomSingh 0:b44ffe9b1e5b 99
RandomSingh 0:b44ffe9b1e5b 100 }// End of trigger
RandomSingh 0:b44ffe9b1e5b 101
RandomSingh 0:b44ffe9b1e5b 102 void LED_chaser_sequence()
RandomSingh 0:b44ffe9b1e5b 103 {// Start of LED_chaser_sequence
RandomSingh 0:b44ffe9b1e5b 104 switch(phase)
RandomSingh 0:b44ffe9b1e5b 105 {// Start of switch
RandomSingh 0:b44ffe9b1e5b 106 case 0: myled = OFF;
RandomSingh 0:b44ffe9b1e5b 107 myled2 = OFF;
RandomSingh 0:b44ffe9b1e5b 108 myled3 = OFF;
RandomSingh 0:b44ffe9b1e5b 109 myled4 = OFF;
RandomSingh 0:b44ffe9b1e5b 110 wait(LONG);
RandomSingh 0:b44ffe9b1e5b 111 wait(SHORT);
RandomSingh 0:b44ffe9b1e5b 112 direction = FWD;
RandomSingh 0:b44ffe9b1e5b 113 phase++;
RandomSingh 0:b44ffe9b1e5b 114 break;
RandomSingh 0:b44ffe9b1e5b 115 case 1: myled = ON;
RandomSingh 0:b44ffe9b1e5b 116 myled2 = OFF;
RandomSingh 0:b44ffe9b1e5b 117 myled3 = OFF;
RandomSingh 0:b44ffe9b1e5b 118 myled4 = OFF;
RandomSingh 0:b44ffe9b1e5b 119 wait(SHORT);
RandomSingh 0:b44ffe9b1e5b 120 if(direction == FWD)
RandomSingh 0:b44ffe9b1e5b 121 {// Start of if
RandomSingh 0:b44ffe9b1e5b 122 phase++;
RandomSingh 0:b44ffe9b1e5b 123 }// End of if
RandomSingh 0:b44ffe9b1e5b 124 else
RandomSingh 0:b44ffe9b1e5b 125 {// Start of else
RandomSingh 0:b44ffe9b1e5b 126 phase--;
RandomSingh 0:b44ffe9b1e5b 127 }// End of else
RandomSingh 0:b44ffe9b1e5b 128 break;
RandomSingh 0:b44ffe9b1e5b 129 case 2: myled = OFF;
RandomSingh 0:b44ffe9b1e5b 130 myled2 = ON;
RandomSingh 0:b44ffe9b1e5b 131 myled3 = OFF;
RandomSingh 0:b44ffe9b1e5b 132 myled4 = OFF;
RandomSingh 0:b44ffe9b1e5b 133 wait(SHORT);
RandomSingh 0:b44ffe9b1e5b 134 if(direction == FWD)
RandomSingh 0:b44ffe9b1e5b 135 {// Start of if
RandomSingh 0:b44ffe9b1e5b 136 phase++;
RandomSingh 0:b44ffe9b1e5b 137 }// End of if
RandomSingh 0:b44ffe9b1e5b 138 else
RandomSingh 0:b44ffe9b1e5b 139 {// Start of else
RandomSingh 0:b44ffe9b1e5b 140 phase--;
RandomSingh 0:b44ffe9b1e5b 141 }// End of else
RandomSingh 0:b44ffe9b1e5b 142 break;
RandomSingh 0:b44ffe9b1e5b 143 case 3: myled = OFF;
RandomSingh 0:b44ffe9b1e5b 144 myled2 = OFF;
RandomSingh 0:b44ffe9b1e5b 145 myled3 = ON;
RandomSingh 0:b44ffe9b1e5b 146 myled4 = OFF;
RandomSingh 0:b44ffe9b1e5b 147 wait(SHORT);
RandomSingh 0:b44ffe9b1e5b 148 if(direction == FWD)
RandomSingh 0:b44ffe9b1e5b 149 {// Start of if
RandomSingh 0:b44ffe9b1e5b 150 phase++;
RandomSingh 0:b44ffe9b1e5b 151 }// End of if
RandomSingh 0:b44ffe9b1e5b 152 else
RandomSingh 0:b44ffe9b1e5b 153 {// Start of else
RandomSingh 0:b44ffe9b1e5b 154 phase--;
RandomSingh 0:b44ffe9b1e5b 155 }// End of else
RandomSingh 0:b44ffe9b1e5b 156 break;
RandomSingh 0:b44ffe9b1e5b 157 case 4: myled = OFF;
RandomSingh 0:b44ffe9b1e5b 158 myled2 = OFF;
RandomSingh 0:b44ffe9b1e5b 159 myled3 = OFF;
RandomSingh 0:b44ffe9b1e5b 160 myled4 = ON;
RandomSingh 0:b44ffe9b1e5b 161 wait(SHORT);
RandomSingh 0:b44ffe9b1e5b 162 direction = REV;
RandomSingh 0:b44ffe9b1e5b 163 phase--;
RandomSingh 0:b44ffe9b1e5b 164 break;
RandomSingh 0:b44ffe9b1e5b 165 default :
RandomSingh 0:b44ffe9b1e5b 166 wait(SHORT);
RandomSingh 0:b44ffe9b1e5b 167 break;
RandomSingh 0:b44ffe9b1e5b 168
RandomSingh 0:b44ffe9b1e5b 169 }// End of switch
RandomSingh 0:b44ffe9b1e5b 170
RandomSingh 0:b44ffe9b1e5b 171 switch(speed)
RandomSingh 0:b44ffe9b1e5b 172 {// Start of switch
RandomSingh 0:b44ffe9b1e5b 173 case SLOW : wait(LONGER);
RandomSingh 0:b44ffe9b1e5b 174 break;
RandomSingh 0:b44ffe9b1e5b 175 case MEDIUM : wait(LONG);
RandomSingh 0:b44ffe9b1e5b 176 break;
RandomSingh 0:b44ffe9b1e5b 177 case FAST : wait(SHORT);
RandomSingh 0:b44ffe9b1e5b 178 break;
RandomSingh 0:b44ffe9b1e5b 179 default :
RandomSingh 0:b44ffe9b1e5b 180 wait(SHORT);
RandomSingh 0:b44ffe9b1e5b 181 break;
RandomSingh 0:b44ffe9b1e5b 182 }// End of switch
RandomSingh 0:b44ffe9b1e5b 183
RandomSingh 0:b44ffe9b1e5b 184 }// End of LED_chaser_sequence
RandomSingh 0:b44ffe9b1e5b 185
RandomSingh 0:b44ffe9b1e5b 186 void initialise_LEDS()
RandomSingh 0:b44ffe9b1e5b 187 {// Start of initialise_LEDS
RandomSingh 0:b44ffe9b1e5b 188
RandomSingh 0:b44ffe9b1e5b 189 myled = OFF;
RandomSingh 0:b44ffe9b1e5b 190 myled2 = OFF;
RandomSingh 0:b44ffe9b1e5b 191 myled3 = OFF;
RandomSingh 0:b44ffe9b1e5b 192 myled4 = OFF;
RandomSingh 0:b44ffe9b1e5b 193
RandomSingh 0:b44ffe9b1e5b 194 }// End of initialise_LEDS