вопрос пиководам - эт шо, в пиках таймеры такие уёбищные, что
мелкочип в новых мегах их засунул (timer type B). Недавно
разбирался с ними, охренел от убогости, а именно в меге 4809 один таймер типа "А" - навороченный, с кучей режимов и прерываний, зато крайне неудобный к использованию, но похоже на нём можно многое сварганить (вопрос - как сдюжить изучить) и ажно четыре 16-битных таймера типа "B", вот энто уёбище, я вам доложу.
Крайне ограниченны выбор тактирования, но можно настроиться на тактирование с предделителя таймера "А" (там предделитель нормальный), но понятно, если использовать остальные три таймера "B", то придётся либо тактироваться от того же предделителя "А", либо пользоваться кастрированной системой тактирования "B" (всего два варианта - системный клок, и он же /2 - никаких индивидуальных предделителей!! и даже внешнего такта). Одно (!) прерывание по переполнению и всё, правда есть завязка на систему событий, но она (система событий) изначально заточена под взаимодействие периферии промеж собой, мимо ядра MCU. В итоге можно подрыгать ногами по сравнению, запустить АЦП, что-то ещё поделать с периферией, но блять какому умнику взбрело в голову оставить одно (!) прерывание по переполнению. В итоге пользоваться компрэйр-режимом сплошное мученье (приходится просто заниматься предустановкой таймера в нужную позу и по прерыванию переполнения отрабатывать уже, если нужно формирование разных временных интервалов ) Компэйр-регистр один !! и как я сказал прерывания по нему нет. Есть восьмибитный ШИМ режим, и как указано в ём два компэйр регистра, могущих работать самостоятельно. Тут-то я обрадовался (мне как раз пары 8-битных хватило бы для двухканального ШИМа), но Щаз! оказывается младшим можно задать период ШИМа, а старшим формировать ширину импульса, но опять же - через систему событий (то бишь, к примеру на аппаратной ноге) Пиздец какой-то. Гораздо логичнее было бы разделить таймер пополам на два восьмибитных - со своими регистрами сравнения (а уж периорд ШИМа можно было бы выставить предделителем, там точности особой не надо, порядок чаще всего важен - с шагом в киллогерцы. Но сэкономленные прерывания (одно - на переполнение, как я сказал) в принципе не позволяют так сделать. Причём ещё в 8-битном "разделённом" режиме нельзя установить младшие регистры разделённой 16-битной пары. Нужно оязательно что-то записать и в старший, иначе значение в младшем не обновится. (если уж делили на два 8-битных, - логично было бы и сделать возможность работы со всеми 8-битными регистрами одной операцией, ва не обновлять полностью 16-битную пару ради записи младший байт)
В общем трындец какойты.... Насколько удобны были 16-битные таймеры в АВР с двумя каналами сравнения и в каждом своё прерывание, да ещё и прерывание по переполнению. Про продвинутые таймеры иксмеги (аж с 4-мя компэйр-каналами) даж не упоминаем. А вот в новой линейке AVR0 (mega4809) таймеры просто убили. Нахера так делать было - совершенно неясно (ну разве что мож для устранения внутренней конкуренции с пиками??) или в пиках такие же уёбищные таймеры и просто их затащили в новую линейку АВР на замену приличным атмеловским??
эх грусть-печалька :( Не, конечно вывернуться можно, но пипец как неудобно после даже простых 16-битных таймеров АВР-классики, но со своим прерыванием на каждую сравнилку и переполнение.