Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .equ TH =0b11000011 ;50000
- .equ TL =0b01010000
- .def tmp0 =r16
- .def tmp1 =r17
- .def tmp2 =r18
- .def tcnt =r19
- .def dcnt =r20
- .def adccnt =r21
- .def res0 =r22
- .def res1 =r23
- .def res2 =r24
- .def res3 =r25
- .dseg
- InWave:
- .byte 1
- Kp:
- .byte 1
- Ki:
- .byte 1
- Kd:
- .byte 1
- Error:
- .byte 1
- Error_1:
- .byte 1
- Error_2:
- .byte 1
- ErrSum:
- .byte 2
- IntRes:
- .byte 2
- DerRes:
- .byte 2
- .cseg
- .org 0x0000
- rjmp Init
- .org 0x0006
- rjmp TInit
- .org 0x001C
- rjmp ADC_Complete
- Init:
- ldi tmp0, LOW(RAMEND)
- out SPL, tmp0
- ldi tmp0, HIGH(RAMEND)
- out SPH, tmp0
- sei
- ldi YL, low(Kp)
- ldi YH, high(Kp)
- clr tmp0
- st Y, tmp0
- ldi YL, low(Ki)
- ldi YH, high(Ki)
- st Y, tmp0
- ldi YL, low(Kd)
- ldi YH, high(Kd)
- st Y, tmp0
- ldi YL, low(Error)
- ldi YH, high(Error)
- st Y, tmp0
- ldi YL, low(Error_1)
- ldi YH, high(Error_1)
- st Y, tmp0
- ldi YL, low(Error_2)
- ldi YH, high(Error_2)
- st Y, tmp0
- ldi YL, low(ErrSum)
- ldi YH, high(ErrSum)
- st Y+, tmp0
- st Y, tmp0
- out DDRA, tmp0
- ldi tmp0, (1 << DDA1)|(1 << DDA2)|(1 << DDA3)
- out PORTA, tmp0
- ldi tmp0, 0xFF
- out DDRB, tmp0
- clr tmp0
- out PORTB, tmp0
- clr adccnt
- ldi tmp0, (1<<REFS0)|(1<<ADLAR)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0)
- out ADMUX, tmp0
- ldi tmp0, (1<<ADSC)|(1<<ADFR)|(1<<ADIE)|(0<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
- out ADCSR, tmp0
- clr tcnt
- ldi tmp0, 10
- out OCR2, tmp0
- ldi tmp0, (1<<WGM21)|(1<<CS22)|(1<<CS20)
- out TCCR2, tmp0
- ldi tmp0, (1<<OCIE2)
- out TIMSK, tmp0
- rjmp Start
- TInit:
- inc tcnt
- cpi tcnt, 5
- brne TExit
- clr tcnt
- clr adccnt
- cbi ADMUX, MUX1
- cbi ADMUX, MUX0
- TExit:
- sbi ADCSR, ADEN
- reti
- ADC_Complete:
- cbi ADCSR, ADEN
- cpi adccnt, 0
- breq Input
- cpi adccnt, 1
- breq Proportional
- cpi adccnt, 2
- breq Integral
- cpi adccnt, 3
- breq Derivative
- reti
- Input:
- inc adccnt
- ldi YL, low(InWave)
- ldi YH, high(InWave)
- in tmp0, ADCH
- st Y, tmp0
- cbi ADMUX, MUX1
- sbi ADMUX, MUX0
- sbi ADCSR, ADEN
- reti
- Proportional:
- inc adccnt
- ldi YL, low(Kp)
- ldi YH, high(Kp)
- in tmp0, ADCH
- lsr tmp0
- lsr tmp0
- lsr tmp0
- lsr tmp0
- st Y, tmp0
- sbi ADMUX, MUX1
- cbi ADMUX, MUX0
- sbi ADCSR, ADEN
- reti
- Integral:
- inc adccnt
- ldi YL, low(Ki)
- ldi YH, high(Ki)
- in tmp0, ADCH
- lsr tmp0
- lsr tmp0
- lsr tmp0
- lsr tmp0
- st Y, tmp0
- sbi ADMUX, MUX1
- sbi ADMUX, MUX0
- sbi ADCSR, ADEN
- reti
- Derivative:
- ldi adccnt, 1
- ldi YL, low(Kd)
- ldi YH, high(Kd)
- in tmp0, ADCH
- lsr tmp0
- lsr tmp0
- lsr tmp0
- lsr tmp0
- st Y, tmp0
- cbi ADMUX, MUX1
- sbi ADMUX, MUX0
- rjmp Output
- Output:
- ;Error
- ldi YL, low(Error_1)
- ldi YH, high(Error_1)
- ld tmp0, Y
- ldi ZL, low(Error_2)
- ldi ZH, high(Error_2)
- st Z, tmp0
- ldi XL, low(Error)
- ldi XH, high(Error)
- ld tmp0, X
- st Y, tmp0
- ldi ZL, low(InWave)
- ldi ZH, high(InWave)
- ld tmp1, Z
- in tmp2, PORTB
- sub tmp1, tmp2
- brcc PosErr
- ldi tmp2, 0xFF
- rjmp PC+2
- PosErr:
- clr tmp2
- st X, tmp1
- ldi ZL, low(ErrSum+1)
- ldi ZH, high(ErrSum+1)
- ld tmp0, Z
- add tmp0, tmp1
- st Z, tmp0
- ldi YL, low(ErrSum)
- ldi YH, high(ErrSum)
- ld tmp0, Y
- adc tmp0, tmp2
- st Y, tmp0
- ; Integral
- ldi ZL, low(Ki)
- ldi ZH, high(Ki)
- ld tmp0, Z
- ld tmp1, Y
- mul tmp0, tmp1
- mov res0, r0
- mov res1, r1
- ldi tmp0, 3
- mul tmp0, res1
- mov res1, r0
- mov res2, r1
- mul tmp0, res0
- clr tmp0
- mov res0, r0
- add res1, r1
- adc res2, tmp0
- ldi dcnt, 251
- clr r0
- clr r1
- DecInt:
- clr tmp1
- ldi tmp0, 10
- sub res2, tmp0
- inc tmp1
- brcc PC-2
- add res2, tmp0
- dec tmp1
- inc dcnt
- breq DecIntEx
- add r0, tmp1
- clr tmp1
- adc r1, tmp1
- lsl r0
- rol r1
- lsl r0
- rol r1
- lsl r0
- rol r1
- lsl r0
- rol r1
- lsl res0
- rol res1
- rol res2
- lsl res0
- rol res1
- rol res2
- lsl res0
- rol res1
- rol res2
- lsl res0
- rol res1
- rol res2
- rjmp DecInt
- DecIntEx:
- add r0, tmp1
- clr tmp1
- adc r1, tmp1
- ldi ZL, low(IntRes)
- ldi ZH, high(IntRes)
- st Z+, r1
- st Z, r0
- ldi ZL, low(IntRes)
- ldi ZH, high(IntRes)
- st Z+, r1
- st Z, r0
- ; Derivativ
- ldi ZL, low(Error)
- ldi ZH, high(Error)
- ld tmp0, Z
- ldi ZL, low(Error_2)
- ldi ZH, high(Error_2)
- ld tmp1, Z
- sub tmp0, tmp1
- ldi ZL, low(Kd)
- ldi ZH, high(Kd)
- ld tmp1, Z
- mul tmp1, tmp0
- mov r2, r0
- mov r3, r1
- ldi tmp0, TL
- ldi tmp1, TH
- mul tmp0, r2
- mov res0, r0
- mov res1, r1
- mul tmp1, r3
- mov res2, r0
- mov res3, r1
- mul tmp0, r3
- clr tmp0
- add res1, r0
- adc res2, r1
- adc res3, tmp0
- mul tmp1, r2
- add res1, r0
- adc res2, r1
- adc res3, tmp0
- lsl res0
- rol res1
- rol res2
- rol res3
- ldi YL, low(DerRes)
- ldi YH, high(DerRes)
- st Y+, res2
- st Y, res1
- ; Proportional
- ldi YL, low(Error)
- ldi YH, high(Error)
- ldi ZL, low(Kp)
- ldi ZH, high(Kp)
- ld tmp0, Y
- ld tmp1, Z
- mul tmp0, tmp1
- mov tmp0, r0
- mov tmp1, r1
- ; Result
- ldi YL, low(DerRes)
- ldi YH, high(DerRes)
- ld res1, Y+
- ld res0, Y
- ldi YL, low(IntRes)
- ldi YH, high(IntRes)
- ld res3, Y+
- ld res2, Y
- add res0, res2
- adc res1, res3
- add res0, tmp0
- adc res1, tmp1
- ldi dcnt, 253
- clr r0
- clr r1
- DecOut:
- clr tmp1
- ldi tmp0, 10
- sub res1, tmp0
- inc tmp1
- brcc PC-2
- add res1, tmp0
- dec tmp1
- inc dcnt
- breq DecOutEx
- add r0, tmp1
- clr tmp1
- adc r1, tmp1
- lsl r0
- rol r1
- lsl r0
- rol r1
- lsl r0
- rol r1
- lsl r0
- rol r1
- lsl res0
- rol res1
- lsl res0
- rol res1
- lsl res0
- rol res1
- lsl res0
- rol res1
- rjmp DecOut
- DecOutEx:
- add r0, tmp1
- clr tmp1
- adc r1, tmp1
- out PORTB, r0
- reti
- Start:
- rjmp Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement