Something like this is easier with PBP.
This is in an include file;
Create one for whatever IR carrier freq you need, and just call them like this with PBP;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:
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.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




Bookmarks