encoder

Dependencies:   QEI TextLCD-modificada mbed

Committer:
salondonog
Date:
Fri Nov 15 17:45:21 2013 +0000
Revision:
0:d7388a87aeb7
encoder

Who changed what in which revision?

UserRevisionLine numberNew contents of line
salondonog 0:d7388a87aeb7 1 #include "DebouncedIn.h"
salondonog 0:d7388a87aeb7 2 #include "mbed.h"
salondonog 0:d7388a87aeb7 3
salondonog 0:d7388a87aeb7 4 /*
salondonog 0:d7388a87aeb7 5 * Constructor
salondonog 0:d7388a87aeb7 6 */
salondonog 0:d7388a87aeb7 7 DebouncedIn::DebouncedIn(PinName in)
salondonog 0:d7388a87aeb7 8 : _in(in) {
salondonog 0:d7388a87aeb7 9
salondonog 0:d7388a87aeb7 10 // reset all the flags and counters
salondonog 0:d7388a87aeb7 11 _samples = 0;
salondonog 0:d7388a87aeb7 12 _output = 0;
salondonog 0:d7388a87aeb7 13 _output_last = 0;
salondonog 0:d7388a87aeb7 14 _rising_flag = 0;
salondonog 0:d7388a87aeb7 15 _falling_flag = 0;
salondonog 0:d7388a87aeb7 16 _state_counter = 0;
salondonog 0:d7388a87aeb7 17
salondonog 0:d7388a87aeb7 18 // Attach ticker
salondonog 0:d7388a87aeb7 19 _ticker.attach(this, &DebouncedIn::_sample, 0.005);
salondonog 0:d7388a87aeb7 20 }
salondonog 0:d7388a87aeb7 21
salondonog 0:d7388a87aeb7 22 void DebouncedIn::_sample() {
salondonog 0:d7388a87aeb7 23
salondonog 0:d7388a87aeb7 24 // take a sample
salondonog 0:d7388a87aeb7 25 _samples = _samples >> 1; // shift left
salondonog 0:d7388a87aeb7 26
salondonog 0:d7388a87aeb7 27 if (_in) {
salondonog 0:d7388a87aeb7 28 _samples |= 0x80;
salondonog 0:d7388a87aeb7 29 }
salondonog 0:d7388a87aeb7 30
salondonog 0:d7388a87aeb7 31 // examine the sample window, look for steady state
salondonog 0:d7388a87aeb7 32 if (_samples == 0x00) {
salondonog 0:d7388a87aeb7 33 _output = 0;
salondonog 0:d7388a87aeb7 34 }
salondonog 0:d7388a87aeb7 35 else if (_samples == 0xFF) {
salondonog 0:d7388a87aeb7 36 _output = 1;
salondonog 0:d7388a87aeb7 37 }
salondonog 0:d7388a87aeb7 38
salondonog 0:d7388a87aeb7 39
salondonog 0:d7388a87aeb7 40 // Rising edge detection
salondonog 0:d7388a87aeb7 41 if ((_output == 1) && (_output_last == 0)) {
salondonog 0:d7388a87aeb7 42 _rising_flag++;
salondonog 0:d7388a87aeb7 43 _state_counter = 0;
salondonog 0:d7388a87aeb7 44 }
salondonog 0:d7388a87aeb7 45
salondonog 0:d7388a87aeb7 46 // Falling edge detection
salondonog 0:d7388a87aeb7 47 else if ((_output == 0) && (_output_last == 1)) {
salondonog 0:d7388a87aeb7 48 _falling_flag++;
salondonog 0:d7388a87aeb7 49 _state_counter = 0;
salondonog 0:d7388a87aeb7 50 }
salondonog 0:d7388a87aeb7 51
salondonog 0:d7388a87aeb7 52 // steady state
salondonog 0:d7388a87aeb7 53 else {
salondonog 0:d7388a87aeb7 54 _state_counter++;
salondonog 0:d7388a87aeb7 55 }
salondonog 0:d7388a87aeb7 56
salondonog 0:d7388a87aeb7 57 // update the output
salondonog 0:d7388a87aeb7 58 _output_last = _output;
salondonog 0:d7388a87aeb7 59
salondonog 0:d7388a87aeb7 60 }
salondonog 0:d7388a87aeb7 61
salondonog 0:d7388a87aeb7 62
salondonog 0:d7388a87aeb7 63
salondonog 0:d7388a87aeb7 64 // return number of rising edges
salondonog 0:d7388a87aeb7 65 int DebouncedIn::rising(void) {
salondonog 0:d7388a87aeb7 66 int return_value = _rising_flag;
salondonog 0:d7388a87aeb7 67 _rising_flag = 0;
salondonog 0:d7388a87aeb7 68 return(return_value);
salondonog 0:d7388a87aeb7 69 }
salondonog 0:d7388a87aeb7 70
salondonog 0:d7388a87aeb7 71 // return number of falling edges
salondonog 0:d7388a87aeb7 72 int DebouncedIn::falling(void) {
salondonog 0:d7388a87aeb7 73 int return_value = _falling_flag;
salondonog 0:d7388a87aeb7 74 _falling_flag = 0;
salondonog 0:d7388a87aeb7 75 return(return_value);
salondonog 0:d7388a87aeb7 76 }
salondonog 0:d7388a87aeb7 77
salondonog 0:d7388a87aeb7 78 // return number of ticsk we've bene steady for
salondonog 0:d7388a87aeb7 79 int DebouncedIn::steady(void) {
salondonog 0:d7388a87aeb7 80 return(_state_counter);
salondonog 0:d7388a87aeb7 81 }
salondonog 0:d7388a87aeb7 82
salondonog 0:d7388a87aeb7 83 // return the debounced status
salondonog 0:d7388a87aeb7 84 int DebouncedIn::read(void) {
salondonog 0:d7388a87aeb7 85 return(_output);
salondonog 0:d7388a87aeb7 86 }
salondonog 0:d7388a87aeb7 87
salondonog 0:d7388a87aeb7 88 // shorthand for read()
salondonog 0:d7388a87aeb7 89 DebouncedIn::operator int() {
salondonog 0:d7388a87aeb7 90 return read();
salondonog 0:d7388a87aeb7 91 }
salondonog 0:d7388a87aeb7 92
salondonog 0:d7388a87aeb7 93