Шершень:
Что-то я не понял: инициализируете переменную нулём и при первом же входе в прерывание сразу отнимаете единицу?
конечно же нет. вычисление переменной происходит внутри функции main, далее настраивается прерывание и потом оно запускается. кот выше - это далеко не полный, а упрощенный по максимуму, чтобы найти проблему. полный кот совсем другой.
а задумано так, чтобы в рамках одного прерывания организовать целых три ШИМ сигнала. один ШИМ - постоянный и имеет строго фиксированную частоту в 8 кгц. два других ШИМ зависят от внешних переметров. один из них может варьироваться от 0 до 500 гц, а следующий - является частью предыдущего. то есть ШИМ 0-500 гц модулируется еще одним ШИМ. то есть, я получаю пучки от 0 до 500 гц, а внутри этих пучков есть еще пучки, которые не фиксированные, а их форма зависит от внешней переменной.
это возможно сделать в рамках одного прерывания, так как самый первый ШИМ работает на частоте, намного более выше, чем все остальные. поэтому, все, что мне нужно - это правильно вычислить счетчики в основной функции, правильно их обрабатывать внутри прерывания, и при достижении нужного мне условия устанавливать или сбрасывать соответствующий пин.
так как счетчики интовые, то тут я и столкнулся с проблемой IF, который не работают с int, но только с char. для меня эта проблема оказалась настолько неочевидной и неожиданной, что я на поиск ее потратил двое выходных. возможно, она решается и без разложения int на 4 char, например, присваиванием префикса к константе
if (my_int_volatile_variable == 0L) {}
но я это еще не проверял. все таки часов в сутках не хватает.