📄 asm.asm
字号:
LPRT2: LDI R25,1
CLR R24 ;point to $100
LDI R17,$80
OUT GIMSK,R17 ;允许int1中断
LDI R17,$0A
OUT MCUCR,R17 ;INT1下降沿中断
SEI ;general interrupt enable
RET
EX_INT1:PUSH R26
PUSH R27
IN R27,SREG
PUSH R27
PUSH R17 ;保护现场
MOV R27,R25 ;取数据指针
MOV R26,R24
LD R17,X+ ;
MOV R25,R27
MOV R24,R26 ;增1后将指针送回
CPI R17,3 ;是停止符?
BRNE INT1SD
CLR R17
OUT GIMSK,R17 ;禁止INT1中断
RJMP INT1ED
INT1SD: OUT PORTC,R17 ;打印数据输出到打印口
CBI PORTD,7 ;clr ($12,7)
NOP
NOP
NOP
SBI PORTD,7 ;向打印机发出选通
INT1ED: POP R17
POP R27
OUT SREG,R27
POP R27
POP R26 ;恢复现场
RETI
;范例32 ;步进电机控制程序
.ORG 0
STRT10: RJMP RST10 ;8535/8515/晶振4MHZ
.ORG $011
RST10: LDI R16,HIGH(ramend)
OUT SPH,R16
LDI R16,LOW(ramend)
OUT SPL,R16
SER R16
OUT DDRB,R16 ;B口为输出
LDI R17,8
OUT PORTB,R16 ;接通总开关
LDI R16,50 ;50次基本运作
RCALL DELAY5 ;延时5毫秒
LOOPX: LDI R17,$68 ;step1时序脉冲控制
OUT PORTB,R17
RCALL DELAY2 ;延时2毫秒
LDI R17,$38 ;step2时序脉冲控制
OUT PORTB,R17
RCALL DELAY2 ;延时2毫秒
LDI R17,$98 ;step3时序脉冲控制
OUT PORTB,R17
RCALL DELAY2 ;延时2毫秒
LDI R17,$C8 ;step4时序脉冲控制
OUT PORTB,R17
RCALL DELAY2 ;延时2毫秒
DEC R16
BRNE LOOPX ;到50次?
LDI R17,8
OUT PORTB,r17 ;关闭各相位开关
RCALL DELAY5
RCALL DELAY5 ;延时10毫秒
CLR R17
OUT PORTB,R17 ;关闭所有相位开关和总开关
HH0: RJMP HH0 ;踏步
DELAY1: LDI R17,$06 ;延时1毫秒
MOV R15,R17 ;1000/0.75=1333=$535,外層计数器装入$06
LDI R17,$35 ;DEC+BRNE=0.75微秒
RJMP DLCOM
DELAY2: LDI R17,$0B ;延时2毫秒
MOV R15,R17 ;2000/0.75=2666=$0A6A,外層计数器装入$0B
LDI R17,$6A
DLCOM: DEC R17
BRNE DLCOM
DEC R15
BRNE DLCOM
RET
DELAY5: LDI R17,$1B ;延时5毫秒
MOV R15,R17 ;5000/0.75=6666=$1A0A,外層计数器装入$1B
LDI R17,$0A
RJMP DLCOM
;范例33
.ORG 0 ;8515采用定时器中断输出时序脉冲方式控制电机转动
STRT11: RJMP RST11 ;晶振4MHZ
.ORG $007
RJMP T0_OVF ;中断服务程序与STRT12共用
.ORG $00D
RST11: LDI R17,HIGH(ramend)
OUT SPH,R17
LDI R17,LOW(ramend)
OUT SPL,R17
LDI R17,$68
MOV R7,R17 ;初始脉冲为0B01101000
SER R17
OUT DDRB R17 ;B口为输出
LDI R17,N ;运作次数N(N>0)
RCALL STPDRV ;初始化子程序
HH20: RJMP HH20 ;实用时改为具体的背景程序!
STPDRV: TST R17
BRNE STPDR1
INC R17 ;N=0时,将其改为1
STPDR1: MOV R6,R17
INC R6 ;N+1-->r6(max.is 256;“植树问题”,N必需增1!
LDI R17,$A4
CBR R17,$20
STS $A4,R17 ;清除连续转动电机标志
LDI R17,$08
OUT PORTB,R17 ;接通总开关
LDI R17,4 ;0B00000100/ 256分频(4兆/256=1兆/64)
OUT TCCR0,R17
LDI R17,178 ;78*64=4.992ms
OUT TCNT0,R17 ;时间常数,首定时为5毫秒
LDI R17,$02
OUT TIMSK,R17 ;允许T/C0溢出中断
SEI
HH21: SJMP HH21
;范例34
.ORG $000 ;步进电机手动控制程序(8515)晶振4MHZ
STRT12: RJMP RST12
.ORG $007
RJMP T0SEV
.ORG $00D
RST12: LDI R17,HIGH(ramend)
OUT SPH,R17
LDI R17,LOW(ramend)
OUT SPL,r17
LDI R17,$68
MOV R7,R17 ;第一个时序脉冲
LDI R17,$F8
OUT DDRB,R17 ;PB7-PB3输出,PB2-PB0输入
CLR R17
OUT PORTB,R17 ;输出为低电平
LDS R17,$A4
SBR R17,$20 ;设置连续转动标志
CBR R17,$40 ;设置电机正转标志
TSTLP1: SBI PORTB,1 ;PB1接地,正转
SBIS PINB,1
RJMP TSTL11 ;
TSTL10: SBI PORTB,2
SBIC PINB,2 ;PB2接地,反转
RJMP TSTLP1 ;PB1,PB2都未接地,反复查询
SBR R17,$40 ;设置电机反转
TSTL11: STS $A4,R17 ;保存标志
CLR R6
INC R6 ;R6中装入1,减一次即为0!
LDI R17,$08
OUT PORTB,R17 ;接通总开关
LDI R17,4 ;0B00000100/256分频(256/4=64微秒)!
OUT TCCR0,R17
LDI R17,178 ;178之补为78,78*64=4.992ms
OUT TCNT0,R17 ;
LDI R17,$02
OUT TIMSK,R17 ;允许T/C0中断(toie1=$39,7 toie0=$39,1)
;8535,toie1:$39,2 toie0:$39,0
SEI
TSTLP2: SBI PORTB,1
SBI PORTB,2
IN R17,PINB
ANDI R17,6
CPI R17,6
BRNE TSTLP2 ;两开关未全部打开,查询等待
LDS R17,$A4
CBR R17,$20 ;清除连续转动标志
STS $A4,R17 ;
TSTLP3: IN R17,TIMSK
SBRC R17,1 ;已禁止8515中断?(8535:timsk,0)
RJMP TSTLP3 ;未,查询等待
RJMP RST12
T0_OVF: PUSH R17 ;电机控制中断服务子程序
IN R17,SREG
PUSH R17
LDS R17,$A4
SBRC R17,7
RJMP T0SV2 ;$A4,7:关电机前10毫秒延时标志
MOV R17,R7
CPI R17,$68
BRNE T0SV0
LDS R17,$A4
SBRC R17,5
RJMP T0SV0 ;电机连续转动,不减R6
DEC R6 ;R6减为0,将停止电机
BREQ T0SV1 ;
T0SV0: LDI R17,225 ;每步进延时(256-225)*64=1.984MS err.<0.8%
OUT TCNT0,R17 ;
OUT PORTB,R7 ;步进控制脉冲输出
LDS R17,$A4
SBRC R17,6
RJMP T0SVA ;$A4,6=1 为连续反转
CLC
SBRC R7,4 ;组织下一步控制脉冲
SEC
ROR R7
LDI R17,$08 ;正转
OR R7,R17 ;01101***->00111***->10011***->11001***->01101***.......
RJMP T0RET
T0SVA: MOV R17,R7 ;
SBR R17,$04
ROL R17 ;组织下一步控制脉冲(反转)
BRCS T0SVB
CBR R17,$10 ;01101***->11001***->10011***->00111***->01101***.......!
T0SVB: MOV R7,R17
RJMP T0RET
T0SV1: LDS R17,$A4
SBR R17,$80
STS $A4,R17 ;总开关关断前10毫秒延时标志
LDI R17,$08
OUT PORTB,R17 ;关断4个相位开关
LDI R17,100 ;156(256-100)*64=9.984ms
OUT TCNT0,R17 ;
RJMP T0RET
T0SV2: LDI R17,$07
OUT PORTB,R17 ;关闭所有开关
CLR R17
OUT TCCR0,R17 ;关T/C0中断
OUT TIMSK,R17
LDS R17,$A4
CBR R17,$C0
STS $A4,R17 ;清除10毫秒延时和反向转动标志
T0RET: POP R17
OUT SREG,R17
POP R17
RETI
;精确定时及时钟日历走时子程序
;范例35
.EQU DTPNT=$75 ;年年月日时分秒(from $7B to $75)
.ORG $000
STRT20: RJMP RST20 ;晶体实测频率4.000119MHZ
.ORG $006 ;8515 t1 overflow INT.vector
RJMP T1_OVF
.ORG $00D
RST20: LDI R16,HIGH(ramend)
OUT SPH,R16
LDI R16,LOW(ramend)
OUT SPL,R16
LDI R16,2 ;8分频,4000119/8=500015
OUT TCCR1B,R16
LDI R16,$5E ;500015=65536*8-24273=8*$10000-$5ed1/TCC=$5Ed1
OUT TCNT1H,R16 ;
LDI R16,$D1 ;
OUT TCNT1L,R16 ;将TCC写入TCNT1
LDI R16,$80
OUT TIMSK,R16 ;允许T/C1溢出中断
LDI R16,8 ;8次中断出秒号
MOV R6,R16
SEI
HH10: RJMP HH10 ;可改为具体的实用程序
T1_OVF: PUSH R16
PUSH R17
IN R7,SREG
DEC R6 ;到8次中断?
BRNE GOON1
IN R17,TCNT1L ;*
IN R16,TCNT1H ;*读回TCNT1自然计数值
SUBI R17,$2F ;*$5ED1之补为$A12F,以减法替代加法修正TCC
SBCI R16,$A1 ;*减去$A12E可不做下面的加1修正
SUBI R17,$FF ;*8条修正指令占用一个计数单位时间
SBCI R16,$FF ;*修正后TCC=$5ED1+(TCNT1)+1
OUT TCNT1H,R16 ;*
OUT TCNT1L,R17 ;*将修整后TCC写入TCNT1
LDI R16,8
MOV R6,R16 ;重装中断次数8
;.
;.
RCALL ACLK ;时钟走时
GOON1: POP R17
POP R16
OUT SREG,R7
RETI
;范例36
.EQU DTPNT=$75 ;yyyy mm dd hh mm ss(from $7B--$75)
.ORG $000 ;晶体实测频率8.000267MHZ,8分频
;INT(8000267/8)=1000033
STRT21: RJMP STRT21
.ORG $006 ;8515 t1 overflow INT. vector
RJMP T1_OVF
.ORG $00D
STRT21: LDI R16,HIGH(ramend)
OUT SPH,R16
LDI R16,LOW(ramend)
OUT SPL,R16
LDI R16,2
OUT TCCR1B,R16 ;8分频
LDI R16,1 ;1000033=62332*15+65053
;=($10000-$0C84)*15-$10000-$1E3
OUT TCNT1H,R16 ;主常数62332(补码为$0C84) 补尝常数TCC=$01E3
LDI R16,$E3 ;$FE1D=65053\65053+62332*15=1000033
OUT TCNT1L,R16
CLR R16
OUT TCCR1A,R16 ;DISABLE CMPA/CMPB/PWM!
LDI R16,$80 ;8515
OUT TIMSK,R16 ;允许T/C1溢出中断
LDI R16,16 ;16次中断
MOV R6,R16
SEI
HH11: RJMP HH11 ;
T1_OVF: PUSH R17
PUSH R16
IN R7,SREG
DEC R6 ;中断次数到?未到转装入主常数
BRNE COMP ;否则重装入TCC
IN R17,TCNT1L ;*
IN R16,TCNT1H ;*读回自然计数值
SUBI R17,$1D ;*
SBCI R16,$FE ;*减去TCC之补码
SUBI R17,255 ;*再加1
SBCI R16,255 ;*修正后TCC=$01E3+(TCNT1)+1
OUT TCNT1H,R16 ;*
OUT TCNT1L,R17 ;*
LDI R16,16
MOV R6,R16 ;重写中断次数
;.
;.
RCALL ACLK ;时钟走时
RJMP GOON2
COMP: IN R17,TCNT1L ;*
IN R16,TCNTIH ;*读回TCNT1自然计数值
SUBI R17,$7C ;*先减去$0C84$'补码$F37C
SBCI R16,$F3 ;*再作加1补偿
SUBI R17,$FF ;*
SBCI R16,$FF ;*修整后重装值=[$0C84+(TCNT1)+1]
OUT TCNT1H,R16 ;*
OUT TCNT1L,R17 ;*
GOON2: POP R16
POP R17
OUT SREG,R7
RETI
;范例37 ;8515使用T/C0定时,64分频,晶振频率40
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -