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; }







Zitieren

Lesezeichen