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];
59 void configTimer2(
void) {
60 T2CON = T2_OFF | T2_IDLE_CON | T2_GATE_OFF
70 #define TWOTHIRDS_PERIOD_US 1100 //two thirds expected bit period, in microseconds
71 #define COMMAND_LENGTH 13 //number of bits expected in IR command
72 #define IR_INPUT _RB7 //using RB9 for IR input
74 volatile uint16_t u16_lastCapture, u16_thisCapture,u16_delta, u16_twoThirdsPeriodTicks;
75 volatile uint8_t u8_bitCount,u8_bitCountTotal,u8_currentByte;
77 typedef struct tagFLAGBITS {
83 volatile FLAGBITS flags;
86 STATE_START_PULSE_FALL = 0,
87 STATE_START_PULSE_RISE,
94 void _ISRFAST _IC1Interrupt() {
96 u16_thisCapture = IC1BUF ;
98 u16_lastCapture = u16_thisCapture;
99 switch (e_isrICState) {
100 case STATE_START_PULSE_FALL:
101 e_isrICState = STATE_START_PULSE_RISE;
103 case STATE_START_PULSE_RISE:
104 if (u16_delta > u16_twoThirdsPeriodTicks) {
106 e_isrICState = STATE_START_PULSE_FALL;
109 flags.u1_bitEdge = 1;
112 flags.u1_bitValue = 1;
113 u8_bitCountTotal = 0;
114 e_isrICState = STATE_BIT_CAPTURE;
117 case STATE_BIT_CAPTURE:
118 if ((u16_delta > u16_twoThirdsPeriodTicks) || flags.u1_bitEdge) {
120 if ((u16_delta > u16_twoThirdsPeriodTicks)) {
122 flags.u1_bitValue = !flags.u1_bitValue;
124 if (u8_bitCount != 0)u8_currentByte = u8_currentByte << 1;;
125 if (flags.u1_bitValue) u8_currentByte = u8_currentByte | 0x01;
128 flags.u1_bitEdge = 1;
129 if (u8_bitCount == 7) {
130 irFifoWrite(u8_currentByte);
135 flags.u1_bitEdge = !flags.u1_bitEdge;
136 if (u8_bitCountTotal == COMMAND_LENGTH) {
137 if (u8_bitCount != 0) irFifoWrite(u8_currentByte);
138 if (IR_INPUT) e_isrICState = STATE_START_PULSE_FALL;
139 else e_isrICState = STATE_LAST_EDGE;
142 case STATE_LAST_EDGE:
143 e_isrICState = STATE_START_PULSE_FALL;
147 e_isrICState = STATE_START_PULSE_FALL;
153 void configInputCapture1(
void) {
154 CONFIG_RB7_AS_DIG_INPUT();
155 #if (defined(__dsPIC33E__) || defined(__PIC24E__))
160 e_isrICState = STATE_START_PULSE_FALL;
164 #if (defined(__dsPIC33E__) || defined(__PIC24E__))
165 IC1CON1 = IC_TIMER2_SRC |
170 IC1CON = IC_TIMER2_SRC |
183 configInputCapture1();
188 if (u8_x & 0x20)
outString(
"Toggle = 1, ");