📄 ly3.asm
字号:
.title "A"
.bss GPR0,1 ;通用目的寄存器
.copy "240XAVECTOR.H" ;拷贝中断向量头文件
.include "240XA.H"
.def _c_int0
DP_CAN .set 0E2H
DP_CAN2 .set 0E4H
.sect ".PVECS" ;定义子向量段
PVECTORS B PHANTOM ;保留向量地址偏移量0000H
B PHANTOM ;保留向量地址偏移量0001H
B PHANTOM ;保留向量地址偏移量0002H
B PHANTOM ;保留向量地址偏移量0003H
B PHANTOM ;保留向量地址偏移量0004H
B PHANTOM ;保留向量地址偏移量0005H
B SCI_RX_ISR ;保留向量地址偏移量0006H SCI接收中断
B PHANTOM ;保留向量地址偏移量0007H
B PHANTOM ;保留向量地址偏移量0041H
.data
COEF .word 0A3EH,0H,0999H,01460H,01CD0H,02000H
.word 01CD0H,01460H,0999H,0H,0A3EH
SIN .word 0000H,0F4H,0553H,05AFH,0386H,0432H,04BEH,0526H,044AH
.word 0581H,0573H,0541H,04EFH,0480H,03F9H ,0363H,02C3H,03A8H
.word 0484H,054FH,03CAH,0699H,070EH,075DH,0784H,0783H,05C8H
.word 0709H,0698H,0609H,0562H, 04AAH,03E8H,04AAH,0562H,0609H
.word 0698H,0709H,05C8H,0783H,0784H,075DH,070EH,0699H,03CAH
.word 054FH,0484H,03A8H,02C3H ,0263H,03F9H,0480H,04EFH,0541H
.word 0573H,0581H,044AH,0526H,04BEH,0432H,0386H,05AFH,0553H
.word 0F4H
SIC: .word 03FFh,03FEh,03FBh,03F4h,03ECh,03E1h,03D3h,03C4h
.word 03B2h,039Dh,0387h,036Eh,0353h,0336h,0317h,02F6h
.word 02D4h,02AFh,0289h,0261h,0238h,020Eh,01E2h,01B5h
.word 0187h,0158h,0129h,00F8h,00C7h,0096h,0064h,0032h
.word 00h,0FFCEh,0FF9Ch,0FF6Ah,0FF39h,0FF08h,0fED7h,0FEA8h
.word 0FE79h,0FE4Bh,0FE1Eh,0FDF2h,0FDC8h,0FD9Fh,0FD77h,0FD51h
.word 0FD2Ch,0FD0Ah,0FCE9h,0FCCAh,0FCADh,0FC92h,0FC79h,0FC63h
.word 0FC4Eh,0FC3Ch,0FC2dh,0FC1Fh,0FC14h,0FC0Ch,0FC05h,0FC02h
.word 0FC00h,0FC02h,0FC05h,0FC0Ch,0FC14h,0FC1Fh,0FC2Dh,0FC3Ch
.word 0FC4Eh,0FC63h,0FC79h,0FC92h,0FCADh,0FCCAh,0FCE9h,0FD0Ah
.word 0FD2Ch,0FD51h,0FD77h,0FD9Fh,0FDC8h,0FDF2h,0FE1Eh,0FE4BH
.word 0FE79h,0FEA8h,0FED7h,0FF08h,0FF39h,0FF6Ah,0FF9Ch,0FFCEh
.text
_c_int0:
LDP #0H
SETC INTM ; 禁止中断
SETC CNF
CLRC SXM
SPLK #0000H,IMR ; 屏蔽所有CPU中断
LACC IFR ; 读中断标志
SACL IFR ; 清所有的中断标志
LDP #00E0H ; 设置DP=E0H,则地址为7000H~707FH
SPLK #006FH,WDCR ; 使能看门狗
SPLK #0080H,SCSR1 ; 使能ADC模块时钟
KICK_DOG
SPLK #0H,60H ;设置等待状态发生器:
OUT 60H,WSGR ;程序区,0-7 等待状态
ADC
* 初始化 ADC 寄存器:
LDP #00E1H ;设置DP=E1H,则地址为7080H~70FFH
SPLK #4000H,ADCCTRL1 ;复位ADC模块
NOP
SPLK #3000H,ADCCTRL1 ;设置ADC控制寄存器,定义为级联模式,排
;序器为SEQ,工作模式为启动/停止。
SPLK #0,MAXCONV ;设定一次自动转换为16个通道(最大值)
* 设定转换顺序:
SPLK #03210H,CHSELSEQ1 ;转换通道 0,1,2,3
SPLK #07654H,CHSELSEQ2 ;转换通道4,5,6,7
SPLK #0BA98H,CHSELSEQ3 ;转换通道8,9,10,11
SPLK #0FEDCH,CHSELSEQ4 ;转换通道12,13,14,15
SPLK #04000H,ADCCTRL2 ;复位排序器使排序器指针指向CONV00
SPLK #02000H,ADCCTRL2 ;启动转换
LOOP: LAR AR4,RESULT0
B ADC
B LOOP
CALL LMS
CALL FFT
;************自适应滤波**********************
LMS:
N .set 10 ;存放系数的起始地址
WN .set 0220H
DPTRO .set 2000H ;输出起始地址
ONE .set 08100H
U .set 08102H ;存放收敛因子U的地址
EN .set 08104H
DN .set 08106H ;存放理想信号的地址
YN .set 08108H ;当前输出的地址
I .set 127
.sect ".VECTORS"
.bss BUFF, N
.bss TEMP, 1
.text
_C_INT1:
LDP #00E0H
SPLK #006FH,WDCR ;关看门狗
LDP #04H
LAR AR0,#WN
MAR *,AR0
RPT #10
BLDD #COEF,*+ ;把系数置入以220H开始的单元中
LAR AR0,#WN
LDP #6
LAR AR1,#BUFF ;AR1指向缓冲区
MAR * ,AR1
ZAC
RPT #10
SACL *+ ;缓冲器清零
LDP #04H
LAR AR2,#300H
RPT #63
BLDD #SIN,*+ ;SIN值依次放入DPTRI输入起始地址
RPT #63
BLDD #SIN,*+
LAR AR2,#300H
LAR AR3,#DPTRO
SPLK #0147H,U ;(U)=0.01
SPLK #01H,ONE
SPLK #0999H,DN ;置入理想信号
LAR AR6,#I
DONE:
MAR *,AR2
LACL *+
LDP #6
SACL BUFF ;采样信号放入缓冲器
CALL FIR
MAR *,AR3
SACH *+,1 ;输出信号
LDP #04H
SACH YN,1
LACL DN
SUB YN ;(ACC)=(DN)-(YN)
SACL EN
LT EN
MPY U
ZAC
APAC ;计算的(ACC)=U*E(N)
ADD ONE,15
SACH EN ;修正(EN)=U*E(N)
LAR AR0,#WN
LDP #06H
LAR AR1,#BUFF+N
LDP #04H
LT EN
LAR AR5,#10
MAR *,AR1
MPY *,AR0 ;U*E(N)*X(N-10)
ALTER:
LACC *,0,AR1
MPYA *-,AR0 ;(ACC)=W(I)+U*E(N)*X(N-I)
SACL *+,0,AR5
BANZ ALTER,*-,AR0
MAR *,AR6
BANZ DONE,*- ;改变系数W(N)
FIR:
LAR AR1,#BUFF+N
MPY #0H ;PREG清零
ZAC ;累加器清零
LAR AR4, #10
SUM:
MAR *,AR1
LT *-,AR0
MPY *+,AR4
BANZ SUM,*-
APAC
RET
;***********************FFT************************************
FFT:
I0 .EQU 98
J .EQU 99 ;循环计数器
L .EQU 101
M .EQU 102
B .EQU 103
TTTB .EQU 104
R1 .EQU 105
R2 .EQU 106
I1 .EQU 107
I2 .EQU 108
I128 .EQU 109
I512 .EQU 110
I768 .EQU 111
I800 .EQU 112
S1 .EQU 114
XT .equ 115
C1 .EQU 116
YT .equ 117
T .EQU 118
TABLE .EQU 2000h ;128个样值存放单元的首址
.text
START: LALK 128
SACL I128
LALK 512
SACL I512
LALK 768
SACL I768
LALK 800
SACL I800
REAL: LRLK AR0,64
LRLK AR1,512
LRLK AR2,127
LAR AR3,#TABLE
REPR: LARP AR3
LACC *+,0,AR1
SACL *BR0+
LARP AR2
BANZ REPR
LACK 0
LRLK AR1,640
LRLK AR2,127
REPI: LARP AR1
SACL *+
LARP AR2
BANZ REPI
W: LRLK AR1,768
LRLK AR2,95
LAR AR3,#SIC
LL: LARP AR3
LACC *+,0,AR1
SACL *+
LARP AR2
BANZ LL
LACK 0
SACL B
LOOP1: LAC B
ADDK 1
SACL B
LARK AR0,7
LAR AR1,B
LARP AR1
CMPR 2
BBNZ GLP
LAR AR7,B
LARP AR7
LACK 1
SACL TTTB
B1: LT TTTB
MPYK #2
PAC
SACL TTTB
BANZ B1
LAC TTTB
CLRC C
ROR
SACL TTTB
CLRC C
ROR
SACL L
LACK 7
SUB B
SACL T
LAR AR7,T
LACK 1
SACL M
B2: LT M
MPYK #2
PAC
SACL M
BANZ B2
LAC M
CLRC C
ROR
SACL M
LACK 0
SACL I0
LOOP2: LARK AR0,127
LAR AR7,I0
LARP AR7
CMPR 2
BBNZ LOOP1
LACK 0
SACL J
LOOP3: LAC L
SUBK 1
SACL T
LAR AR0,T
LAR AR7,J
LARP AR7
CMPR 2
BBNZ INCRI
B MAIN
INCRI: LAC I0
ADD TTTB
SACL I0
B LOOP2
MAIN: SPM 0
SOVM
SSXM
LARP AR5
LAC I0
ADD J
ADD I512
SACL T
LAR AR5,T
LAC *
SACL R1
LAC T
ADD I128
SACL T
LAR AR5,T
LAC *
SACL I1
LAC T
SUB I128
ADD L
SACL T
LAR AR5,T
LAC *
SACL R2
LAC T
ADD I128
SACL T
LAR AR5,T
LAC *
SACL I2
LARP AR5
LT J
MPY M
PAC
ADD I768
SACL T
LAR AR5,T
LAC *
SACL C1
LAC T
ADDK 32
SACL T
LAR AR5,T
LAC *
SACL S1
LARP AR5
LAC I0
ADD J
ADD I512
SACL T
LAR AR5,T
LT R2
MPY C1
PAC
LT I2
MPY S1
SPAC
SACH XT,6
LACC R1
ADD XT
ROR
SACL * ;
LAC T
ADD I128
SACL T
LAR AR5,T
LT R2
MPY S1
PAC
LT I2
MPY C1
APAC
SACH YT,6
LACC I1
ADD YT
ROR
SACL *
LAC T
SUB I128
ADD L
SACL T
LAR AR5,T
LACC R1
SUB XT
ROR
SACL *
LAC T
ADD I128
SACL T
LAR AR5,T
LACC I1
SUB YT
ROR
SACL *
LAC J
ADDK I0
SACL J
B LOOP3
GLP: LRLK AR1,127
LRLK AR2,512
LRLK AR3,640
LRLK AR4,896
PS: ZAC
MPYK 0
LARP AR2
SQRA *+,AR3
SQRA *+,AR4
APAC
SACH *+
LARP AR1
BANZ PS
WAIT:
B WAIT
RET
;*********************CAN邮箱***************************
;CAN寄存器配置
SPLK #1000H,CANMCR ;改变配置寄存器
W_CCE
BIT CANGSR,#0BH ;等待改变配置使能,检测GSR的CCE位
BCND W_CCE,NTC ;CCE=1允许对配置寄存器进行配置
SPLK #0027H,CANBCR2 ;波特率预定标
SPLK #001AH,CANBCR1 ;采样点设置
SPLK #0000H,CANMCR ;改变配置寄存器
W_NCCE
BIT CANGSR,#0BH ;等待禁止改变配置寄存器
BCND W_NCCE,TC
;在写之前配置CAN
SPLK #0040H,CANMDER ;D5~D0为0,禁止任何信箱
SPLK #0103H,CANMCR ;CDR位(D8)为1,改变数据区请求
;写CAN邮箱
LDP #DP_CAN2
SPLK #0FFFFH,CANMSGID0H
SPLK #0FFFEH,CANMSGID0L
SPLK #0008H,CANMSGCTRL0
SPLK #2447H,CANMSGID3H ;设置邮箱3的标识符
SPLK #0FFFFH,CANMSGID3L
SPLK #08H,CANMSGCTRL3 ;RTR=0,DCL=8
SPLK #01H, CANMBX3A ;邮箱3信息初始化,设置初始值
SPLK #05H, CANMBX3B
SPLK #0AH, CANMBX3C
SPLK #0EH, CANMBX3D
;写之后设置参数
LDP #DP_CAN
SPLK #04C0H,CANMCR ;CDR位(D8)为0,正常工作模式
SPLK #004CH,CANMDER ;使能邮箱3
SPLK #0F7FFH, CANIMR ;使能中断
SPLK #0FFFFH,CANIFR
;CAN发送报文
LDP #0E1H
LACL RESULT0
LDP #0E4H
SACL CANMBX3A ;把要发送的数据放入邮箱3
LDP #0E0H
SPLK #0020H,CANTCR ;启动发送
W_TA BIT CANTCR,2 ;等待MBX3的传送确认
BCND W_TA,NTC
SPLK #2000H,CANTCR ;复位发送确认位TA
B LOOP
RET
;中断程序
GISR1: ;优先级INT1中断人口
LDP #0E0H
LACC PIVR,1 ;读取外设中断向量寄存器(PIVR),并左移一位
ADD #PVECTORS ;加上外设中断人口地址
BACC ;跳到相应的中断服务子程序
SCI_RX_ISR:
LDP #4H ;设置页面
SPLK #1H, SCI_FLAG ;清发送软件标志位
CLRC INTM ;中断清0
RET
;假中断程序
PHANTOM
KICK_DOG ;复位看门狗
RET
GISR2: RET
GISR3: RET
GISR4: RET
GISR5: RET
GISR6: RET
;PHANTOM: RET
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -