📄 i2c_ir_common.s43
字号:
#include <msp430x11x1.h>
;-------------------------------------------------------------------------------
; Name: i2c_ir_common.s43
; Func: TimerA setting and its Interrupt routine
; Ver.: 1.1
; Date: June-2005
; Auth: Thomas Kot
; MSP430
; Texas Instruments Inc.
; Rem.: Build with IAR EW V4.3A
;-------------------------------------------------------------------------------
; Exported Symbols
;-------------------------------------------------------------------------------
PUBLIC INIT_COM
PUBLIC IR_STORED
PUBLIC ERROR_IR
;-------------------------------------------------------------------------------
; Imported Symbols
;-------------------------------------------------------------------------------
EXTERN IIC_STP2
EXTERN SDA
EXTERN SCL
EXTERN IR_SEQ
EXTERN IR_BRANCH
EXTERN CHECK_IR
EXTERN IR_FLAG
EXTERN DATA_IN
EXTERN BIT_CNT
;-------------------------------------------------------------------------------
; Define Constant
;-------------------------------------------------------------------------------
IRA1 EQU 04H ; P1.2 is used for IR signal capture
;-------------------------------------------------------------------------------
; Implementation
;-------------------------------------------------------------------------------
RSEG CODE
;-------------------------------------------------------------------------------
INIT_COM
call #INIT_TA12 ; Init Timer
ret
;-------------------------------------------------------------------------------
INIT_TA12 ; Timer A Init
;-------------------------------------------------------------------------------
bis.b #IRA1,&P1SEL ; Set P1.2 for TA1 capture input
bic.b #IRA1,&P1DIR ; Set as input
mov #TASSEL_2+ID_3+TACLR+TAIE,&TACTL
; SMCLK, DIV BY 8, STOP MODE,
; INT Enable, flag clear
; As BCSCTL2 has set DIVS_3, which
; further divide the SMCLK by 8.
; So, when using 8MHz crystal, the
; clock for timer is 125kHz.
; The timer will time out after 0.5s
mov #CM_2+SCS+CAP+CCIE,&TACCTL1
; TIMER A1, Capture on falling edge,
; CCI1A, SYNC CAP, INT, flag clear
mov #IR_SEQ-2,IR_BRANCH ; SET IR SEQUENCE ADDRESS
mov.b #00H,BIT_CNT ; Reset IR data Bit counter
mov #0000H,DATA_IN ; Reset IR data
ret
;-------------------------------------------------------------------------------
ISR_TIMERA ; Timer A Interrupt Routine
;-------------------------------------------------------------------------------
bic.b #SCL,&P1IE ; Disable SCL
bic.b #SDA,&P2IE ; Disable SDA, disable I2C
bic #0001H,&TACCTL1 ; Clear TA1 flag
cmp #000AH,&TAIV ; Check if timer overflow
jnz CHECK_IR ; If not, jump to CHECK_IR
IR_STORED
ERROR_IR call #INIT_TA12 ; Init TIMER A
bit.b #01H,IR_FLAG ; Check if it is an IR transmission
jc IR_END ; If Yes, Jump to IR_END
br #IIC_STP2 ; If not, Jump to IIC_STP2
; because of time out
IR_END bic.b #01H,IR_FLAG ; Reset IR_FLAG
bic.b #SDA,&P2IFG ; Clear SDA FLAG
bis.b #SDA,&P2IE ; Enable SDA interrupt, ENABLE I2C
reti
;-------------------------------------------------------------------------------
; Interrupt Vector
;-------------------------------------------------------------------------------
COMMON INTVEC
;-------------------------------------------------------------------------------
ORG TIMERA1_VECTOR
DW ISR_TIMERA
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -