📄 irq.asm
字号:
.include hardware.inc
.external _flag
.external _count
.external _initi
.define P_ADC_MUX_Ctrl 0x702b
.define P_ADC_MUX_Data 0x702c
.define add1 0x0100
.define add2 0x020
.define add3 0x0300
.define add4 0x0400
.RAM
.VAR add1c,G_Time4,G_Time1=0
.VAR add2c,G_TimeA=0
//=============================================================
// 函数名称: _IRQ5
// 功能描述: IRQ5中断有两个中断源:2Hz和4Hz,这里仅使用2Hz的中断.当计数时间到0.5秒
//时,停止中断IRQ5,IRQ3,开中断IRQ1.其中中断3是外部中断用于记录外部信号的脉冲数
//中断5,用于定时,二者用于测频。
//入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=================================================================
.TEXT
.PUBLIC _IRQ5
_IRQ5:
push r1,r5 to [sp] //压栈保护
r1 = 0x0001;
[P_Watchdog_Clear] = r1 //清看门狗
[_flag]=r1
r1=0x0004
[P_IOA_Data] = r1
r1=[_count]
cmp r1,0x03e8
jb L_irq5_2
r1=0x000c
[P_IOA_Data] = r1
//r1 = 0x0008
//test r1,[P_INT_CTRL] //比较是否为4Hz的中断源
//jnz L_irq5_4 //是,则转至对应程序段
L_irq5_2: //否,则进入2Hz程序段
r1 = 0x0004
[P_INT_Clear] = r1
//r2 = [G_Time2]
//r2+ = 0x0001
//[G_Time2] = r2
r1=[_count]
r1=r1 lsl 1
[_count]=r1
r1=0x0000
[P_INT_Ctrl]=r1
pop r1,r5 from [sp]
reti
//=============================================================
// 函数名称: _IRQ3
// 功能描述: IRQ3有IRQ3_EXT2、IRQ3_EXT1和IRQ3_KEY三个中断源, 这里
// 只做外部中断EXT1,(键唤醒中断后面有专门的实验)通过IOB2
// 产生一个负跳沿来触发中断,进而对外部信号脉冲进行计数
//入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=================================================================
.TEXT
.PUBLIC _IRQ3
_IRQ3:
push r1,r5 to [sp] //压栈保护
r1 = 0x0100
[P_INT_Clear] = r1
r1=[_count]
r1+=1
[_count]=r1
r1 = 0x0001 //清看门狗
[P_Watchdog_Clear] = r1
pop r1,r5 from [sp]
reti
//=============================================================
// 函数名称: _IRQ
// 功能描述: IRQ0_TMA、IRQ1_TMA、IRQ1_TMB三个中断,当定时器A或B
// 计满溢出时产生中断请求信号TA_TIMEOUT_INT或TA_TIMEOUT_INT,
// CPU响应后执行相应的中断服务子程序.这里仅使用IRQ1_TMA
//入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=================================================================
.TEXT
.PUBLIC _IRQ0;
.PUBLIC _IRQ1;
.PUBLIC _IRQ2;
_IRQ0:
push r1,r5 to [sp]; //压栈保护
r1 = 0x4000;
[P_INT_Clear] = r1;
pop r1,r5 from [sp];
reti
_IRQ1:
push r1,r5 to [sp]; //压栈保护
r1 = 0x1000;
[P_INT_Clear] = r1;
r2 = [G_TimeA];
r2 += 0x0001;
[G_TimeA] = r2;
cmp r2,0x0001
jbe reset2
r1=[P_IOA_Data]
r1|=0x0020
[P_IOA_Data] = r1
r1=0x0000
[G_TimeA] = r1
jmp comp2
reset2:
r1=[P_IOA_Data]
r1&=0x00df
[P_IOA_Data]=r1
comp2:
r2=[add1c]
r2+=0x0100
test r2,0x0200
jnz stopc
r1 = [P_ADC_MUX_Data]
[r2++]=r1
//[P_DAC2]=r1
//[P_DAC1]=r1
r2-=0x0100
[add1c]=r2
r1 = 0x0001
[P_Watchdog_Clear] = r1 //清看门狗
pop r1,r5 from [sp];
reti;
stopc:
r2=0x0100
r1 = [P_ADC_MUX_Data]
[r2++]=r1
//[P_DAC2]=r1
//[P_DAC1]=r1
r2-=0x0100
[add1c]=r2
r1=0x0001
[P_Watchdog_Clear] = r1 //清看门狗
pop r1,r5 from [sp];
reti;
_IRQ2:
push r1,r5 to [sp]; //压栈保护
r1 = 0x0400;
[P_INT_Clear] = r1;
r2=[add1c]
cmp r2,0x0200
jnz stop1
r1 = [P_ADC_MUX_Data]
[r2++]=r1
[add1c]=r2
r1 = 0x0001
[P_Watchdog_Clear] = r1 //清看门狗
pop r1,r5 from [sp];
reti;
stop1:
r2=0x0100
r1 = [P_ADC_MUX_Data]
[r2++]=r1
[add1c]=r2
r1=0x0001
[P_Watchdog_Clear] = r1 //清看门狗
pop r1,r5 from [sp];
reti;
//********************************************************//
//函数:collect_initial();
//初始化采样频率,开中断
//参数:无
//返回:无
//========================================================================================
.PUBLIC _collect_initial
_collect_initial: .PROC
r1=0x0000
[G_Time4]=r1
r1=0x0001
[P_ADC_Ctrl]=r1
[P_ADC_MUX_Ctrl]=r1
r1=0x0000
[P_DAC_Ctrl]=r1
r1=0x1050
[P_INT_Ctrl]=r1
r1=[_count]
cmp r1,0x0010
jbe stop3
r1=0x0030
[P_TimerA_Ctrl]=r1
r1=[_initi]
[P_TimerA_Data]=r1
//r2=0x0100
//[add1c]=r2
//[add2c]=r2
jmp exit;
stop3:
r1=0x0005
[P_TimerA_Ctrl]=r1
r1=[_initi]
[P_TimerA_Data]=r1
//r2=0x0100
//[add1c]=r2
//[add2c]=r2
exit:
retf;
.ENDP
//============================================================
// 文件名称:irq4.asm
// 实现功能: IRQ4中断有三个中断源:1KHz、2Kz和4KHz,这里仅用1Hz
//********************************************************
.TEXT
.PUBLIC _IRQ4
_IRQ4:
push r1,r5 to [sp] //压栈保护;
r1 = 0x0010;
test r1,[P_INT_Ctrl]; //比较是否为1KHz的中断源;
jnz L_irq4_1k; //是,则转至对应程序段;
r1 = 0x0020;
test r1,[P_INT_Ctrl] //否,则比较是否为2KHz的中断源;
jnz L_irq4_2k; //是,则转至对应程序段;
L_irq4_4k: //否,则进入4KHz程序段;
r2 = [G_Time4];
r2 += 0x0001;
[G_Time4] = r2;
cmp r2,0x0001 //比较是否为0.25秒;
jbe reset
r1=0x00c0
[P_IOB_Data] = r1
r1=0x0000
[G_Time4] = r1
jmp exit1;
reset:
r1=0x0000
[P_IOB_Data] = r1
exit1:
r1 = 0x0040;
[P_INT_Clear] = r1;
r1 = 0x0001
[P_Watchdog_Clear] = r1 //清看门狗
pop r1,r5 from [sp];
reti;
L_irq4_2k:
r1=0x0020
[P_INT_Clear]=r1
r1 = 0x0001
[P_Watchdog_Clear] = r1 //清看门狗
pop r1,r5 from [sp];
reti;
L_irq4_1k:
r1 = 0x0010;
[P_INT_Clear] = r1;
r2 = [G_Time1];
r2 += 0x0001;
[G_Time1] = r2;
cmp r2,0x0001
jbe reset1
r1=[P_IOA_Data]
r1|=0x0080
[P_IOA_Data] = r1
r1=0x0000
[G_Time1] = r1
jmp comp1
reset1:
r1=[P_IOA_Data]
r1&=0x007f
[P_IOA_Data]=r1
comp1:
r3=[add2c]
r3+=0x0100
test r3,0x0200
jnz stop2
r1=[r3]
[P_DAC2]=r1
[P_DAC1]=r1
r3+=1
r3-=0x0100
[add2c]=r3
r1 = 0x0001
[P_Watchdog_Clear] = r1 //清看门狗
pop r1,r5 from [sp];
reti;
stop2:
r3=0x0000
[add2c]=r3
r1 = 0x0001
[P_Watchdog_Clear] = r1 //清看门狗
pop r1,r5 from [sp];
reti;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -