⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 migalka.asm

📁 Lamp switcher. (4 channels with PWM)
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;========================================================
;               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 + -