;AtomSoft Conversion to 18F1320
;Tutorial 5.2 - Nigel Goodwin 2002
;Sony SIRC IR transmitter
LIST p=18F1320 ;tell assembler what chip we are using
include <p18F1320.inc> ;include the defaults for the chip
CONFIG OSC = INTIO2, WDT = OFF, LVP = OFF, DEBUG = ON ;sets the configuration settings (oscillator type etc.)
cblock 0x00 ;start of general purpose registers
count1 ;used in delay routine
counta ;used in delay routine
countb
count
PCount
Delay_Count
Bit_Cnt
Data_Byte
Dev_Byte
Rcv_Byte
Pulse
endc
IR_Port Equ PORTB ;Set IR_Port to equal your IR Port
IR_Tris Equ TRISB ;Set IR_Tris to equal IR Tris
IR_Bit Equ 0x01 ;Set IR_Bit to equal the bit on the port your IR LED is on
SW_Port Equ PORTA ;Set SW_Port to equal your button port
SW_Tris Equ TRISA ;Set SW_Tris to equal your button tris
SW1_Bit Equ 7 ;Set SW1_Bit to equal the bit on the port of your first button
SW2_Bit Equ 6 ;Set SW1_Bit to equal the bit on the port of your second button
CMD1 Equ 0x00 ;Set this to equal to the Command to send when you press button 1
CMD2 Equ 0x01 ;Set this to equal to the Command to send when you press button 2
org 0x00 ;Start of Code
Start
MOVLW 0x62 ;Used to set OSCCON to 4Mhz
MOVWF OSCCON
BCF IR_Port, IR_Bit ;Make IR Port Bit Low
BCF IR_Tris, IR_Bit ;Make IR Port Bit Output
BSF SW_Tris, SW1_Bit ;Make Switch 1 Input
BSF SW_Tris, SW2_Bit ;Make Switch 2 Input
BSF SW_Port, SW1_Bit ;Make Switch 1 High
BSF SW_Port, SW2_Bit ;Make Switch 2 High
Read_Sw
BTFSS SW_Port, SW1_Bit ;Check if SW1 went Low
CALL Command1 ;Yes is did so call command #1
BTFSS SW_Port, SW2_Bit ;SW1 did go low or finished so check SW2 now
CALL Command2 ;SW2 went low so call command #2
GOTO Read_Sw ;Loop back
Command1
MOVLW CMD1 ;Move the Byte in CMD1 to WREG
CALL TXIR
RETLW 0x00
Command2
MOVLW CMD2 ;Move the Byte in CMD2 to WREG
CALL TXIR
RETLW 0x00
PulseIR
MOVWF PCount ;Move WREG contents to PCount
PLoop
BSF IR_Port, IR_Bit ;Beginning of pulse
NOP
NOP
NOP
NOP
NOP
NOP
NOP ;7uS Long Pulse
BCF IR_Port, IR_Bit ;Flat Line End pulse
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ PCount, F ;15-18uS Long FlatLine End Pulse if count is 0... Return
GOTO PLoop ;Pulse Again
RETLW 0
FlatLine
MOVWF PCount
NPLoop
BCF IR_Port, IR_Bit ;Flatline for 25uS
NOP
NOP
NOP
NOP
NOP
NOP
NOP
BCF IR_Port, IR_Bit
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ PCount, F
GOTO NPLoop
RETLW 0
Tx_Start
MOVLW d'96' ;Move 96 to WREG which is the pulse number for 2.4mS which is START Burst
CALL PulseIR ;Pulse IR with 96 in WREG
MOVLW d'24' ;Move 24 to WREG which is the pulse number for 600uS
CALL FlatLine ;Send a FlatLine
RETLW 0x00
Tx_One
MOVLW d'48' ;Move 48 to WREG which is the number for a Logical 1 which is 1.2mS
CALL PulseIR ;Pulse IR with 48 in WREG
MOVLW d'24' ;Another FlatLine
CALL FlatLine
RETLW 0x00
Tx_Zero
MOVLW d'24' ;Move 24 to WREG which is the number for a Logical 0 which is 600uS
CALL PulseIR
MOVLW d'24' ;Send FlatLine for 600uS
CALL FlatLine
RETLW 0x00
TXIR
MOVWF Data_Byte ;Collect Info from WREG and Place in Dat_Byte
MOVLW 0x07 ;Move 0x07 to Bit_Cnt which is the Command Bit Length
MOVWF Bit_Cnt
CALL Tx_Start ;Send Start Burst
Dev_Loop
RRCF Data_Byte ;Rotate Right f through Carry
BTFSC STATUS , C ;Check if the carry is a 0 if so skip...
call Tx_One ;If its a 1 then send a 1
BTFSS STATUS , C ;Check if the carry is a 1 if so skip...
call Tx_Zero ;If its a 0 then send a 0
DECFSZ Bit_Cnt , f ;Decrement f, Skip if 0
GOTO Dev_Loop
movlw D'16' ;Input your Device ID Here
movwf Dev_Byte ;Move the device ID to Dev_Byte
MOVLW 0x05 ;Set Bit_Cnt to 5 since thats the Device ID Length to send
MOVWF Bit_Cnt
Dev_Loop2
RRCF Dev_Byte , f
BTFSC STATUS , C
call Tx_One
BTFSS STATUS , C
call Tx_Zero
DECFSZ Bit_Cnt , f
GOTO Dev_Loop2
retlw 0x00
Delay255
movlw 0xff ;delay 255 mS
goto d0
Delay100
movlw d'100' ;delay 100mS
goto d0
Delay50
movlw d'50' ;delay 50mS
goto d0
Delay27
movlw d'27' ;delay 27mS
goto d0
Delay20
movlw d'20' ;delay 20mS
goto d0
Delay5
movlw 0x05 ;delay 5.000 ms (4 MHz clock)
d0 movwf count1
d1 movlw 0xC7
movwf counta
movlw 0x01
movwf countb
Delay_0
decfsz counta, f
goto $+2
decfsz countb, f
goto Delay_0
decfsz count1 ,f
goto d1
retlw 0x00
END