ich habe mir mal gedanken zu dem panasonic-drehencoder von pollin gemacht und hier etwas gefunden, dass den (nicht so einwandfrei gefertigten) Encoder zuverlässig abfragt. damit entfällt auch entprellen etc. ... ob man nun dauernd oder per timer pollt ist auch egal.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <inttypes.h> |
4 | |
5 | volatile uint8_t t,x; |
6 | |
7 | uint8_t getA() |
8 | { if (PIND & (1<<PD2)) return 1; else return 0;} |
9 | uint8_t getB() |
10 | { if (PIND & (1<<PD3)) return 1; else return 0;} |
11 | |
12 | SIGNAL(SIG_OUTPUT_COMPARE1A) |
13 | {
|
14 | uint8_t a,b; |
15 | a=getA(); |
16 | b=getB(); |
17 | switch (t) |
18 | {
|
19 | case 0: |
20 | if(!(a^b)) |
21 | {
|
22 | x=0|(a)|(b<<1); |
23 | t++; |
24 | }
|
25 | break; |
26 | case 1: |
27 | if((a^b)) |
28 | {
|
29 | x|=(a<<2)|(b<<3); |
30 | t++; |
31 | }
|
32 | break; |
33 | case 2: |
34 | if(!(a^b)) |
35 | {
|
36 | x|=(a<<4)|(b<<5); |
37 | t=0; |
38 | switch (x) |
39 | {
|
40 | case 0b00111000: |
41 | case 0b00000111: |
42 | // hier etwas, das in einer richtung passieren soll
|
43 | break; |
44 | case 0b00110100: |
45 | case 0b00001011: |
46 | // hier etwas, das in der anderen richtung passieren soll
|
47 | break; |
48 | }
|
49 | }
|
50 | break; |
51 | }
|
52 | }
|
53 | int main() |
54 | {
|
55 | t=0; x=0; |
56 | DDRD = 0x00; PORTD= 0xFF; |
57 | TIMSK |= (1 << OCIE0A); OCR0A=0xF0; TCNT0=0x00; TCCR0B=0b00000011; |
58 | //timer kann auch anders eingestellt werden
|
59 | sei(); |
60 | while (1) |
61 | {
|
62 | __asm__ volatile("nop"); |
63 | }
|
64 | }
|
ich hoffe ich habe beim einfügen hier keine fehler gemacht.