| 104 | void initIRTimerForReceive(void) |
| 105 | #elif defined(_IRSND_H_) |
| 106 | void initIRTimerForSend(void) |
| 107 | #endif |
| 108 | |
| 109 | { |
| 110 | #if defined(__AVR__) |
| 111 | // Use Timer 2 |
| 112 | # if defined(__AVR_ATmega16__) |
| 113 | TCCR2 = _BV(WGM21) | _BV(CS21); // CTC mode, prescale by 8 |
| 114 | OCR2 = (((F_CPU / 8) + (IR_INTERRUPT_FREQUENCY / 2)) / IR_INTERRUPT_FREQUENCY) - 1; // 132 for 15 kHz @16 MHz, 52 for 38 kHz @16 MHz |
| 115 | TCNT2 = 0; |
| 116 | TIMSK = _BV(OCIE2); // enable interrupt |
| 117 | |
| 118 | # elif defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) |
| 119 | // Since the ISR takes 5 to 22 microseconds for ATtiny@16MHz only 16 and 8 MHz makes sense |
| 120 | # if defined(ARDUINO_AVR_DIGISPARK) |
| 121 | // standard Digispark settings use timer 1 for millis() and micros() |
| 122 | // Timer 0 has only 1 and 8 as useful prescaler |
| 123 | TCCR0A = 0; // must be set to zero before configuration! |
| 124 | # if (F_CPU / IR_INTERRUPT_FREQUENCY) > 256 // for 8 bit timer |
| 125 | OCR0A = OCR0B = (((F_CPU / 8) + (IR_INTERRUPT_FREQUENCY / 2)) / IR_INTERRUPT_FREQUENCY) - 1; // 132 for 15 kHz @16 MHz, 52 for 38 kHz @16 MHz |
| 126 | TCCR0B = _BV(CS01); // presc = 8 |
| 127 | # else |
| 128 | OCR0A = OCR0B = (F_CPU / IR_INTERRUPT_FREQUENCY) - 1; // compare value: 209 for 76 kHz, 221 for 72kHz @16MHz |
| 129 | TCCR0B = _BV(CS00); // presc = 1 / no prescaling |
| 130 | # endif |
| 131 | TCCR0A = _BV(WGM01); // CTC with OCRA as top |
| 132 | TCNT0 = 0; |
| 133 | TIMSK |= _BV(OCIE0B); // enable compare match interrupt |
| 134 | |
| 135 | # else |
| 136 | // Use timer 1 |
| 137 | # if (F_CPU / IR_INTERRUPT_FREQUENCY) > 256 // for 8 bit timer |
| 138 | OCR1B = OCR1C = (((F_CPU / 8) + (IR_INTERRUPT_FREQUENCY / 2)) / IR_INTERRUPT_FREQUENCY) - 1; // 132 for 15 kHz @16 MHz, 52 for 38 kHz @16 MHz |
| 139 | TCCR1 = _BV(CTC1) | _BV(CS12); // switch CTC Mode on, set prescaler to 8 |
| 140 | # else |
| 141 | OCR1B = OCR1C = (F_CPU / IR_INTERRUPT_FREQUENCY) - 1; // compare value: 209 for 76 kHz, 221 for 72kHz @16MHz |
| 142 | TCCR1 = _BV(CTC1) | _BV(CS10); // switch CTC Mode on, set prescaler to 1 / no prescaling |
| 143 | # endif |
| 144 | TCNT1 = 0; |
| 145 | TIMSK |= _BV(OCIE1B); // enable compare match interrupt |
| 146 | # endif |
| 147 | |
| 148 | # elif defined(__AVR_ATtiny87__) || defined(__AVR_ATtiny167__) |
| 149 | // Timer 1 is a 16 bit counter so we need no prescaler |
| 150 | ICR1 = (F_CPU / IR_INTERRUPT_FREQUENCY) - 1; // 1065 for 15 kHz @16 MHz. compare value: 1/15000 of CPU frequency |
| 151 | TCCR1B = _BV(WGM12) | _BV(WGM13) | _BV(CS10); // switch CTC Mode on, set prescaler to 1 / no prescaling |
| 152 | TCNT1 = 0; |
| 153 | TIMSK1 = _BV(OCIE1B); // enable compare match B interrupt, compare match A is used by tone library |
| 154 | |
| 155 | # elif defined(__AVR_ATmega4809__) // Uno WiFi Rev 2, Nano Every |
| 156 | // TCB1 is used by Tone() |
| 157 | // TCB2 is used by Servo |
| 158 | // TCB3 is used by millis() |
| 159 | TCB0.CTRLB = TCB_CNTMODE_INT_gc; |
| 160 | TCB0.CCMP = (F_CPU / IR_INTERRUPT_FREQUENCY) - 1; // compare value: 209 for 76 kHz, 221 for 72kHz @16MHz |
| 161 | TCB0.INTFLAGS = TCB_CAPT_bm; // reset interrupt flags |
| 162 | TCB0.INTCTRL = TCB_CAPT_bm; // enable capture compare interrupt |
| 163 | TCB0.CTRLA = TCB_CLKSEL_CLKDIV1_gc | TCB_ENABLE_bm; |
no test coverage detected