37 #define IR_FIFO_SIZE 32
38 volatile uint8_t au8_irFIFO[32];
39 volatile uint16_t u16_irFifoHead = 0;
40 volatile uint16_t u16_irFifoTail = 0;
42 void irFifoWrite(
uint8_t u8_x) {
44 if (u16_irFifoHead == IR_FIFO_SIZE) u16_irFifoHead = 0;
45 au8_irFIFO[u16_irFifoHead] = u8_x;
48 while (u16_irFifoHead == u16_irFifoTail) {
52 if (u16_irFifoTail == IR_FIFO_SIZE) u16_irFifoTail = 0;
53 return au8_irFIFO[u16_irFifoTail];
57 return(u16_irFifoHead != u16_irFifoTail);
62 #define PWM_PERIOD 20000 //in microseconds
68 void configTimer2(
void) {
69 T2CON = T2_OFF | T2_IDLE_CON | T2_GATE_OFF
79 #define TWOTHIRDS_PERIOD_US 1100 //two thirds expected bit period, in microseconds
80 #define COMMAND_LENGTH 13 //number of bits expected in IR command
81 #define IR_INPUT _RB7 //using RB9 for IR input
83 volatile uint16_t u16_lastCapture, u16_thisCapture,u16_delta, u16_twoThirdsPeriodTicks;
84 volatile uint8_t u8_bitCount,u8_bitCountTotal,u8_currentByte;
86 typedef struct tagFLAGBITS {
92 static volatile FLAGBITS flags;
95 STATE_START_PULSE_FALL = 0,
96 STATE_START_PULSE_RISE,
101 ICSTATE e_isrICState;
103 void _ISRFAST _IC1Interrupt() {
105 u16_thisCapture = IC1BUF ;
107 u16_lastCapture = u16_thisCapture;
108 switch (e_isrICState) {
109 case STATE_START_PULSE_FALL:
110 e_isrICState = STATE_START_PULSE_RISE;
112 case STATE_START_PULSE_RISE:
113 if (u16_delta > u16_twoThirdsPeriodTicks) {
115 e_isrICState = STATE_START_PULSE_FALL;
118 flags.u1_bitEdge = 1;
121 flags.u1_bitValue = 1;
122 u8_bitCountTotal = 0;
123 e_isrICState = STATE_BIT_CAPTURE;
126 case STATE_BIT_CAPTURE:
127 if ((u16_delta > u16_twoThirdsPeriodTicks) || flags.u1_bitEdge) {
129 if ((u16_delta > u16_twoThirdsPeriodTicks)) {
131 flags.u1_bitValue = !flags.u1_bitValue;
133 if (u8_bitCount != 0)u8_currentByte = u8_currentByte << 1;;
134 if (flags.u1_bitValue) u8_currentByte = u8_currentByte | 0x01;
137 flags.u1_bitEdge = 1;
138 if (u8_bitCount == 7) {
139 irFifoWrite(u8_currentByte);
144 flags.u1_bitEdge = !flags.u1_bitEdge;
145 if (u8_bitCountTotal == COMMAND_LENGTH) {
146 if (u8_bitCount != 0) irFifoWrite(u8_currentByte);
147 if (IR_INPUT) e_isrICState = STATE_START_PULSE_FALL;
148 else e_isrICState = STATE_LAST_EDGE;
151 case STATE_LAST_EDGE:
152 e_isrICState = STATE_START_PULSE_FALL;
156 e_isrICState = STATE_START_PULSE_FALL;
162 void configInputCapture1(
void) {
163 CONFIG_RB7_AS_DIG_INPUT();
165 e_isrICState = STATE_START_PULSE_FALL;
169 IC1CON = IC_TIMER2_SRC |