;********************************************************************** ; Analyzes IR remote control signals * ;********************************************************************** ; * ; Filename: iralyze.asm * ; Date: 22/8/2002 * ; File Version: $Revision: 1.1 $ * ; * ; Author: Prashant Bhandary * ; * ;********************************************************************** ; ; ; Currently done for a 16F876 ; list p=16f876 ; list directive to define processor #include <p16f876.inc> ; processor specific variable definitions __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF ; dly1 equ 04h dly2 equ 00h dly3 equ 00h baud19_2 equ .31 ;19.2K baud with high speed enable(10MHz crystal) ; ; Error codes ERR_HEADER equ 0x80 ; Indicates error byte to follow ERR_NO_SIGNAL equ 0x41 ; Indicates no signal received ERR_TIMEOUT equ 0x42 ; Indicates end of signal MaxTimeout equ 0x80 ; Timeout count for delay after signal ; ; Data ORG 20H ; Data Origin ; DlyHsb RES 1 ; MSB of delay count DlyMsb RES 1 ; MSB of delay count DlyLsb RES 1 ; LSB of delay count ; ; Timeout delay waiting for start of signal Wait1 RES 1 Wait2 RES 1 Wait3 RES 1 ; PortA_ RES 1 ; Store last state of Port A InpBit equ 0 InpMask equ (1<<InpBit) TicCount RES 1 ; No. of samples Timeout RES 1 ; Hold timeout once signal received ErrReg RES 1 ; Holds error to be sent TxBuf RES 1 ; Holds byte to be transmitted ; w_temp EQU 0x70 ; variable used for context saving status_temp EQU 0x71 ; variable used for context saving ; ; Program ; ORG 0 ; Reset vector ; nop goto main ; ; ORG 4 ; Interrupt vector retfie ; return from interrupt ; ; ; ORG 8 ; Program starts here ; main bsf STATUS,RP0 movlw 1 movwf TRISA ; Set Port A to all outputs except RA0 movlw 7 movwf ADCON1 ; Disable A/D port ; Setup serial port movlw baud19_2 movwf SPBRG bcf STATUS,RP0 bsf RCSTA,SPEN ; Enable serial port bsf RCSTA,CREN ; Enable receive bsf STATUS,RP0 bsf TXSTA,TXEN bsf TXSTA,BRGH bcf STATUS,RP0 delay movlw dly1 movwf DlyHsb loop4 movlw dly2 movwf DlyMsb loop3 movlw dly3 movwf DlyLsb loop2 btfss RCSTA,OERR goto NoOver bcf RCSTA,CREN bsf RCSTA,CREN NoOver btfss PIR1,RCIF goto NoRecv movf RCREG,0 ;movwf TXREG xorlw 'R' btfss STATUS,Z goto NoRecv clrf ErrReg call ReadIR ChkTx btfss PIR1,TXIF goto ChkTx movf ErrReg,0 movwf TXREG ChkTx2 btfss PIR1,TXIF goto ChkTx2 NoRecv decfsz DlyLsb,1 goto loop2 decfsz DlyMsb,1 goto loop3 decfsz DlyHsb,1 goto loop4 movlw 2 xorwf PORTA,1 goto delay ; ReadIR clrf TicCount clrf Timeout clrf Wait1 clrf Wait2 movlw .38 movwf Wait3 clrf PortA_ WaitStart movf PORTA,0 ;1 xorwf PortA_,0 ;2 andlw InpMask ;3 btfss STATUS,Z ;4/5 goto StartFound ;5 decfsz Wait1,1 goto WaitStart decfsz Wait2,1 goto WaitStart decfsz Wait3,1 goto WaitStart movlw ERR_NO_SIGNAL movwf ErrReg movlw ERR_HEADER movwf TXREG return StartFound movf PORTA,0 ;7 movwf PortA_ ;8 incf TicCount,1 ;9 goto Delay1 ;10 LoopRead movf PORTA,0 ;1 xorwf PortA_,0 ;2 andlw InpMask ;3 btfss STATUS,Z ;4/5 goto Bchange ;5 ; incf TicCount,1 ;6 movf TicCount,0 ;7 xorlw .127 ;8 btfss STATUS,Z ;9/10 goto Delay1 ;10 ; ; count reached 127 incf Timeout,1 ;11 movlw MaxTimeout ;12 xorwf Timeout,0 ;13 btfsc STATUS,Z ;14/15 goto ErrorTOut ;15 clrf TicCount ;16 movlw .127 ;17 movwf TxBuf ;18 btfsc PortA_,InpBit ;19/20 bsf TxBuf,7 ;20 movf TxBuf,0 ;21 movwf TXREG ;22 goto LoopRead ;24 ErrorTOut movlw ERR_TIMEOUT ;16 movwf ErrReg movlw ERR_HEADER movwf TXREG return Bchange clrf Timeout ;7 incf TicCount,0 ;8 movwf TxBuf ;9 btfsc PortA_,InpBit ;10/11 bsf TxBuf,7 ;11 movf TxBuf,0 ;12 movwf TXREG ;13 clrf TicCount ;14 movf PORTA,0 ;15 movwf PortA_ ;16 goto Delay2 ;18 Delay1 ;11 nop ;12 nop ;13 nop ;14 nop ;15 nop ;16 nop ;17 Delay2 ;18 nop ;18 nop ;19 nop ;20 nop ;21 nop ;22 goto LoopRead ;24 ; return ; end