Ich stehe vor folgendem Problem:
Drehimpulsgeber mit Taster an einem ATMega8. Die Impulse des
Drehimpulsgebers sollen nur gezählt werden, wenn der Taster gedrückt
ist.
Ich habe verschiedene Codes von PD zusammengesetzt und alles klappt
bestens nur das mit Taster als Bedingung für Drehimpulsgeber nicht.
Hier die wesentlichen Codeanteile:
1 |
|
2 | ...
|
3 | #define ENC_2_A (PIND & 1<<PD2)
|
4 | #define ENC_2_B (PIND & 1<<PD3)
|
5 |
|
6 | volatile int8_t enc_delta_2;
|
7 | static int8_t last_2;
|
8 | void encode_init( void )
|
9 | {
|
10 | int8_t neu_2;
|
11 | neu_2 = 0;
|
12 | if( ENC_2_A ) neu_2 = 3;
|
13 | if( ENC_2_B ) neu_2 ^= 1;
|
14 | last_2 = neu_2;
|
15 | enc_delta_2 = 0;
|
16 | TCCR1B = (1<<WGM12) | (1<<CS11) | (1<<CS10); // CTC, XTAL / 64
|
17 | OCR1A = (uint16_t)(F_CPU / 64.0 * 1e-3 - 0.5); // 1ms
|
18 | TIMSK |= 1<<OCIE1A;
|
19 | }
|
20 | volatile uint8_t key_state;
|
21 | volatile uint8_t key_press;
|
22 |
|
23 | //ISR Dregeber auslesen
|
24 | ISR( TIMER1_COMPA_vect ) // 1ms for manual movement
|
25 | {
|
26 | int8_t neu_2;
|
27 | int8_t diff_2;
|
28 | neu_2 = 0;
|
29 | if( ENC_2_A ) neu_2 = 3;
|
30 | if( ENC_2_B ) neu_2 ^= 1;
|
31 | diff_2 = last_2 - neu_2;
|
32 | if( diff_2 & 1 )
|
33 | {
|
34 | last_2 = neu_2;
|
35 | enc_delta_2 += (diff_2 & 2) - 1;
|
36 | }
|
37 | }
|
38 | //ISR Taster auslesen
|
39 | ISR( TIMER0_OVF_vect ) // every 10ms
|
40 | {
|
41 | ...
|
42 | }
|
43 |
|
44 | int8_t encode_read_2( void ) // read two step encoders
|
45 | {
|
46 | int8_t val;
|
47 | cli();
|
48 | val = enc_delta_2;
|
49 | enc_delta_2 = val & 1;
|
50 | sei();
|
51 | return val >> 1;
|
52 | }
|
53 |
|
54 | int main (void){
|
55 | while(1) {
|
56 | if( get_key_press( 1<<KEY2 )) flag = 0x01;
|
57 | val_2 += encode_read_2();
|
58 | }}
|
Im Teil "main" ist zum einen die Abfrage ob "KEY2" gedrückt worden ist
und in "val_2" werden die Zählschritte des Encoders gespeichert.
Ein einfaches:
1 | if( get_key_press( 1<<KEY2 )) val_2 += encode_read_2();
|
funktioniert leider nicht. Das führt nur dazu, dass wenn nach dem drehen
der Taster betätigt wird die letzte Drehung übernommen wird. "val_2"
soll sich aber nur ändern, wenn der Taster gedrückt wird. Irgendwo muss
die if-Bedingung hin, aber wo?
Das ganze ist eine Art Sicherheitsschaltung nach dem Motto: Die Werte
können nur bei gedrücktem Taster geändert werden.
Bedanke mich für jede Antwort.