unsigned int getIR(void)
{
if (RA2 == 0) /// IR DETected on INT0
{
PerimeterDelay = 1200; // reset IR flag
if (IRmode > 0){rawLED(IRmode);} // display on RGB output without timer0 since we are already on interrupt routine
delayMS(200); // stall a little bit for now, function will soon get alot bigger
}
return 1; // default respnose for now
}
void PulseIR(unsigned char count)
{
unsigned char dummy;
INTCONbits.INTE = 0; // THIS LINE SHOULD SHUT INT0 OFF but it dont!
delayMS(count); // DELAY SO INT0 can shut off, finish up, and not catch any echos
PORTC |= 0b00100000; // turn on IR pulseRC5
//hardware is tied to 40khz multivibrator
// scope show IR to be turning on and off properly
// removing this line device works properly where leD turns green until
// (PerimeterDelay=0 then turns magenta, turns green again when
// triggered by external IR pulses (tv remote)
// LEAVING this line in causes the RC5 IR to trigger INT0, causing
// PerimeterDelay to reset and LED never turns magenta
// even though previous line clearly says INTE=0;
delayMS(count); // leave IR running for a bit
PORTC &= 0b11011111; // IR LED is shutting off properly
delayMS(count); // wait for IR echos and maybe circuit noise to disipate
dummy = PORTA; // just in case
INTCONbits.INTF = 0; /// clear flag
INTCONbits.INTE = 1; // reenable
}
void ModePerimeter(void)
{
if (PerimeterDelay == 0)
{
setColorB(8-color); // MAGENTA on timer0 routine
}
else if(PerimeterDelay == PerimeterAlert/2)
{
PulseIR(200); // problematic fucntion
PerimeterDelay--;
}
else
{
setColorB(color); //GREEN on timer0 routine
PerimeterDelay--;
}
}