При установке нового значения периода, не учитывается текущее значение TCNTx. Таким образом в момент смены периода возможно получить импульс произвольной длительности. Критично например при управлении ШД - при разгоне будет срыв шагов.
Фикс предлагается например такой:
while(TCNT5 > (_timer5_top / 2));
ICR5 = _timer5_top - 1;
возможно есть решение получше
UPD: возможно проблема не в этом, а в не атомарном апдейте ICR регистра, надо покурить даташит.
UPD2: Accessing 16-bit Registers: для записи 16 битных регистров используется временный регистр, который шарится между всеми таймерами, поэтому настоятельно рекомендуется запрещать прерывания на момент апдйта ICRx
При установке нового значения периода, не учитывается текущее значение TCNTx. Таким образом в момент смены периода возможно получить импульс произвольной длительности. Критично например при управлении ШД - при разгоне будет срыв шагов.
Фикс предлагается например такой:
while(TCNT5 > (_timer5_top / 2));
ICR5 = _timer5_top - 1;
возможно есть решение получше
UPD: возможно проблема не в этом, а в не атомарном апдейте ICR регистра, надо покурить даташит.
UPD2: Accessing 16-bit Registers: для записи 16 битных регистров используется временный регистр, который шарится между всеми таймерами, поэтому настоятельно рекомендуется запрещать прерывания на момент апдйта ICRx