Test code to read a tyco dpl12 quadrature encoder and vary the level of the 2 inbuilt leds. Fades colour from red, through orange and yellow, to green. Push button momentarily extinguishes the leds.
main.cpp@0:791f5d1a8275, 2011-02-23 (annotated)
- Committer:
- James1208
- Date:
- Wed Feb 23 20:59:54 2011 +0000
- Revision:
- 0:791f5d1a8275
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
James1208 | 0:791f5d1a8275 | 1 | #include "mbed.h" |
James1208 | 0:791f5d1a8275 | 2 | |
James1208 | 0:791f5d1a8275 | 3 | DigitalIn sw_in (p5); |
James1208 | 0:791f5d1a8275 | 4 | InterruptIn enc_a (p6); |
James1208 | 0:791f5d1a8275 | 5 | InterruptIn enc_b (p7); |
James1208 | 0:791f5d1a8275 | 6 | PwmOut led1 (p22); |
James1208 | 0:791f5d1a8275 | 7 | PwmOut led2 (p23); |
James1208 | 0:791f5d1a8275 | 8 | |
James1208 | 0:791f5d1a8275 | 9 | void enc_a_int_routine (void); |
James1208 | 0:791f5d1a8275 | 10 | void enc_b_int_routine (void); |
James1208 | 0:791f5d1a8275 | 11 | |
James1208 | 0:791f5d1a8275 | 12 | bool enc_a_state; |
James1208 | 0:791f5d1a8275 | 13 | bool enc_b_state; |
James1208 | 0:791f5d1a8275 | 14 | bool old_enc_a_state; |
James1208 | 0:791f5d1a8275 | 15 | bool old_enc_b_state; |
James1208 | 0:791f5d1a8275 | 16 | int val_min = 0; |
James1208 | 0:791f5d1a8275 | 17 | int val_max = 100; |
James1208 | 0:791f5d1a8275 | 18 | int val = ((val_max - val_min) / 2) + val_min; |
James1208 | 0:791f5d1a8275 | 19 | int val_old = val; |
James1208 | 0:791f5d1a8275 | 20 | |
James1208 | 0:791f5d1a8275 | 21 | int main() { |
James1208 | 0:791f5d1a8275 | 22 | sw_in.mode(PullUp); |
James1208 | 0:791f5d1a8275 | 23 | enc_a.mode(PullUp); |
James1208 | 0:791f5d1a8275 | 24 | enc_b.mode(PullUp); |
James1208 | 0:791f5d1a8275 | 25 | enc_a_state = enc_a; |
James1208 | 0:791f5d1a8275 | 26 | enc_b_state = enc_b; |
James1208 | 0:791f5d1a8275 | 27 | enc_a.rise(&enc_a_int_routine); |
James1208 | 0:791f5d1a8275 | 28 | enc_b.rise(&enc_b_int_routine); |
James1208 | 0:791f5d1a8275 | 29 | enc_a.fall(&enc_a_int_routine); |
James1208 | 0:791f5d1a8275 | 30 | enc_b.fall(&enc_b_int_routine); |
James1208 | 0:791f5d1a8275 | 31 | while (1) { |
James1208 | 0:791f5d1a8275 | 32 | if (val != val_old) { |
James1208 | 0:791f5d1a8275 | 33 | printf("\n\r%i",val); |
James1208 | 0:791f5d1a8275 | 34 | } // if (val != val_old) |
James1208 | 0:791f5d1a8275 | 35 | val_old = val; |
James1208 | 0:791f5d1a8275 | 36 | if (sw_in) { |
James1208 | 0:791f5d1a8275 | 37 | led1 = val / 100.0; |
James1208 | 0:791f5d1a8275 | 38 | led2 = 1.0 - (val / 100.0); |
James1208 | 0:791f5d1a8275 | 39 | } else { |
James1208 | 0:791f5d1a8275 | 40 | printf("button\n\r"); |
James1208 | 0:791f5d1a8275 | 41 | led1 = 0; |
James1208 | 0:791f5d1a8275 | 42 | led2 = 0; |
James1208 | 0:791f5d1a8275 | 43 | } // if (sw_in) |
James1208 | 0:791f5d1a8275 | 44 | } // while(1) |
James1208 | 0:791f5d1a8275 | 45 | } // end main |
James1208 | 0:791f5d1a8275 | 46 | |
James1208 | 0:791f5d1a8275 | 47 | void enc_a_int_routine (void) { |
James1208 | 0:791f5d1a8275 | 48 | old_enc_a_state = enc_a_state; |
James1208 | 0:791f5d1a8275 | 49 | old_enc_b_state = enc_b_state; |
James1208 | 0:791f5d1a8275 | 50 | enc_a_state = enc_a; |
James1208 | 0:791f5d1a8275 | 51 | enc_b_state = enc_b; |
James1208 | 0:791f5d1a8275 | 52 | if (((enc_a_state != old_enc_a_state) && (enc_b_state != old_enc_b_state)) || ((enc_a_state == old_enc_a_state) && (enc_b_state == old_enc_b_state))) { |
James1208 | 0:791f5d1a8275 | 53 | val = val; |
James1208 | 0:791f5d1a8275 | 54 | } else { |
James1208 | 0:791f5d1a8275 | 55 | if (enc_a_state ^ old_enc_b_state) { |
James1208 | 0:791f5d1a8275 | 56 | val -= 1; |
James1208 | 0:791f5d1a8275 | 57 | } else { |
James1208 | 0:791f5d1a8275 | 58 | val += 1; |
James1208 | 0:791f5d1a8275 | 59 | } // (enc_a_state ^ old_enc_b_state) |
James1208 | 0:791f5d1a8275 | 60 | } // if ((enc_a_state != old_enc_a_state) && (enc_b_state != old_enc_b_state)) |
James1208 | 0:791f5d1a8275 | 61 | } // end enc_a_int_routine |
James1208 | 0:791f5d1a8275 | 62 | |
James1208 | 0:791f5d1a8275 | 63 | void enc_b_int_routine (void) { |
James1208 | 0:791f5d1a8275 | 64 | old_enc_a_state = enc_a_state; |
James1208 | 0:791f5d1a8275 | 65 | old_enc_b_state = enc_b_state; |
James1208 | 0:791f5d1a8275 | 66 | enc_a_state = enc_a; |
James1208 | 0:791f5d1a8275 | 67 | enc_b_state = enc_b; |
James1208 | 0:791f5d1a8275 | 68 | if (((enc_a_state != old_enc_a_state) && (enc_b_state != old_enc_b_state)) || ((enc_a_state == old_enc_a_state) && (enc_b_state == old_enc_b_state))) { |
James1208 | 0:791f5d1a8275 | 69 | val = val; |
James1208 | 0:791f5d1a8275 | 70 | } else { |
James1208 | 0:791f5d1a8275 | 71 | if (enc_a_state ^ old_enc_b_state) { |
James1208 | 0:791f5d1a8275 | 72 | val -= 1; |
James1208 | 0:791f5d1a8275 | 73 | } else { |
James1208 | 0:791f5d1a8275 | 74 | val += 1; |
James1208 | 0:791f5d1a8275 | 75 | } // (enc_a_state ^ old_enc_b_state) |
James1208 | 0:791f5d1a8275 | 76 | } // if ((enc_a_state != old_enc_a_state) && (enc_b_state != old_enc_b_state)) |
James1208 | 0:791f5d1a8275 | 77 | } // end enc_a_int_routine |