Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!

Для передачи данных я за основу взял самый распространённый протокол пультов ДУ — RC-5, для которого у меня уже был код как для приёмника, так и для передатчика (командую телевизором/ресивером с компа), он передаёт по четыре байта данных.
// Макросы для включения/выключения светодиода
#define IR_ON set_bit(PORTD, 4)
#define IR_OFF unset_bit(PORTD, 4)
// Макрос для мигания светодиода с несущей частотой примерно в 36кГц
#define SEND_36KHz { IR_ON; _delay_us(14); IR_OFF; _delay_us(14); }
void send_rc5(uint32_t data)
{
int pos;
// Включение таймера для отсчёта времени. TCNT1 - регистр таймера.
set_bit(TCCR1B, CS12);
// Инициализация
TCNT1 = 0;
while (TCNT1 < 0x125)
SEND_36KHz;
TCNT1 = 0;
while (TCNT1 < 0x8D);
TCNT1 = 0;
while (TCNT1 < 0x15)
SEND_36KHz;
for (pos = 0; pos < 32; pos++) // Последовательно передаём 32 бита
{
TCNT1 = 0;
if (data & (1UL << pos))
{
while (TCNT1 < 0x33);
} else {
while (TCNT1 < 0x0F);
}
TCNT1 = 0;
while (TCNT1 < 0x15)
SEND_36KHz;
}
}
Счётчик оборотов мышиного колеса