Дык 257 положений никто и не просил. 257 получается именно из-за косяка, что 0 это 1 у Атмел. Если бы 0 был 0, то было бы 256 и все так чинно, благородно.
Короче, получается так: в МК значению 0 в ШИМ регистре соответствует 1-й коэффициент заполнения на выходе. Т.о. мы получаем 256 уровней через 8 битный регистр с коэффициентами 1/256 — 100%. Что бы получить на выходе 0, нужно отключить ШИМ, т.е. это ещё один уровень, что дает в сумме 257. В итоге мы действительно получаем 257 уровней на выходе — 256 через регистр (1-257 на выходе) и PWM_OFF (0 на выходе).
Таким образом, проблема не в том, что
что 8-битный шим имеет 257 «положений»
и не в количестве «ступенек», а в том, что получаемое значения ШИМ сдвинуто на 1 относительно задаваемого через регистр. И поэтому 0 значение приходится получать дополнительным образом.
Опять же ошибка: не 0/256,256/256 — а 0/255,255/255. Максимальное значение 8-ми битного регистра и переменной — 255 (что в сумме с 0 дает 256 вариантов). Возможных заполнений вообще в принципе — бесконечное множество, но заполнений которые может сгенерировать конкретный МК, в конкретном случае — именно столько, сколько значений в регистре — и не больше.
Не понимаю вас. Откуда вы взяли какие-то промежуточные значения? Откуда они берутся? Да и это ничего не меняет — все равно каждому значению регистра должно соответствовать какое-то значение ШИМа. И если бы значений ШИМа было больше, то это значило бы, что они берутся из ниоткуда.
Ну вот давайте просто подумаем логически: значений счетчика у нас 256 (с этим вы вроде согласны). Значений коэффициента, как вы говорите 257, т.е. на 1 больше. Тогда одному из значений счетчика, должно соответствовать 2 значения коэффициента. Вопрос: какому значению счетчика? И какие это коэффициенты?
Переменная 8 бит, так же как и регистр и значений у неё ровно столько же. А причину проблемы я описал в статье — при старте таймера с 0 выход выставляется в 1, по-моему это даже в даташите написано.
255/256 или 256/256 — в большинстве случаев один фиг...
Что-то рассинхрон пошёл, если охота продолжать, то давайте вернемся к фразе
проблема тут в том, что 8-битный шим имеет 257 «положений»
— что имелось ввиду, какое 257-е положение?
Значение OCR запоминается в BOTTOM и используется в течении цикла
значение то может и запоминается, я говорю о моменте, когда выполняется сравнение этого значения — по-видимому это происходит в момент когда режим меняется. Как бы то ни было, эффект был, и исправить его удалось с помощью указанного кода.
Таким образом, проблема не в том, что и не в количестве «ступенек», а в том, что получаемое значения ШИМ сдвинуто на 1 относительно задаваемого через регистр. И поэтому 0 значение приходится получать дополнительным образом.
Вообщем, пусть нас рассудят более опытные и авторитетные товарищи.
У меня значение ШИМ хранится в переменной unsigned char, которая тоже может имеет 256 значений. Т.е. все соответствует полностью.
значение то может и запоминается, я говорю о моменте, когда выполняется сравнение этого значения — по-видимому это происходит в момент когда режим меняется. Как бы то ни было, эффект был, и исправить его удалось с помощью указанного кода.
как ни кинь — всюду клин
буферизация наверное только для таймера, выход выставляется, следующее сравнение нас ждет в BOTTOM
эээ… ну это как бы так короче, хотя так понятней. А кстати, любопытно, код генерится одинаковый? Или второй вариант преобразуется буквально