.include "tn2313def.inc" .def Null =r2 ;Register mit Wert $00 .def tmp =r9 ;Interrupt-Temp Register .def Vorteiler1 =r10 .def Vorteiler2 =r11 .def Temp =r16 ;Temp Register .def TempH =r17 ;TempHigh Register .def Temp3 =r18 ;Temp3 Register .def Sekunde =r20 .def ButtonCT =r23 ;UpCounter for hold down button .equ Status =GPIOR0 ;Statusregister .equ RotaryFlag =1 ;used Flags .equ DirectionFlag =2 .equ NewRotFlag =3 .equ ButtonFlag =4 .equ NewButtonFlag =5 **************TIMER INIT************************** ;8 Bit Timer0 (SystemTime) ldi Temp, 0b00000010 out TCCR0A, Temp ;CTC-Mode ldi Temp, 0b00000011 ;Prescaler 64 out TCCR0B, Temp ldi Temp, 125 out OCR0A, Temp ***************INTERRUPT SERVICE******************** ;System main timer SysTime: in tmp, SREG push tmp push Temp sbi Status, DispFlag ;enable Put_Display sub in Temp, PinA ;read RotaryEncoder andi Temp, 0b00000011 cpi Temp, 0b00000011 ;only if both lines are High, enable direction check brne _ST0 cbi Status, RotaryFlag _ST0: sbic Status, RotaryFlag ;run only, if direction check is enabled rjmp _ST1 sbrc Temp, 0 ;run only, if line 0 is Low rjmp _ST1 cbi Status, DirectionFlag ;if right turn, clear DirectionFlag sbrc Temp, 1 sbi Status, DirectionFlag ;if left turn, set DirectionFlag sbi Status, NewRotFlag sbi Status, RotaryFlag ;disable direction check _ST1: dec Vorteiler1 ;TimePrescaler1 brne _ST3 ldi Temp, 8 mov Vorteiler1, Temp sbic PinB, 1 ;read Button rjmp _ST1A sbic Status, ButtonFlag ;run only, if High -> Low transition rjmp _ST1B sbi Status, ButtonFlag ;disable new button pulse detection sbi Status, NewButtonFlag ;set NewButtonFlag rjmp _ST2 _ST1A: cbi Status, ButtonFlag ;if button is released, enable new pulse detection clr ButtonCT ;clear button counter rjmp _ST2 _ST1B: cpi ButtonCT, 255 ;if button is hold down, increment button counter up to 255 breq _ST2 inc ButtonCT _ST2: dec Vorteiler2 ;TimePrescaler2 brne _ST3 ldi Temp, 125 mov Vorteiler2, Temp inc Sekunde _ST3: pop Temp pop tmp out SREG, tmp reti