
...неделю бьюсь с проблемой.
дано:
1) контроллер который на выходе выдает стабилизированный(задается кнопками) ток и напряжение, с БП от 220в на uc38XX в высоковльтной части, и во вторичке - атмега8 , которая управляет всем - БП управляется через оптопару, чем сильнее светит светодиод в оптопаре - тем меньше напряжения выдает БП.
2) атмега8 контролирует выходной ток и напряжение контроллера, смотрит есть-ли нагрузка, если ее нет то отключает выход контроллера но внутри контроллера сама питается от БП так что должна на нем поддерживать некий коридор напряжения ХХ.
атмега8 стабилизирует ток-напряжение через выдачу из себя с порта ШИМ - через RC цепочку - постоянка на оптопару в обратную связь в БП.
3) прошлая прога контроллера была на асме - но код утерян и человека нет кто проектировал... я пишу на С в CVAVR - мне так привычней, да и прога там не сложная.
4) советы вида "переделать плату" или сменить контроллер - не принимаются.
5) для управления контроллером принял решение распараллелить три процесса по трем таймерам :
- таймер0 : прерывается по переполнению примерно 5000 раз в сек., проверяет ток и напряжение с АЦП, делает простые операции с ними и выдает результат в OCR2 таймера2.
- таймер1 : 16 бит - он отрабатывает цикл в 0.5сек - внутри его прерывания по переполнению программа с выдачей на ЖКИ 2х8 данных, + простейший логический аппарат управления, читающий два АЦП по опросу. АЦП сконфигурированы не работать по прерыванию - только по команде read_adc(n); Проверил - 0.5 сек хватает с головой на всё что я внутри прерывания по переполнению таймера1 делаю. Тактовая атмеги8 - 16мегагерц, должно с головой хватить.
- таймер2 : 8 бит, использую как ШИМ но без вывода на его ногу - т.е. по прерыванию по переполнению пишу в нем всего одну команду - PORTB.0=1; и выход. По прерыванию по сравнению - OCR2 - в нем пишу PORTB.0=0; и выхожу.
Все бы ничего, но с таймерами я работаю впервые - накурился уже учебников и примеров - все примеры поотдельности у меня работают, но как только я собрал всю программу вместе - получил большой глюк - с которым не могу справиться...
По отдельности - все работает.
как только все три таймера запускаю - получаю хаос

проблема еще в том, что БП стартует не моментально - т.е. есть пара сек после включения в 220В за которые стартанет uc38xx и потом атмега8 должна подхватить управление БП.
В общем - что я не делал, какие режимы не применял - все вместе не работает...
Прогу не могу привести - извините.
Буду благодарен за кусочек очень простого кода где все три таймера работают так как мне надо - я уже поломал всю голову и переписывал прогу раз 20...
по осциллографу получается совсем не то что рисуют в учебниках на красивых картинок на ноге атмеги8 ...
игрался запретом прерываний, игрался разнесением счетчиков таймеров чтобы не в один момент все три переполнялись - все бестолку...
Памагите !!!

контроллер рабочий - аппаратную часть всю проверил - прошивка прошлой прогой - полет нормальный, ШИМит и бардака нет с сигналами на выходе.
и в конце дебильный вопрос который возник при чтении кучи примеров программ разных авторов:
- в самом прерывании по переполнении - например таймера0 - надо-ли в первой строке писать TCCNT0=число ? Я так понял что если общий коэфф. пересчета мне не нужно менять - то достаточно в начале main процедуры проинитить все три таймера, и больше их не трогать - т.е. для шима я просто в регистр OCR2 ложу нужное число и получаю изменение скважности - и в прерывании по сравнению - просто меняю ногу порта с 1 на 0. Или надо каждый раз при входе в прогу по прерыв.по переполнению опять устанавливать "до куда считаем"?
P.S. опыт в программировании на С у меня достаточный - мне бы понять почему примеры в отдельности работают а все вместе - один большой глюк...
в инете все любят таймер1 использовать а варианта с тремя таймерами одновременно я не нашел ни одного...