Ich hab sowas in Codevision für 2 Interrupts gemacht und den ATMEGA32. Läuft somit Quasi im Hintergrund.
Die Routine zählt zu einem Wert (li_frequ) entweder eine Variable (ui_increments) dazu oder zieht sie ab, je nach Drehrichtung.
Die Routine ist für einen optischen Drehencoder und hat deshalb keine Entprellung!
Code:
/* Called automaticly on INT 0 */
interrupt [2] void int0(void) {
unsigned char uc_port=0,uc_mcucr=0;
uc_port=PIND&0b00001000;
uc_mcucr=MCUCR&0b00000001;
if(uc_mcucr==0)
{
if (uc_port==8){
li_frequ=li_frequ+ui_increments;
}
else{
li_frequ=li_frequ-ui_increments;
}
MCUCR=MCUCR|0b00000011;
}
else{
if (uc_port==8){
li_frequ=li_frequ-ui_increments;
}
else{
li_frequ=li_frequ+ui_increments;
}
MCUCR=MCUCR&0b11111110;
}
refresh=1;
}
/* Called automaticly on INT 1 */
interrupt [3] void int1(void) {
unsigned char uc_port=0,uc_mcucr=0;
uc_port=PIND&0b00000100;
uc_mcucr=MCUCR&0b00000100;
if(uc_mcucr==0)
{
if (uc_port==4){
li_frequ=li_frequ-ui_increments;
}
else{
li_frequ=li_frequ+ui_increments;
}
MCUCR=MCUCR|0b00001100;
}
else{
if (uc_port==4){
li_frequ=li_frequ+ui_increments;
}
else{
li_frequ=li_frequ-ui_increments;
}
MCUCR=MCUCR&0b11111011;
}
refresh=1;
}
Lesezeichen