PD4 - это выход OC1B? это для какого МК?
Нет - к таймеру это отношения не имеет, это обычный пин для 2 канала осцилографа, чтобы "отловить" старт таймера (по спадающему фронту).
как я понял, в режимах 7 и 14 работа неправильная. по картинкам из той темы там имеется пропуск до первого импульса примерно а один период таймера.
а в режиме 15 первый импульс появляется сразу после старта.
Я не могу сказать, что это неправильно, это и есть особенность, с которой я и пытаюсь разобраться. Да, во всех fastPWM режимах, кроме того, что использует OCRxA в качестве TOP, первый импульс на выходе появляется только через "пустой" период, в этот период прерывания COMP нет, потом идут заданные мной 5 импульсов. А вот когда режим 15 - да - сразу при старте таймера высокий уровень, и имульсов снова точно 5.
так у тебя в тексте стоит еще задержка на 20 мс
_delay_ms(20);
и только потом ты разрешаешь работу порта PD4 на выход
PIND |= (1 << PD4);
и запускаешь таймер
TCCR1B |= (1 << CS11) | (1 << CS10); // 64
поэтому у тебя первый импульс появляется через 20 мс.
См. выше, это просто триггер для осциллографа, к сути отношения не имеет.
или ты считаешь, что режим 15 работает неправильно, так как эта задержка на 20 мс не отрабатывается?
Ну про 20мс уже выше описал. Я не говорю, что неправильно, он работает отлично от других. В том, что сразу при старте таймера выставляет на порту 1, считает это первым импульсом, а остальные режимы "ждут" один "пустой" период. Да, на картинках не видно всей цепочки, но во всех режимах нужные 5 импульсов есть, т.е. прерывания отрабатываются корректно во всех режимах. Я пробовал "заставить" другие режимы вести себя аналогично игрой с регистром счетчика, но это приводило только к некорректному количеству импульсов, один точно съедался. В итоге можно, как в блоге, просто принять эту данность и помнить о ней. Но, конечно, интересно, почему об этом нет упоминаний ни в даташите, ни в еррате, ни в апноутах.