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

📄 mac_timer_isr.s51

📁 zigbee location examples
💻 S51
字号:

#include "ioCC2430.h"
#include <iar_check_symbols.h>

; External symbols and constants
#if (__CODE_MODEL__ == __CM_BANKED__)
MAC_CALLBACK_INFO_SIZE  EQU     9
#else
MAC_CALLBACK_INFO_SIZE  EQU     8
#endif
MAC_CALLBACK_PAGE       EQU 	0
MAC_CALLBACK_COUNT      EQU 	12
NO_CALLBACK             EQU     0FFH
T2_VECTOR_ADDR          EQU     0x53
MAC_BANK_MEMCTR         EQU     0x30

                EXTERN  mschDoTask
                EXTERN  firstCallback
                EXTERN  intAlreadyOff
                EXTERN  pMtimCallbacks

#if (__CODE_MODEL__ == __CM_BANKED__)
                EXTERN  ?BCALL
#endif
                EXTERN  ?INTERRUPT_ENTER_XSP
                EXTERN  ?INTERRUPT_LEAVE_XSP

                ; Using AJMP to make sure that the ISR is put in the lower 32 kB of the flash (not bank switched)
                COMMON  INTVEC(1)
                ORG     T2_VECTOR_ADDR
 	            AJMP    mtimTickIsr;

                RSEG    RCODE
fakeReti:	    RETI;
		
                PUBLIC mtimTickIsr;
		        ; Push all necessary registers onto the stack
mtimTickIsr:    PUSH 	ACC;
                MOV     A, #0F2H;
                LCALL   ?INTERRUPT_ENTER_XSP;

                ; Disable interrupts...
         		CLR	    EA;

         		; Clear the compare event and period event flags before running the fake RETI instruction
                ANL	    T2CNF, #3FH;
         		CLR	    T2IF;
         		ACALL	fakeReti;
		
         		; Are there any callbacks? (if not, then skip callback handling)
doCallback: 	MOV 	A, firstCallback;
                JB	    ACC.7, doTask;

                ; We're using PDATA mapping to fetch the callback struct
                MOV 	MPAGE, #MAC_CALLBACK_PAGE + 0E0H;

                ; Let R0 point to the next MAC_CALLBACK_INFO struct
                MOV 	B, #MAC_CALLBACK_INFO_SIZE;
                MUL	    AB;
                MOV 	R0, A;

                ; Fetch the least significant byte (R0 points to it)
                MOVX	A, @R0;

                ; Do we need to borrow from the higher byte(s)?
                JZ	    fullTimeoutDecr;

                ; Decrement and check for timeout if we've reached zero
                DEC 	A;
                MOVX	@R0, A;
                JNZ	    noTimeout;

                ; Check for timeout by getting the more significant bytes
                INC	    R0;
                MOVX	A, @R0;
                JNZ	    noTimeout;
                INC	    R0;
                MOVX	A, @R0;
                JNZ	    noTimeout;

                ; Timeout reached, so here we go...

                ; Move our pointer, R0, past the timeout counter
                INC     R0;
                INC     R0;

                ; Move on the firstCallback flag
anotherCallback:
                MOVX	A, @R0;
                MOV	    firstCallback, A;

                ; Clear the occupied flag
                INC 	R0;
                CLR 	A;
                MOVX	@R0, A;

#if (__CODE_MODEL__ == __CM_BANKED__)
#else
    ; set up return address
                MOV     A, #LOW chkAdditional
                PUSH    A
                MOV     A, #HIGH chkAdditional
                PUSH    A
#endif
                ; Put the function address into DPTR and the bank number into A
                INC	    R0;
                MOVX	A, @R0;
                MOV	    DPL, A;
                INC	    R0;
                MOVX	A, @R0;
                MOV	    DPH, A;
                INC     R0;

#if (__CODE_MODEL__ == __CM_BANKED__)
                ; Make the banked function call
                MOVX    A, @R0;
                LCALL   ?BCALL;
#else
                CLR     A
                JMP     @A+DPTR   ; Call subroutine
#endif
                ; Check for additional callbacks
chkAdditional:  MOV	    A, firstCallback;
                JB	    ACC.7, doTask;

                ; Let R0 point to the next MAC_CALLBACK_INFO struct
                MOV 	B, #MAC_CALLBACK_INFO_SIZE;
                MUL	    AB;
                MOV	    R0, A;

                ; Timeout already now?
                MOVX	A, @R0  ;
                JNZ	    noTimeout;
                INC	    R0;
                MOVX	A, @R0;
                JNZ	    noTimeout;
                INC	    R0;
                MOVX	A, @R0;
                JNZ	    noTimeout;
                INC	    R0;
                INC	    R0;
                SJMP	anotherCallback;

                SJMP	doTask;
			
fullTimeoutDecr:	
                ; Do full decrement with borrow (at this point A = LSB(timeout))
                DEC 	A;
                MOVX	@R0, A;

                ; Middle byte
                INC	    R0;
                MOVX	A, @R0;
                DEC	    A;
                MOVX	@R0, A;
                CJNE    A, #0FFH, noTimeout;

                ; MSB
                INC	    R0;
                MOVX	A, @R0;
                DEC	    A;
                MOVX	@R0, A;

noTimeout:		; Done (there is no timeout since LSB = 0xFF)

doTask:		    LCALL   mschDoTask;

                ; Exit the interrupt service routine
                MOV     R7, #01H
                SETB    EA;
                LJMP    ?INTERRUPT_LEAVE_XSP;
                RET;

                END;

⌨️ 快捷键说明

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