⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irq.asm

📁 凌阳数据采集远程
💻 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 + -