Something like this is easier with PBP.
This is in an include file;
Code:
' IR carrier generator routines. Freq.inc.
Cycles VAR BYTE ' Number of carrier cycles
GOTO OverFreq ' jump over pulse routines
' Generate "Cycles" number of 40kHz pulses
ASM
_Pulse40
bcf IRTX,PIN ; 1uS, LED=on
goto $+1 ; + 2uS = 3uS
goto $+1 ; + 2uS = 5uS
goto $+1 ; + 2uS = 7uS
goto $+1 ; + 2uS = 9uS
goto $+1 ; + 2uS = 11uS
goto $+1 ; + 2uS = 13uS
bsf IRTX,PIN ; 1uS, LED=on
goto $+1 ; + 2uS = 3uS
goto $+1 ; + 2uS = 5uS
goto $+1 ; + 2uS = 7uS
goto $+1 ; + 2uS = 9uS
decfsz _Cycles,f ; + 1uS = 10S
goto _Pulse40 ; + 2uS = 12uS
return ; Return to caller
ENDASM
' Generate "Cycles" number of ~38.4kHz pulses
ASM
_Pulse38
bcf IRTX,PIN ; 1uS, LED=on
goto $+1 ; + 2uS = 3uS
goto $+1 ; + 2uS = 5uS
goto $+1 ; + 2uS = 7uS
goto $+1 ; + 2uS = 9uS
goto $+1 ; + 2uS = 11uS
goto $+1 ; + 2uS = 13uS
bsf IRTX,PIN ; 1uS, LED=on
goto $+1 ; + 2uS = 3uS
goto $+1 ; + 2uS = 5uS
goto $+1 ; + 2uS = 7uS
goto $+1 ; + 2uS = 9uS
nop ; + 1uS = 10uS
decfsz _Cycles,f ; + 1uS = 11S
goto _Pulse38 ; + 2uS = 13uS
return ; Return to caller
ENDASM
OverFreq:
Create one for whatever IR carrier freq you need, and just call them like this with PBP;
Code:
@ #define IRTX GPIO ; Define port to use for IR out
@ #define PIN 2 ; Define port pin to use for IR out
INCLUDE "Freq.inc" '
GPIO.2 = 1 ' IR LED off -----|<|----/\/\/\----+5
TRISIO.2 = 0 ' Output for IR signal
CMCON = 7 ' Comparators disabled
ANSEL = 0 ' A/D disabled
Main:
Cycles = 60 ' min 1, max 255
CALL Pulse38
GOTO Main
END
At 4MHz you won't be spot-on for every carrier frequency, but it will be close enough to work with pretty much any off-the-shelf IR receiver.
Bookmarks