📄 spwm.asm
字号:
FCL .usect ".data0", 1 ;保存载波频率浮点数的低位
FCH .usect ".data0", 1 ;保存载波频率浮点数的高位
FRL .usect ".data0", 1 ;保存信号频率浮点数的低位
FRH .usect ".data0", 1 ;保存信号频率浮点数的高位
AL .usect ".data0", 1 ;保存调谐度浮点数低位
AH .usect ".data0", 1 ;保存调谐度浮点数高位
N .usect ".data0", 1 ;保存一周期要输出的PWM脉冲个数
NL .usect ".data0", 1 ;保存一周期要输出的PWM脉冲个数浮点数低位
NH .usect ".data0", 1 ;保存一个周期要输出的PWM脉冲个数浮点数低位
I .usect ".data0", 1 ;保存当前输出的是第几个脉冲
T3PR_TEMPL .usect ".data0", 1 ;保存定时器3周期寄存器值的浮点数低位
T3PR_TEMPH .usect ".data0", 1 ;保存定时器3周期寄存器值的浮点数高位
DATIOL .usect ".data0", 1 ;保存占空比浮点数低位
DATIOH .usect ".data0", 1 ;保存占空比浮点数低位
DFLAG .usect ".data0", 1 ;送出一个脉冲的标志寄存器
ST0_CON0 .usect ".data0", 1
ST0_CON1 .usect ".data0", 1
ST1_CON0 .usect ".data0", 1
ST1_CON1 .usect ".data0", 1
STACK .usect ".stack", 100h
.include "F2407REGS.H" ;引用头部文件
.ref F$$ITOF, F$$DIV, F$$MUL, F$$FTOI, F$$ADD, F$$LTOF, F$$SUB
.ref _sin
.def _c_int0
;建立中断向量表
.sect ".vectors" ;定义主向量段
RSVECT B _c_int0 ;PM 0 Reset Vector 1
INT1 B PHANTOM ;PM 2 Int level 1 4
INT2 B GISR2 ;PM 4 Int level 2 5
INT3 B PHANTOM ;PM 6 Int level 3 6
INT4 B PHANTOM ;PM 8 Int level 4 7
INT5 B PHANTOM ;PM A Int level 5 8
INT6 B PHANTOM ;PM C Int level 6 9
RESERVED B PHANTOM ;PM E (Analysis Int) 10
SW_INT8 B PHANTOM ;PM 10 User S/W int -
SW_INT9 B PHANTOM ;PM 12 User S/W int -
SW_INT10 B PHANTOM ;PM 14 User S/W int -
SW_INT11 B PHANTOM ;PM 16 User S/W int -
SW_INT12 B PHANTOM ;PM 18 User S/W int -
SW_INT13 B PHANTOM ;PM 1A User S/W int -
SW_INT14 B PHANTOM ;PM 1C User S/W int -
SW_INT15 B PHANTOM ;PM 1E User S/W int -
SW_INT16 B PHANTOM ;PM 20 User S/W int -
TRAP B PHANTOM ;PM 22 Trap vector -
NMI B PHANTOM ;PM 24 Non maskable Int 3
EMU_TRAP B PHANTOM ;PM 26 Emulator Trap 2
SW_INT20 B PHANTOM ;PM 28 User S/W int -
SW_INT21 B PHANTOM ;PM 2A User S/W int -
SW_INT22 B PHANTOM ;PM 2C User S/W int -
SW_INT23 B PHANTOM ;PM 2E User S/W int -
SW_INT24 B PHANTOM ;PM 30 User S/W int -
SW_INT25 B PHANTOM ;PM 32 User S/W int -
SW_INT26 B PHANTOM ;PM 34 User S/W int -
SW_INT27 B PHANTOM ;PM 36 User S/W int -
SW_INT28 B PHANTOM ;PM 38 User S/W int -
SW_INT29 B PHANTOM ;PM 3A User S/W int -
SW_INT30 B PHANTOM ;PM 3C User S/W int -
SW_INT31 B PHANTOM ;PM 3E User S/W int -
;中断子向量入口定义pvecs
.sect ".pvecs" ;定义子向量段
PVECTORS
B PHANTOM ;Reserved pvector addr offset-0000h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0005h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-000ah
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0010h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0015h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-001Ah
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0020h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0025h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0027h T1PINT中断
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-002Ah
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B T3GP_ISR ;pvector addr offset 0x02f - T3PINT
B PHANTOM ;Reserved pvector addr offset-0030h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0035h
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-003aAh
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-003Fh
B PHANTOM ;Reserved pvector addr offset
B PHANTOM ;Reserved pvector addr offset-0041h
;主程序
.text
_c_int0:
CALL SYSINIT ;调系统初始化子程序
CALL PWM_INIT ;调PWM初始化子程序
LDP #DP_B2
SPLK #2000H, FCL ;载波频率
SPLK #0, FCH
SPLK #032H, FRL ;信号频率
SPLK #0, FRH
SPLK #3E8H, AL ;调谐度AL=A*1000
SPLK #0, AH
SPLK #0, I ;I=0
SPLK #1, DFLAG
CALL JISUAN
LOOP: LDP #DP_B2
BIT DFLAG, BIT0
BCND LOOP, NTC
LACL DFLAG
AND #0FFFEH
SACL DFLAG
CALL DATIO
B LOOP
;系统初始化程序
SYSINIT:SETC INTM ;关闭中断
CLRC CNF ;B0区被配置为数据空间
LDP #0
SPLK #02h, IMR ;使能第1级中断2
SPLK #0FFFFh, IFR ;清第1级所有中断标志位
LDP #DP_PF1
SPLK #0E8h, WDCR ;禁止 WDT
LDP #00E0H
SPLK #81FEH, SCSR1 ;CLKIN=10M,CLKOUT=40 M
RET
PWM_INIT: ; EVB模块的PWM初始化程序
LDP #DP_PF2
LACL MCRA
OR #07EH ;IOPE1~IOPE6
SACL MCRC ;配置为特殊功能
LACL MCRC
OR #600h
SACL MCRC
LDP #DP_EVB
SPLK #0FFFFh, EVBIFRA ;清EVA的所有中断标志位
SPLK #0555h, ACTRB ;PWM12,10,8 为低, PWM11,9,7 为高
SPLK #00h, DBTCONB ;禁止死区控制
SPLK #1fh, CMPR4 ;给比较寄存器赋初值
SPLK #2Fh, CMPR5
SPLK #3fh, CMPR6
SPLK #0960h, T3PR ;给周期寄存器赋初值
LDP #DP_B2
SPLK #0960h, T3PR_TEMPL
SPLK #0, T3PR_TEMPH
LDP #DP_EVB
SPLK #0A600h, COMCONB ;禁止比较功能
SPLK 0, T3CNT
SPLK #41h, GPTCONB
SPLK #080h, EVBIMRA
SPLK #0000101101001110b, T3CON
CLRC INTM
RET
;将一些整数转换为浮点数子程序, 得到计算占空比要用的常数
JISUAN: LDP #DP_B2 ;调谐度由整形转换为浮点
LACL AL
LRLK AR1, STACK ;设置 STACK指针
SETC SXM
CALL F$$ITOF, AR1 ;A=a×1000
CLRC SXM
MAR *-
LACC *-, 16
ADDS *
SACL AL
SACH AH
LRLK AR1, STACK ;A/2000=0.5 a
SETC SXM
LACL #0
SACL *+
LACL #44FAH ;44FA 0000h =2000
SACL *+
LACL AL
SACL *+
LACL AH
SACL *+
CALL F$$DIV
MAR *-
LACC *-, 16
ADDS *
SACL AL
SACH AH
LACL T3PR_TEMPL
LRLK AR1, STACK
SETC SXM ;定时器周期寄存器的值转换为浮点数
CALL F$$ITOF, AR1
CLRC SXM
MAR *-
LACC *-, 16
ADDS *
SACL T3PR_TEMPL
SACH T3PR_TEMPH
LACL FCL ;FC值转换为浮点数
LRLK AR1, STACK
SETC SXM
CALL F$$LTOF, AR1
CLRC SXM
MAR *-
LACC *-, 16
ADDS *
SACL FCL
SACH FCH
LACL FRL
LRLK AR1, STACK
SETC SXM ;FR值转换为浮点数
CALL F$$ITOF, AR1
CLRC SXM
MAR *-
LACC *-,16
ADDS *
SACL FRL
SACH FRH
LRLK AR1, STACK ;N=FC/FR
LACL FRL
SACL *+
LACL FRH
SACL *+
LACL FCL
SACL *+
LACL FCH
SACL *+
CALL F$$DIV
MAR *-
LACC *-, 16
ADDS *
SACL NL
SACH NH ;N的浮点数
LRLK AR1, STACK
SETC SXM
SACL *+
SACH *+
CALL F$$FTOI
SACL N ;N的整数
LRLK AR1, STACK
SACL *+
LACL NH
SACL *+
LACL #0F5C3H ;40C8F5C3h=6.282=2×3.141
SACL *+
LACL #40C8H
SACL *+
CALL F$$DIV
MAR *-
LACC *-, 16
ADDS *
SACL NL
SACH NH
RET
;计算占空比子程序
DATIO: LDP #DP_B2
LACL I ;I由整形转换为浮点数
LRLK AR1, STACK
SETC SXM
CALL F$$ITOF, AR1
CLRC SXM
MAR *-
LACC *-, 16
ADDS * ;结果保存在 ACC
LRLK AR1, STACK ;i*2*3.14/N
SACL *+
SACH *+
LACL NL
SACL *+
LACL NH
SACL *+
CALL F$$MUL
MAR *-
ZALH *-
ADDS *
LRLK AR1, STACK ;sin(i*2*3.14/N)
SACL *+
SACH *+
CALL _sin ;结果在 ACC
LRLK AR1, STACK ;0.5a*sin(i*2*3.14/N)
SACL *+
SACH *+
LACL AL
SACL *+
LACL AH
SACL *+
CALL F$$MUL
MAR *-
ZALH *-
ADDS * ;结果在 ACC
LRLK AR1, STACK ;D=0.5+A*sin(i*2*3.14/N)
SACL *+
SACH *+
LACL #0
SACL *+
LACL #3F00H ;3F00 0000h =0.5
SACL *+
CALL F$$ADD
MAR *-
ZALH *-
ADDS * ;结果在 ACC
LRLK AR1, STACK
SACL *+
SACH *+
LACL T3PR_TEMPL
SACL *+
LACL T3PR_TEMPH
SACL *+
CALL F$$MUL
MAR *-
ZALH *-
ADDS * ;结果在 ACC
LRLK AR1, STACK ;CMPR的浮点数转换为整数
SETC SXM
SACL *+
SACH *+
CALL F$$FTOI, AR1
CLRC SXM ;结果在 ACC
SACL DATIOL
LDP #DP_B2
LACC I
SUB N
BCND NSPWM, GEQ
LACC I
ADD #1
SACL I
B RRET
NSPWM: SPLK #0, I ;断是否是下一个周期
RRET: RET
PHANTOM:KICK_DOG ;复位WD计数器
RET
;定时器3中断程序
GISR2: SST #0, ST0_CON0 ;保存状态寄存器
SST #1, ST1_CON1
LDP #0E0h ;DP指针指向 PIVR 所在的数据区
LACC PIVR, 1 ;读 EVIVRB, 结果左移一位
ADD #PVECTORS ;加上偏移量
BACC
T3GP_ISR: LDP #DP_B2
LACC DFLAG
OR #1 ;设置DFLAG.0=1
SACL DFLAG
LACL DATIOL
LDP #DP_EVB
SACL CMPR4 ;更新比较寄存器的值
ADD #32H
SACL CMPR5
ADD #32H
SACL CMPR6
LDP #DP_EVB
SPLK #0FFFFH, EVBIFRA
CLRC INTM
LDP #0
LST #1, ST1_CON1
LST #0, ST0_CON0
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -