ich habe folgendes Problem. ich nutze einen atmega 8 und einen encoder
mit graycode. des weiteren nutze ich die interruptrutine von hier (die
Zweite)Beitrag "Drehgeber auslesen"
hier nochmal darb´gestellt:
1 | SIGNAL (SIG_OVERFLOW0)
|
2 | {
|
3 |
|
4 | static char enc_last = 0x01;
|
5 | char i = 0;
|
6 |
|
7 | if( PHASE_A )
|
8 | i = 1;
|
9 |
|
10 | if( PHASE_B )
|
11 | i ^= 3; // convert gray to binary
|
12 |
|
13 | i -= enc_last; // difference new - last
|
14 |
|
15 | if( i & 1 ){ // bit 0 = value (1)
|
16 | enc_last += i; // store new as next last
|
17 |
|
18 | enc_delta += (i & 2) - 1; // bit 1 = direction (+/-)
|
19 | }
|
20 | }
|
in der Variablen enc_delta fintet sich der aktuelle Zählerstand. Durch
drehen kann ich ihn erhöhen und ernidriegen. Nur leider nicht genau. Mal
erhöht er um 6 dann um 7 mal um 3 völlig verschieden. wie kann ich den
code danach ändern, dass jeweils nur um einen Zähler erhöht oder
ernidrigt wird?
auserem hab ich nur interessehalber mal einen Zähler implementiert,
welcher die Interruptdurchgänge zählt, da sind ganzschön viele, auch
ohne einen Impuls vom encoder, kann man das verändern?? ich hab schon
pullup widerstände dran.