Cześć

Zbudowałem układy na dwóch Uno, z czego pierwszy jest pilotem, a drugi odbiornikiem. Wykorzystuję jakąś diodę IR 940 i TSOP2236.
Wykorzystałem bibliotekę IRRemote, która jest całkiem popularna, ale chciałem nauczyć się kodowania RC-5 i napisać samemu prostą
bibiliotekę. I tak zrobiłem. Przeanalizowałem później bibliotekę i zrozumiałem wszystko prócz ustawień dotyczących Timer2.
Mam w swojej bibliotece coś takiego dla nadajnika:
Kod:
// Initialize Timer2
TCCR2A = 0;
TCCR2B = 0;
// Set mode 5, PWM phase correct mode, counts up and down
bitSet(TCCR2A, WGM20);
bitSet(TCCR2B, WGM22);
// Set up 1 prescale
bitSet(TCCR2B, CS20);
// Set frequency 36kHz
OCR2A = 222;
OCR2B = 74;
TCCR2A i TCCR2B to timer counter control register A i B, zawierają ustawienia dla timera.
Ustawiam więc wszystko na zero, a później ustawiam tryb PWM Phase Correct.
Następnie ustawiam preskaler na 1 i OCR2A na 222, co daje mi:
16MHz / 1 / 222 / 2 (PWM Phase Correct) = 36 036, czyli 36kHz
Nie rozumiem do czego służy OCR2B, ale bez tej wartości 74 to mi w ogóle nie działa.
Nadajnik IR podłączony do pinu 3.
Tak wygląda kod konfiguracji Timer2 na układzie odbierającym:
Kod:
// #defines
// MICROSECONDS_PER_TICK 50
// TIMER_CLOCK_CYCLES_LIMIT 16000000 * MICROSECONDS_PER_TICK / 1000000 // to wynosi 800
TCCR2A = _BV(WGM21);
TCCR2B = _BV(CS21);
OCR2A = TIMER_CLOCK_CYCLES_LIMIT / 8; // to wynosi 100
TCNT2 = 0;
Czy możecie podpowiedzieć coś odnośnie tego OCR2B i dlaczego to musi być ustawione na 74?
Z góry dzięki.
Zanim stworzyłem wątek przeczytałem również poniższe linki i wiele więcej, ale nadal nie rozumiem wszystkiego:
https://arduino-info.wikispaces.com/Timers-Arduinohttps://maxembedded.wordpress.com/2011/06/28/avr-timers-timer1/https://withinspecifications.30ohm.com/2014/02/20/Fast-PWM-on-AtMega328/https://sites.google.com/site/qeewiki/books/avr-guide/pwm-on-the-atmega328http://maxembedded.com/2011/08/avr-timers-pwm-mode-part-i/http://forum.arduino.cc/index.php?topic=379240.0http://www.avrfreaks.net/forum/timer2-phase-correct-pwm-mode-atmega168