du kannst auch die Danegger'sche Debounce-Routine nehmen und im
Timer-Interrupt die Flanken zählen. Ich habe die mal in einer
Decoder-Routine leicht umgeschrieben, damit die Bedeutung der Bits
klarer wird - edge enthält eine 1 für jede Flanke auf einem Pin,
pos_edge und neg_edge jeweils for eine positive bzw negative Flanke. Du
brauchst nur mehr auf pos_edge zu testen, bei 1 einen Zähler hochzählen
und das bit resetten.
Ob entprellt wird, habe ich noch optional gemacht. War experimentelles
Erforschen eines Quadratur-Encoders, geht wunderbar. Das ganze wird bei
mir alle 50usec aus einem Timer-Interrupt aufgerufen. Damit hast Du auch
automatisch mehrere gleich arbeitende eingänge.
-Michael
void update_encoder() // 1ms for manual movement
{
static byte ct0, ct1;
byte edge,pos_edge, neg_edge;
char n, diff, enc_delta;
// encoder pins changed ?
edge = port_state ^ ~(encoder0Port & encMask);
if (debounce) {
ct0 = ~( ct0 & edge ); // reset or count ct0
ct1 = ct0 ^ (ct1 & edge); // reset or count ct1
edge &= ct0 & ct1; // count until roll over ?
}
port_state ^= edge; // then toggle debounced
state
pos_edge = port_state & edge; // bit set: positive edge
detected
neg_edge = ~port_state & edge; // bit set: neagtive edge detected
....