Ich hab gerade einen eingebaut und in AVR-GCC programmiert. Der A-Kanal an einem externen Interrupt, der B-Kanal und der Taster auf normalen Eingängen des AVRs.
Das wesentliche läuft in der ISR ab:
Code:ISR(INT1_vect) { if bit_is_clear(PIND,PIND3) //falling edge! { if bit_is_clear(PINC,encoder_pin) //linksrum { enc--; enc_minus(); } else { enc++; enc_plus(); } } else //rising edge { if bit_is_clear(PINC,encoder_pin) //rechtsrum { enc++; enc_plus(); } else { enc--; enc_minus(); } } }
Der Interrupt wird so eingestellt, dass er auf fallende und stegende Flanke auslöst:
Denn nur bei jedem zweiten Schritt gibt es eine fallende (bzw eine steigende) Flanke. In der ISR wird dann geprüft, welche Flanke nun gerade erkannt wurde.Code://int1 (encoder): both edges MCUCR|=(1<<ISC10);
Die ganze Pina als Eingänge mit Pullups einzustellen und das Auswerten des Tasters überlasse ich euch!







Zitieren

Lesezeichen