MCPcopy Create free account
hub / github.com/IRMP-org/IRMP / initIRTimerForSend

Function initIRTimerForSend

src/IRTimer.hpp:106–350  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

104void initIRTimerForReceive(void)
105#elif defined(_IRSND_H_)
106void 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;

Callers 1

irsnd_send_dataFunction · 0.85

Calls 1

enableIRTimerInterruptFunction · 0.85

Tested by

no test coverage detected