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:
Code:
//int1 (encoder): both edges
MCUCR|=(1<<ISC10);
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.
Die ganze Pina als Eingänge mit Pullups einzustellen und das Auswerten des Tasters überlasse ich euch!
Lesezeichen