📄 migalka.asm
字号:
;========================================================
; Migalka
;========================================================
.include "m8def.inc"
;--------------------------------------------------------
.DEF KeyCnt1 = R20
.DEF KeyCnt2 = R21
.DEF KeyCnt3 = R22
.DEF KeyCnt4 = R23
.DEF KeyCnt5 = R24
.DEF KeyCnt6 = R25
.EQU LoopProg = 10
;--------------------------------------------------------
.DSEG
ValCh0: .byte 1
ValCh1: .byte 1
ValCh2: .byte 1
ValCh3: .byte 1
ValCh0_: .byte 1
ValCh1_: .byte 1
ValCh2_: .byte 1
ValCh3_: .byte 1
CntCh0: .byte 1
CntCh1: .byte 1
CntCh2: .byte 1
CntCh3: .byte 1
PWM_Cnt: .byte 1
AC_Flag: .byte 1
IntFlag: .byte 1
MicFlag: .byte 1
LoopPrg: .byte 1
EndofProg: .byte 1
EEPFlag: .byte 1
EEPWr: .byte 1
ProgSt: .byte 1
ProgBit: .byte 1
ProgValue: .byte 1
PWMflag: .byte 1
AutoMode: .byte 1
ProgNum: .byte 1
Microphone: .byte 1
Speeds: .byte 16
;========================================================
.CSEG
.ORG 0x0000
rjmp Start
rjmp AC_Int ; INT 0
reti ; INT 1
reti ; TIMER2 COMP
rjmp IntSync ; TIMER2 OVF
reti ; TIMER1 CAPT
reti ; TIMER1 COMPA
reti ; TIMER1 COMPB
reti ; TIMER1 OVF
rjmp PWM_reg ; TIMER0 OVF
reti ; SPI, STC
reti ; USART RXC
reti ; USART UDRIE
reti ; USART TXC
reti ; ADC
reti ; EE_RDY
reti ; ANA COMP
reti ; TWI
reti ; SPM RDY
;--------------------------------------------------------
AC_Int: cbi PORTC,PC0
cbi PORTC,PC1
cbi PORTC,PC2
cbi PORTC,PC3
push R16
in R16,SREG
push R16
push R17
clr R16
sts AC_Flag,R16
sts PWM_cnt,R16
lds R16,ValCh0_
sts ValCh0,R16
lds R16,ValCh1_
sts ValCh1,R16
lds R16,ValCh2_
sts ValCh2,R16
lds R16,ValCh3_
sts ValCh3,R16
lds R16,EEPFlag
cpi R16,0x00
breq AC_int1
dec R16
sts EEPFlag,R16
AC_int1: clr R16
sbi DDRD,PD5
sbi PORTD,PD5
cbi DDRD,PD6
cbi PORTD,PD6
cbi DDRD,PD7
cbi PORTD,PD7
nop
nop
sbic PIND,PD6
ori R16,0x01
sbic PIND,PD7
ori R16,0x02
cbi DDRD,PD5
cbi PORTD,PD5
sbi DDRD,PD6
sbi PORTD,PD6
cbi DDRD,PD7
cbi PORTD,PD7
nop
nop
sbic PIND,PD5
ori R16,0x08
sbic PIND,PD7
ori R16,0x04
cbi DDRD,PD5
cbi PORTD,PD5
cbi DDRD,PD6
cbi PORTD,PD6
sbi DDRD,PD7
sbi PORTD,PD7
nop
nop
sbic PIND,PD5
ori R16,0x20
sbic PIND,PD6
ori R16,0x10
sbrs R16,0
clr KeyCnt1
sbrs R16,1
clr KeyCnt2
sbrs R16,2
clr KeyCnt3
sbrs R16,3
clr KeyCnt4
sbrs R16,4
clr KeyCnt5
sbrs R16,5
clr KeyCnt6
sbrc R16,0
inc KeyCnt1
sbrc R16,1
inc KeyCnt2
sbrc R16,2
inc KeyCnt3
sbrc R16,3
inc KeyCnt4
sbrc R16,4
inc KeyCnt5
sbrc R16,5
inc KeyCnt6
Ac_int_ex: pop R17
pop R16
out SREG,R16
pop R16
reti
;--------------------------------------------------------
IntSync: push R16
in R16,SREG
push R16
ldi R16,0xff
sts IntFlag,R16
pop R16
out SREG,R16
pop R16
reti
;--------------------------------------------------------
Mic_Int: push R16
ldi R16,0xFF
sts MicFlag,R16
pop R16
reti
;--------------------------------------------------------
PWM_reg: push R16
in R16,SREG
push R16
ldi R16,100+2+1+2+2+2
out TCNT0,R16
push R17
lds R17,PWM_cnt
dec R17
breq PWM_reg_1
sts PWM_cnt,R17
PWM_reg_1: lds R16,ValCh0
cp R16,R17
brne PWM_cnt_1
sbi PORTC,PC0
PWM_cnt_1: lds R16,ValCh1
cp R16,R17
brne PWM_cnt_2
sbi PORTC,PC1
PWM_cnt_2: lds R16,ValCh2
cp R16,R17
brne PWM_cnt_3
sbi PORTC,PC2
PWM_cnt_3: lds R16,ValCh3
cp R16,R17
brne PWM_reg_Ex
sbi PORTC,PC3
PWM_reg_Ex: pop R17
pop R16
out SREG,R16
pop R16
reti
;--------------------------------------------------------
Start: ldi R16,High(RAMEND)
out SPH,R16
ldi R16,Low(RAMEND)
out SPL,R16
clr R16
sts ValCh0,R16
sts ValCh1,R16
sts ValCh2,R16
sts ValCh3,R16
sts ValCh0_,R16
sts ValCh1_,R16
sts ValCh2_,R16
sts ValCh3_,R16
sts CntCh0,R16
sts CntCh1,R16
sts CntCh2,R16
sts CntCh3,R16
sts PWM_cnt,R16
sts AC_Flag,R16
clr KeyCnt1
clr KeyCnt2
clr KeyCnt3
clr KeyCnt4
clr KeyCnt5
clr KeyCnt6
clr R16
sts EEPFlag,R16
sts EEPWr,R16
sts Endofprog,R16
ldi R16,LoopProg
sts LoopPrg,R16
ldi R16,0xff
sts PWMflag,R16
ldi R16,0x00
sts AutoMode,R16
ldi R16,0x00
sts Microphone,R16
ldi R16,0x00
sts ProgNum,R16
clr R16
sts ProgSt,R16
sts ProgBit,R16
sts ProgValue,R16
rcall RestoreEEP
sbi DDRC,PC0
sbi DDRC,PC1
sbi DDRC,PC2
sbi DDRC,PC3
;----- Setup Timer 2 ------------------------------------
ldi R16,0x01
out TCCR2,R16
ldi R16,0x00
out ASSR,R16
;----- Setup Timer 0 ------------------------------------
ldi R16,0x01
out TCCR0,R16
;----- Setup interrupts ---------------------------------
in R16,TIMSK
ori R16,0x41
out TIMSK,R16
in R16,MCUCR
ori R16,0x06
out MCUCR,R16
in R16,GICR
ori R16,0xc0
out GICR,R16
ldi R16,0x1F
out WDTCR,R16
ldi R16,0x0F
out WDTCR,R16
sei
;----- Debugging ----------------------------------------
;----- Main loop ----------------------------------------
Forever: rcall CheckEEP
rcall KeyCheck
rcall CheckMode
wdr
rjmp Forever
;--------------------------------------------------------
;===== Checking EEPROM write ============================
CheckEEP: lds R16,EEPflag
cpi R16,0x00
breq CheckEEP_1
ret
CheckEEP_1: lds R16,EEPwr
cpi R16,0x00
brne CheckEEP_2
ret
CheckEEP_2: rcall StoreEEP
clr R16
sts EEPwr,R16
ret
;===== Checking work mode ===============================
CheckMode: lds R16,AutoMode
cpi R16,0x00
breq AutoEnabled
rcall ProgStep
ret
AutoEnabled: lds R16,Endofprog
cpi R16,0xff
breq AutoEnabled_1
rcall ProgStep
ret
AutoEnabled_1: clr R16
sts Endofprog,R16
lds R16,LoopPrg
dec R16
breq AutoEnabled_2
sts LoopPrg,R16
rcall ProgStep
ret
Autoenabled_2: ldi R16,LoopProg
sts LoopPrg,R16
ldi ZL,Low(ProgTab*2)
ldi ZH,High(ProgTab*2)
lds R16,ProgNum
lpm R17,Z
inc R16
cp R16,R17
brne AutoEnabled_3
clr R16
AutoEnabled_3: sts ProgNum,R16
rcall ProgStep
ret
;===== Program stepping =================================
ProgStep: rcall WaitSync
lds R16,ProgBit
inc R16
sts ProgBit,R16
brne ProgStep_1
lds R16,Microphone
cpi R16,0x00
breq ProgStep_2
sbis PIND,PD3
;ret
rjmp ProgStep_1
ProgStep_2: rcall GetNextStep
ProgStep_1: rcall AdjValuesCh
rcall PWMmode
ret
;===== Wait syncronisation ==============================
WaitSync: push R16
push ZH
push ZL
ldi ZL,Low(Speeds)
ldi ZH,High(Speeds)
lds R16,ProgNum
add ZL,R16
ldi R16,0x00
adc ZH,R16
ld R16,Z
WaitSync_1: lds ZL,IntFlag
cpi ZL,0x00
breq WaitSync_1
clr ZL
sts IntFlag,ZL
dec R16
brne WaitSync_1
pop ZL
pop ZH
pop R16
ret
;===== Get next step ====================================
GetNextStep: push R16
push R17
push ZH
push ZL
ldi ZL,Low(ProgTab*2)
ldi ZH,High(ProgTab*2)
lds R16,ProgNum
ldi R17,0x00
add ZL,R16
adc ZH,R17
add ZL,R16
adc ZH,R17
adiw ZH:ZL,0x02
lpm R16,Z+
lpm R17,Z+
mov ZL,R16
mov ZH,R17
add ZL,ZL
adc ZH,ZH
lpm R17,Z
adiw ZH:ZL,0x02
lds R16,ProgSt
inc R16
cp R16,R17
brne GetNextSt_1
ldi R16,0xff
sts Endofprog,R16
clr R16
GetNextSt_1: sts ProgSt,R16
add ZL,R16
ldi R17,0x00
adc ZH,R17
lpm R16,Z
sts ProgValue,R16
pop ZL
pop ZH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -