If you use Timer2 for your clock it leaves Timer1 free to be used with hardware capture. Then you can use capture to read your IR signal.
Here's an example tested with the SLED-C4. It only needs to test for the TMR2IF flag to keep time, so no interrupts are used. And you have quite a few instruction cycles to do other things between clock updates.
It's pretty decent at keeping time. Ran for 3 hours, and it was spot-on with my PC clock to the second.Code:@ DEVICE LVP_OFF,WDT_OFF,MCLR_OFF,XT_OSC DEFINE OSC 4 DEFINE DEBUG_REG PORTB DEFINE DEBUG_BIT 0 DEFINE DEBUG_BAUD 19200 DEFINE DEBUG_MODE 0 ' SLED-C4 serial mode = true ' setup vars for clock Time VAR WORD ' accumulates TMR2 to PR2 match counts Minutes VAR BYTE ' minutes Hours VAR BYTE ' hours Match VAR PIR1.1 ' TMR2 to PR2 match interrupt flag bit PORTB.0=1 ' make sure SLED-C4 data input pin idles high TRISB = %00001000 ' RB3 = CCP1 capture input, rest outputs CMCON = 7 ' disable comparators INTCON = 0 ' not using interupts. Just monitoring int flag bits PAUSE 250 ' let SLED-C4 power-up Time = 0 ' clear TMR2 to PR2 match counter Hours = 10 ' set clock starting hour here Minutes = 03 ' set clock starting minutes here ' set SLED-C4 start time DEBUG "D", Hours DIG 1,Hours DIG 0,Minutes DIG 1,Minutes DIG 0 ' TMR2 increments from 0 until it matches the PR2 register value ' and then resets to 0 (on the next increment cycle) so place a ' value in PR2 1 cycle short of what you want. Here we want 250 for ' 60mS, so we write 249 to PR2. PR2 = 249 ' 249 +1 extra cycle for reset = 250*16*15*1uS=60mS Match = 0 ' clear match flag ' setup & start TMR2 T2CON = %01110110 ' 1:16 prescale, 1:15 postscale, TMR2 on Main: ' every 60mS the TMR2IF flag is set, and this routine is entered. ' Plenty of time to do other stuff. IF Match THEN ' has TMR2 matched PR2? (should happen every 60mS) Match = 0 ' yes. clear TMR2 to PR2 match flag bit Time = Time + 1 ' increment 60mS count IF Time = 1000 THEN ' has 60 seconds (1000*60mS) passed? Time = 0 ' yes. clear count Minutes = Minutes + 1 ' increment minute count IF Minutes = 60 THEN ' have 60 minutes passed? Minutes = 0 ' yes. roll-over minutes from 59 to 00 Hours = Hours + 1 ' update hour every 60 minutes IF Hours = 24 THEN Hours = 0 ' roll-over hours from 24 to 00 ENDIF ' print new time only once every minute DEBUG "D", Hours DIG 1,Hours DIG 0,Minutes DIG 1,Minutes DIG 0 ENDIF ENDIF GOTO Main END


However, things are working well now, and I can read my IR signal as I want by putting the clock routine as my interrupt and the IR PULSIN command as my main (as Darrel suggested). At this point is it just some coding to recognize alarms and different programmable options that I will throw in. 

Bookmarks