Hallo sicher wird es wieder einen Aufschrei geben, das es nicht geht. Warum eigentlich nicht? Habe mit einem ATm 128 und einem direkt angeschlossenen Drehgeber mit dem Programm von Peter es umgesetzt.
1 | void encode_init( void ) |
2 | {
|
3 | int8_t new; |
4 | new = 0; |
5 | if( PHASE_A ) new = 3; |
6 | if( PHASE_B ) new ^= 1; // convert gray to binary |
7 | last = new; // power on state |
8 | enc_delta = 0; |
9 | }
|
10 | |
11 | ISR( TIMER0_COMPA_vect ) // 1ms for manual movement |
12 | {
|
13 | int8_t new, diff; |
14 | new = 0; |
15 | if( PHASE_A ) new = 3; |
16 | if( PHASE_B ) new ^= 1; // convert gray to binary |
17 | diff = last - new; // difference last - new |
18 | if( diff & 1 ) |
19 | { // bit 0 = value (1) |
20 | last = new; // store new as next last |
21 | enc_delta += (diff & 2) - 1; // bit 1 = direction (+/-) |
22 | }
|
23 | }
|
24 | |
25 | int8_t encode_read1( void ) // einzel Schritt Encoder |
26 | {
|
27 | int8_t val; |
28 | cli(); |
29 | val = enc_delta; |
30 | enc_delta = 0; |
31 | sei(); |
32 | return val; |
33 | }
|
34 | |
35 | int8_t encode_read2( void ) // zwei Schritt Encoder |
36 | {
|
37 | int8_t val; |
38 | cli(); |
39 | val = enc_delta; |
40 | enc_delta = val & 1; |
41 | sei(); |
42 | return val >> 1; |
43 | }
|
44 | |
45 | int8_t encode_read4( void ) // vier Schritt Encoder |
46 | {
|
47 | int8_t val; |
48 | cli(); |
49 | val = enc_delta; |
50 | enc_delta = val & 3; |
51 | sei(); |
52 | return val >> 2; |
53 | }
|
54 | |
55 | void timer_init() // Timer 1ms |
56 | {
|
57 | TCCR0A = (1<<WGM01); |
58 | TCCR0B = (1<<CS01)|(1<<CS00); |
59 | OCR0A = 249; |
60 | TIMSK0 |=(1<<OCIE0A); |
61 | }
|
Das ist ein Teil meines Programmes. Die Auswertung fehlt noch. Es geht ohne Probleme. Wie kann ich das zum I2C Bus umsetzen? Habe einen ATtiny 44 genommen, den Drehgeber nach der gleich Beschaltung wie beim 128. Dieser Attiny soll die Auswertung machen und nur die Angabe links oder rechts über USI zum 128 übertragen. Hat jemand eine Idee dazu oder es schon mal gemacht? Würde mich über jede Hilfe freuen. LG Bert