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

📄 isr.asm

📁 基于凌阳61和pwm电机实现的智能车总程序
💻 ASM
字号:
//****************************************************************
// Function: Fast Interrupt Service routine Area                     
// 	Service for 	(1)PWM FIQ
//					(2)Timer A FIQ
//					(3)Timer B FIQ
// 	User's FIQ must hook on here                            
// 	_FIQ:									// Fast interrupt entrence
//  _IRQ1:									// interrupt entrence
//  _IRQ2:									// interrupt entrence
//  _IRQ3:									// interrupt entrence
//  _IRQ4:									// interrupt entrence
//  _IRQ5:									// interrupt entrence
//  _IRQ6:									// interrupt entrence     
//  _IRQ7:									// interrupt entrence
//****************************************************************

//+++++++++++++++++++++++++++++++++//
//   SOME MACROS.......            //
//---------------------------------//
SET_IOA_IN: .MACRO  //USING R1 FOR TEMP
  R1 = 0x00ff
  [P_IOA_Dir] = R1
  R1 = 0xFFFF
  [P_IOA_Attrib] = R1 
.ENDM

SET_IOA_OUT: .MACRO //USE R1 FOR TEMP
  R1 = 0xFFFF
  [P_IOA_Attrib] = R1
  [P_IOA_Dir] = R1
.ENDM

RD_8279_FIFORAM: .MACRO //改变了 R1,R2的值,使用 R1 返回函数值
  SET_IOA_IN;
  R2 = C_RD_FIFORAM
  [P_IOB_Data] = R2;
//  R1 = 0x0000
//  [P_IOA_Data] = R1;
  R1 = [P_IOA_Data];
  R2 = C_IOB_DEFAULT & ~C_8279_A0
  [P_IOB_Data] = R2
.ENDM 

RD_8279_STATUS: .MACRO //改变了 R1,R2的值,使用 R1 返回函数值
  SET_IOA_IN;
  R2 = C_RD_STATUS 
  [P_IOB_Data] = R2;
//  R1 = 0x0000
//  [P_IOA_Data] = R1;
  R1 = [P_IOA_Data];
  R2 = C_IOB_DEFAULT 
  [P_IOB_Data] = R2
.ENDM 

WR_8279_DISPLAYRAM: .MACRO DATA  //改变了 R1,R2 的值
  .IFMA 0
    .MACEXIT
  .ENDIF
  SET_IOA_OUT;
  R2 = C_WR_RAM
  [P_IOB_Data] = R2;
  R1 = DATA;
  R2 = [P_IOA_Data]
  R2 = R2 & 0x00FF
  R1 = R1 | R2
  [P_IOA_Data] = R1;
  R2 =  C_IOB_DEFAULT & ~C_8279_A0
  [P_IOB_Data] = R2;
.ENDM

WR_8279_CONTROL: .MACRO DATA  //改变了 R1,R2 的值
  .IFMA 0
    .MACEXIT
  .ENDIF
  SET_IOA_OUT;
  R2 = C_WR_CONTROL
  [P_IOB_Data] = R2;
  R1 = DATA;
  R2 = [P_IOA_Data]
  R2 = R2 & 0x00FF
  R1 = R1 | R2
  [P_IOA_Data] = R1;
  R2 =  C_IOB_DEFAULT ;
  [P_IOB_Data] = R2;
.ENDM

//SCANKEY: .MACRO
//  RD_8279_STATUS  //读8279状态
//  R1 = R1 & 0x0F00
//  CMP R1,0x0000  //比较是否有键按下
//  JNE RDKEY
//  PC = SCANKEYexit

//RDKEY:   
//  r3 = r1&0x0700
 
//  WR_8279_CONTROL 0x5000  //写入读 fifo ram 控制字
//Lop:
//  r3 -= 0x0100
//  RD_8279_FIFORAM  //读 fifo ram
//  cmp r3,0
//  jne Lop
//  R4 = R1   //保存在 R4 中
//  WR_8279_CONTROL 0xC200
//  WR_8279_CONTROL 0xF000  //写入8279中断结束命令字
//  call F_TestState
//  CALL DisplayKey  //调用键值显示函数
//SCANKEYexit:
//.ENDM

CLEAR_WATCHDOG: .MACRO  //USE R1
  R1 = 0x0001
  [P_Watchdog_Clear] = R1
.ENDM   
     
MacroIRQ5: .macro
   CLEAR_WATCHDOG
   
   R1 = C_IRQ_2Hz;      
   Test R1,[P_INT_Ctrl];
   JNZ  IRQ5_2Hz; 

   R1 = C_IRQ_4Hz;
   Test R1,[P_INT_Ctrl]
   JNZ  IRQ5_4Hz_mid;
   PC = EXIT_5;
IRQ5_4Hz_mid:
   pc = IRQ5_4Hz

.ENDM

MacroIRQ4: .macro
   CLEAR_WATCHDOG
   
   R1 = C_IRQ_1024Hz;  // 1 KHz
   Test R1,[P_INT_Ctrl];
   JNZ  IRQ4_1024; 

   R1 = C_IRQ_2048Hz;  // 2 KHz  
   Test R1,[P_INT_Ctrl]
   JNZ  IRQ4_2048;
   
   R1 = C_IRQ_4096Hz;  // 4 KHz
   Test R1,[P_INT_Ctrl];
   JNZ  IRQ4_4096;
   PC = EXIT_4;
.ENDM

.EXTERNAL DisplayKey,CalV,Hex2Dec,discode,F_TestState
.EXTERNAL Stop,F_TestState,CalLong,AlertMetal,Stop5sec
.EXTERNAL F_Delay,TestObject,delay,gogogo,Stop5Sec,Time5SecFlag,LastIntCtrlStatus

.iram
.var TotalPules = 0
.var TotalMetal = 0
.var CurrentMetal = 0
.public CPointFlag
.var CPointFlag = 0
.public LastMetalFlag 
.var LastMetalFlag = 0
.public abc
.var abc=0
.public Time
.var Time = 0

.TEXT
.INCLUDE  hardware.asm;				// include io information

.public _BREAK;
.public _FIQ;
.public _IRQ0;
.public _IRQ1;
.public _IRQ2;
.public _IRQ3;
.public _IRQ4;
.public _IRQ5;
.public _IRQ6;
.public _IRQ7;

                
_FIQ:                                  
        push r1,r4 to [sp];
        R1 = [P_INT_Ctrl]
        [P_INT_Clear] = R1


        
		pop r1,r4 from [sp];
        reti;             

/////////////////////////////////////////////////////////////////////////////////////////
// Function: Interrupt Service routine Area                     
// 	Service for 	IRQ1 - IRQ7
// 	User's IRQ must hook on here                                 
/////////////////////////////////////////////////////////////////////////////////////////        
_BREAK:        
		push r1,r4 to [sp];
		
		pop r1,r4 from [sp];
        reti; 
_IRQ0:        
		push r1,r4 to [sp];
		
		pop r1,r4 from [sp];
        reti;         
//--------------------------------irq1
_IRQ1:        
		push r1,r4 to [sp];
		
		pop r1,r4 from [sp];
        reti;  

//--------------------------------irq2        
_IRQ2:        
		push r1,r4 to [sp];

		pop r1,r4 from [sp];
        reti;         
     
//------------------------------irq3   
_IRQ3:        
		push r1,r4 to [sp];
		INT OFF
		r1 = [P_INT_Ctrl]
	
        R1=C_IRQ_Ext2;
        TEST R1,[P_INT_Ctrl];     //测试B9,是否为EXT2中断
        JNZ IRQ3_3;          //   
        R1=C_IRQ_Ext1;
        TEST R1,[P_INT_Ctrl];     //测试B8,是否为EXT1中断
        JNE IRQ3_2;
        R1=C_IRQ_KeyChange;
        TEST R1,[P_INT_Ctrl];     //测试B7,是否为键唤醒信号
        JNE IRQ3_1;           //
IRQ3_1:
        [P_INT_Clear] = R1
        
        pc = EXIT
IRQ3_2:
        [P_INT_Clear] = R1
        
        PC = EXIT
IRQ3_3:        
        [P_INT_Clear] = R1
        r1 = [LastMetalFlag]
        test r1,1
        jnz EXIT_1
        jmp next_1
EXIT_1:
        pc = EXIT
        next_1:
        r1 = [TotalMetal]
        r1 += 1
        [TotalMetal] = r1
        [CurrentMetal] = r1
        r3 = r1
        r4 = r3
        call AlertMetal
        r1 = [CPointFlag]
        test r1,1
        jnz LastMetal
        pc = EXIT
LastMetal:
        r3 = [TotalMetal]
        call Hex2Dec
                [Time5SecFlag] = r1
         r1 = [P_INT_Ctrl]
        [LastIntCtrlStatus]= r1
        r1 = 1
        [LastMetalFlag] = r1
        r1 =1 


        call Stop
       SET_IOA_IN
       R1 = [P_IOA_Data]
        R2 = 0x00C0
        r1 = R1|R2
        r3 = r1
        SET_IOA_OUT
       [P_IOA_Data]= R3
        r4 = 0x0280
        golop10:
        r4 -= 1
        call delay
        CLEAR_WATCHDOG
        cmp r4,0
        jne golop10
          R2 = 0xff3f
         r1 = R1&R2
        r3 = r1
        SET_IOA_OUT
        [P_IOA_Data]= R3

        r1 = 0x03ff
        delaylop:
        r1 -= 1
        push r1 to [sp]
        call delay
        call gogogo
        pop r1  from [sp]
        cmp r1,0
        jne delaylop
        r1 =1
        [abc]= r1
        int off
        r1 = 0x0004
        [P_INT_Ctrl]=r1
        call gogogo//????????????????????????????这里
EXIT:
        CLEAR_WATCHDOG
        IRQ ON
                
        pop r1,r4 from [sp]
        reti;
                 
//----------------------------irq4
_IRQ4:        
		push r1,r4 to [sp];
		INT OFF
		MacroIRQ4
IRQ4_1024:
        [P_INT_Clear] = R1

IRQ4_2048:
       [P_INT_Clear] = R1
IRQ4_4096:	
       [P_INT_Clear] = R1
EXIT_4:	
		pop r1,r4 from [sp];
        reti;  

//----------------------------irq5        
_IRQ5:        
		push r1,R5 to  [sp];
		INT OFF
		MacroIRQ5
IRQ5_2Hz:
		[P_INT_Clear] = R1
		CLEAR_WATCHDOG;
//		r1 = [Time5SecFlag]
//		test r1,1
//		jz NotAtC
//		call Stop5Sec
NotAtC:
	    r1 = [P_TimerB_Data]
		[TotalPules] = r1
		r1 = [Time]
		r1 += 1
		[Time] = r1
		call CalLong
//		call CalV
//		PUSH R3 TO [SP]
//		BP = discode  //换码
//		r4 = r4 + bp  //
//		r4 = [r4]     //
//		POP R3 FROM [SP]
//		CALL Hex2Dec
//		R1 = 0x0000
//		[P_TimerA_Data] = R1
		CLEAR_WATCHDOG;
		pc = EXIT_5		
IRQ5_4Hz:
        [P_INT_Clear] = R1
        CLEAR_WATCHDOG;
        r1 = [abc]
        test r1,0
        jne EXIT_5
        call F_TestState
//        r1 = [CPointFlag]
//        test r1,1
//        jnz TestObjectProgram
//        pc = EXIT_5
TestObjectProgram:
//        call TestObject
EXIT_5:
        CLEAR_WATCHDOG
		IRQ ON
		pop r1,R5 from [sp];
        reti;         

//----------------------------irq6        
_IRQ6:        
		push r1,r4 to [sp];
		[P_INT_Clear] = R1
//		CLEAR_WATCHDOG;
//        call F_TestState
//	    CLEAR_WATCHDOG
		
		pop r1,r4 from [sp];
        reti;         

//----------------------------irq7        
_IRQ7:        
		push r1,r4 to [sp];

		pop r1,r4 from [sp];
        reti;

//========================================================================================        
// End of isr.asm
//========================================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -