Цитата(repairDV @ Dec 23 2007, 16:46)

У бочки мёда обнаружилась ложка дёгтя. Я, правда, пока использую проц из этой серии ещё с буквами "XC" на корпусе, т.е., это ещё опытный образец. Хорошо было бы, если бы в более поздних номерах этой серии этот глюк был устранён. А именно: временами(не постоянно) при изменении частоты с более высокой на более низкую таймер на 1-2 сек "зависает", потом опять включается. А это - глюк серьёзный.
Просто интересно: есть ли у других фирм микроконтроллеры с такими свойствами таймеров?
Это не глюк. Скорее всего вы просто недопонимаете работу таймера в режиме compare.
Изменение периода нужно делать
синхронно с перезагрузкой счетчика таймера. Вот для этого-то как раз удобнее использовать прерывание.
Пояснение. С терминологией и обозначениями CF я не знаком, поэтому поясню так как смогу. Пускай у нас есть 3 регистра "счетчик", "период", "совпадение". Регистр "счетчик" увеличивает свое значение от нуля на каждый такт таймера. Регистр "период" хранит значение при совпадении с которым значения "счетчик" регистр "счетчик" перезагружается (сбрасывается в нуль). В регистре "совпадение" лежит значение при совпадении с которым значения "счетчик" происходит какое-либо изменение состояния выходного пина (установка или сброс или инверсия состояния). Для простоты пускай разрядность таймера 4 бит. Т.е. "счетчик" может считать от 0 до 15. Если "период" = 7, а "совпадение" = 3, то выходной пин будет изменять свое состояние на каждый 4й такт от нуля с периодом 8 тактов. "Счетчик" будет изменять свое значение так 0-1-2-3-4-5-6-7-0-1-2-3-4-5-6-7-0-1..... Если вы захотите
уменьшить период, то нужно загружать новое значение "период" только когда "счетчик" равен 0. Тогда последовательность счета не собьется. В противном случае вы можете получить неправильную последовательность. Пусть новое значение "период" = 2.
Так
правильно.Код
0-1-2-3-4-5-6-7-0-1-2-0-1-2-0-1-2-...
^
|
здесь меняем значение "период" на 2, синхронно с перезагрузкой "счетчик"
А так
неправильно.Код
0-1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-0-1-2-0-1-2-0-1-2-...
^ ^ ^
| |---лишние такты----|
|
здесь меняем значение "период" в произвольный момент, когда новое значение, меньше старого (2<7)
Если вы не синхронизируете запись нового значения "периода" с перезагрузкой "счетчика" таймера, а записываете его когда вздумается, то вы получаете не "зависание", а простой счет таймера до его естественного переполнения (65535 в случае 16-битного таймера).
Надеюсь понятно пояснил?