Wayne Chin
/
InterruptQuadTest
Edge-triggered quadrature decoder
Diff: main.cpp
- Revision:
- 0:646cd75bed54
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Oct 29 20:28:45 2010 +0000 @@ -0,0 +1,184 @@ +// 9430 Quadrature Decoder using mbed edge-triggered interrupts +// +// Read quadrature encoder and drive LEDs +// Version 0.1 +// Created by Wayne Chin +// October 28, 2010 + +#include "mbed.h" + +#define ON 0 // LED drives are inverted +#define OFF 1 // LED drives are inverted +#define MAXAMPS200 200 +#define MINAMPSET 25 +#define DEBOUNCETIME 6000 // Debounce delay in us + +// mbed LEDs +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); + +// Quadrature encoder inputs +InterruptIn quada(p21); +InterruptIn quadb(p22); +InterruptIn quadsw(p30); + +// mbed API timers used for edge sensing and debouncing +Timer debouncetimerrisea; +Timer debouncetimerfalla; +Timer debouncetimerriseb; +Timer debouncetimerfallb; +Timeout debouncerisea; +Timeout debouncefalla; +Timeout debounceriseb; +Timeout debouncefallb; + +Ticker updateserial; +Serial pc(USBTX, USBRX); // tx, rx + +int counter; // Global counter variable + +void serialout() +{ + pc.printf("%d\n\r", counter); +} + +void display() +{ + if (counter > MAXAMPS200) + counter = MAXAMPS200; // Clip counter at high end + else if (counter < MINAMPSET) + counter = MINAMPSET; // Clip at low end + switch (counter % 4) // Get 2 LSBs and display sequence on mbed LEDs + { + case 0: + led1 = 1; led2 = 0; led3 = 0; led4 = 0; + break; + case 1: + led1 = 0; led2 = 1; led3 = 0; led4 = 0; + break; + case 2: + led1 = 0; led2 = 0; led3 = 1; led4 = 0; + break; + default: + led1 = 0; led2 = 0; led3 = 0; led4 = 1; + break; + } // switch +} + +// Read quadrature encoder, update counter variable, and update LEDs +// Quadrature clockwise states: 00 -> 10 -> 11 -> 01 +// Quadrature counter-clockwise states: 00 -> 01 -> 11 -> 10 +void checkrisea() +{ + debouncetimerrisea.stop(); + debouncetimerrisea.reset(); + debouncerisea.detach(); + if (quada == 1 && quadb == 0) + counter++; + else if (quada == 1 && quadb == 1) + counter--; + display(); +} + +void checkfalla() +{ + debouncetimerfalla.stop(); + debouncetimerfalla.reset(); + debouncefalla.detach(); + if (quada == 0 && quadb == 1) + counter++; + else if (quada == 0 && quadb == 0) + counter--; + display(); +} + +void checkriseb() +{ + debouncetimerriseb.stop(); + debouncetimerriseb.reset(); + if (quadb == 1 && quada == 1) + counter++; + else if (quadb == 1 && quada == 0) + counter--; + display(); +} + +void checkfallb() +{ + debouncetimerfallb.stop(); + debouncetimerfallb.reset(); + if (quadb == 0 && quada == 0) + counter++; + else if (quadb == 0 && quada == 1) + counter--; + display(); +} + +// Start of edge-triggered interrupts +void risea() +{ + if (debouncetimerrisea.read_ms() == 0) + { + debouncetimerrisea.start(); + debouncerisea.attach_us(&checkrisea, DEBOUNCETIME); // Check on switch later + } +} // risea() + +void falla() +{ + if (debouncetimerfalla.read_ms() == 0) + { + debouncetimerfalla.start(); + debouncefalla.attach_us(&checkfalla, DEBOUNCETIME); // Check on switch later + } +} // falla() + +void riseb() +{ + if (debouncetimerriseb.read_ms() == 0) + { + debouncetimerriseb.start(); + debounceriseb.attach_us(&checkriseb, DEBOUNCETIME); // Check on switch later + } +} // riseb() + +void fallb() +{ + if (debouncetimerfallb.read_ms() == 0) + { + debouncetimerfallb.start(); + debouncefallb.attach_us(&checkfallb, DEBOUNCETIME); // Check on switch later + } +} // fallb() + +int main() { + quada.mode(PullUp); // Enable pullup + quadb.mode(PullUp); // Enable pullup + quadsw.mode(PullUp); // Enable pullup + quada.rise(&risea); // Call function risea() on rising edge + quada.fall(&falla); // Call function falla() on falling edge + quadb.rise(&riseb); // Call function riseb() on rising edge + quadb.fall(&fallb); // Call function fallb() on falling edge + counter = 0; // Reset counter + + pc.baud(19200); + pc.printf("\n\rConnected to mBed...\r\n"); + + debouncetimerrisea.stop(); + debouncetimerrisea.reset(); + debouncetimerfalla.stop(); + debouncetimerfalla.reset(); + debouncetimerriseb.stop(); + debouncetimerriseb.reset(); + debouncetimerfallb.stop(); + debouncetimerfallb.reset(); + + // Set up interrupt call for serial port update + //updateserial.attach_us(&serialout, 500000); // setup updateserial to call serialout every 500 ms + + while (1) + { + }// while (1) +} // main()