一直没有调试出结果,希望高手能不吝赐教!!
源码如下:
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 ;送出一个脉冲的标志寄存器
.include "F2407REGS.H" ;引用头部文件
.ref F$$ITOF,F$$DIV,F$$MUL,F$$FTOI,F$$ADD,F$$LTOF,F$$SUB
.ref _sin
.def _c_int0
;(1)建立中断向量表
.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
SW_INT10 B PHANTOM
SW_INT11 B PHANTOM
SW_INT12 B PHANTOM
SW_INT13 B PHANTOM
SW_INT14 B PHANTOM
SW_INT15 B PHANTOM
SW_INT16 B PHANTOM
SW_INT17 B PHANTOM
SW_INT18 B PHANTOM
SW_INT19 B PHANTOM
SW_INT20 B PHANTOM
SW_INT21 B PHANTOM
SW_INT22 B PHANTOM
SW_INT23 B PHANTOM
SW_INT24 B PHANTOM
SW_INT25 B PHANTOM
SW_INT26 B PHANTOM
SW_INT27 B PHANTOM
SW_INT28 B PHANTOM
SW_INT29 B PHANTOM
SW_INT30 B PHANTOM
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-0001h
B PHANTOM ;Reserved pvector addr offset-002Eh
B T3GP_ISR ;Reserved pvector addr offset-002Fh T3PINT中断
B PHANTOM ;Reserved pvector addr offset-0030h
B PHANTOM ;Reserved pvector addr offset-0041h
;(2)主程序
.text
_c_int0:
CALL SYSINIT ;调系统初始化子程序
CALL PWM_INIT ;调PWM初始化子程序
LDP #5
SPLK #2710H,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 #5
BIT DFLAG,BIT0
BCND LOOP,NTC
LACL DFLAG
AND #0FFFEH
SACL DFLAG
CALL DATIO
B LOOP
;(3)系统初始化程序
SYSINIT:
SETC INTM
CLRC CNF
LDP #0
SPLK #02h,IMR ;使能第1级中断2
SPLK #0FFFFh,IFR ;清第1级所有中断标志位
LDP #DP_PF1
SPLK #0E8h,WDCR ;禁止 WDT
LDP #00E0H
SPLK #81FEH,SCSR1 ;CLKIN=6M,CLKOUT=24 M
RET
;(4)EVB模块的PWM初始化程序
PWM_INIT:
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 ;PWM6,4,2 为低,PWM5,3,1 为高
SPLK #00h,DBTCONB ;禁止死区控制
SPLK #1fh,CMPR4 ;给比较寄存器赋初值
SPLK #2Fh,CMPR5
SPLK #3fh,CMPR6
SPLK #0960h,T3PR ;给周期寄存器赋初值
LDP #5
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
;(5)将一些整数转换为浮点数子程序,得到计算占空比要用的常数
JISUAN:
LDP #5 ;调谐度由整形转换为浮点
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
;(6)计算占空比子程序
DATIO:
LDP #5
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 #5
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
;(7)定时器3中断程序
GISR2:
SST #0,ST0_CON1 ;保存状态寄存器
SST #1,ST1_CON1
LDP #0E0h ;DP指针指向 PIVR 所在的数据区
LACC PIVR,1 ;读 EVIVRB, 结果左移一位
ADD #PVECTORS ;加上偏移量
BACC
T3GP_ISR:
LDP #5
LACC DFLAG
OR #1 ;设置DFLAG.15=1
SACL DFLAG
LACL DATIOL
LDP #DP_EVB
SACL CMPR4 ;更新比较寄存器的值
ADD #32H
SACL CMPR5
ADD #32H
SACL CMPR6
LDP #0
LST #1,ST1_CON1
LST #0,ST0_CON1
LDP #DP_EVB
SPLK #0FFFFH,EVBIFRA
CLRC INTM
RET
END