📄 adda2.asm
字号:
.include "F2407REGS.H" ;引用头部文件
.def _c_int0
;(1)建立中断向量表
.sect ".vectors" ;定义主向量段
RSVECT B _c_int0 ;PM 0 复位向量
INT1 B PHANTOM ;PM 2 中断优先级1
INT2 B GISR2 ;PM 4 中断优先级2
INT3 B PHANTOM ;PM 6 中断优先级3
INT4 B PHANTOM ;PM 8 中断优先级4
INT5 B PHANTOM ;PM A 中断优先级5
INT6 B GISR1 ;PM C 中断优先级6
RESERVED B PHANTOM ;PM E 模拟量输入中断(保留)
SW_INT8 B PHANTOM ;PM 10 用户定义软件中断
SW_INT31 B PHANTOM ;PM 3E 用户定义软件中断
;中断子向量入口定义pvecs
.sect ".pvecs" ;定义子向量段
PVECTORS B PHANTOM ;保留向量地址偏移量 0000h
B PHANTOM ;保留向量地址偏移量 0001h
B PHANTOM ;保留向量地址偏移量 0002h
B PHANTOM ;保留向量地址偏移量 0003h
B ADCINT_ISR ;保留向量地址偏移量 0004h ADC中断
B PHANTOM ;保留向量地址偏移量 0005h
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B PHANTOM
B T1PINT_ISR
.bss DAC0_VAL,1
.bss DAC2_VAL,1
.bss DAC3_VAL,1
.bss nn,1
.bss cnt,1
;(2)主程序:
.text
_c_int0
SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF
LDP #0E0H
SPLK #81FEH,SCSR1 ;CLKIN=6 M,CLKOUT=24 M
SPLK #0E8h,WDCR ;关看门狗
LDP #0
SPLK #022h,IMR ;允许INT1中断
lacc IFR
sacl IFR
SPLK #0FFFFh,IFR ;清所有中断标志
CALL ADINIT ;初始化ADC程序
CALL DAINIT ;初始化DA程序
CLRC INTM ;开总中断
CALL AD ;启动模数转换程序
WAIT: NOP
B WAIT
; (3) D/A初始化程序
DAINIT:
LDP #DP_EVA
SPLK #80H, EVAIMRA
SPLK #0FFFFh, EVAIFRA
SPLK #0, GPTCONA
SPLK #060H, T1PR
SPLK #0, T1CNT
SPLK #0164CH, T1CON
LDP #0000h
splk #0000h,nn
splk #0000h,cnt
RET
;(4)ADC初始化程序
ADINIT:
LDP #T4CNT>>7 ;设置通用定时器4
SPLK #0000H,T4CNT
SPLK #170CH,T4CON
SPLK #0040H,T4PR
SPLK #4400H,GPTCONB
SPLK #0FFFFH,EVBIFRB
SPLK #0000H,EVBIMRB
LDP #ADCCTRL1>>7
SPLK #0036H,ADCCTRL1 ;设置ADC控制寄存器
SPLK #8404H,ADCCTRL2
SPLK #0000H,MAXCONV
SPLK #3210h,CHSelseq1 ;16 通道
RET
;(5)启动模数转换程序
AD:
LDP #T4CON>>7
LACL T4CON
OR #40H ;启动定时器4,定时器4周期中断启动ADC中断
SACL T4CON
RET
;(5)ADC中断程序
GISR1: ;优先级INT6中断子程序入口
;保护现场
LDP #PIVR>>7
LACC PIVR,1 ;读取外设中断向量寄存器(PIVR),并左移一位
ADD #PVECTORS ;加上外设中断入口地址
BACC ;跳到相应的中断服务子程序
ADCINT_ISR:
zac
ldp #0
lar ar2,#result0
mar *,ar2
lacl *
rpt #3
sfr
sacl DAC2_VAL
OUT DAC2_VAL,0302h
LDP #ADCCTRL2>>7
LACL ADCCTRL2
OR #4000H ;复位 SEQ1
AND #0FFDFH ;清 INT FLAG SEQ1
SACL ADCCTRL2
;___________这部分程序为对定时器操作___________
;LDP #T4CON>>7
;LACL T4CON
;AND #0FFBFH ;停止定时器4,即停止AD转换
;SACL T4CON
GISR1_RET: ;中断返回出口
;恢复现场
CLRC INTM ;开总中断,因为一进中断就自动关闭了总中断
RET
;(6)DA中断程序
GISR2:
LDP #0E0H
LACC PIVR,1
ADD #PVECTORS
BACC
; 只设置一个中断时...
T1PINT_ISR:
ldp #0
lacc nn
bcnd p3,gt
lacc cnt
add #0fh
sacl cnt
lacc cnt
sacl DAC0_VAL
OUT DAC0_VAL,0300h
lacc cnt
SUB #07ffh
BCND P2, GEQ
ADD #007Ffh
B P6
P2: ldp #0
splk #0001h,nn
P3: lacc cnt
SUB #0fh
sacl cnt
lacc cnt
SACL DAC0_VAL
OUT DAC0_VAL,0300h
BCND P6,GT
ldp #0h
splk #0000h,nn
P6: LDP #DP_EVA
SPLK #0, T1CNT
LDP #0E8H
LACL EVAIFRA
SACL EVAIFRA
ldp #0000h
splk #022h,imr
CLRC INTM
RET
;(7)假中断程序
PHANTOM
KICK_DOG ;复位看门狗
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -