idmg, Вы должны понять разницу между очень быстро, быстро и медленно. То, что делает процессор- это очень быстро, прерывания происходят быстро, человек общается с контроллером медленно. То, что Вы пишете, противоречит самой структуре программ для МК. Смысл использования switch'a объясните? Что контроллер должен каждый раз подвисать и не реагировать на нажатие кнопок при отсчете задержки? Вы думаете человек нажмет на кнопку так быстро, что надо делать для обработки нажатия на кнопку прерывание, скорость отклика которого при кварце 16 Мгц ~ 1 мкс? Поймите то, что Вы написали завязано на самой работе процессора - если вы будете что то добавлять в программу - нарушиться работа того, что уже написано. Стандартная схема программы:
1.Фоновая программа, реализующая основную задачу процессора – СЧИТАТЬ!!! т.е вычислять формулы, обрабатывать данные полученные с портов и т.д. и т.п. - построена из функций и процедур, которые находятся в петле. На данную часть программы остальные части влияют весьма опоследовательно - через флаги и глобальные переменные, сама же фоновая программа помимо вычислений может также управлять прерываниями. Период выполнения данной программы при самых суровых вычислениях обычно меньше 0.1 секунды т.е. для человека довольно быстро. за 0.1 секунды процессор AVR при кварце 16Мгц выполняет ~ миллион операций это - очень много
2.Программа обработки прерываний. В свою очередь ее можно разделить на три группы, по типу событий, которые контроллер должен обрабатывать:
2.1 события, происходящие периодически: динамическая индикация, опрос клавиатуры, кнопок- т.е. реализация интерфейса с человеком! Так же отсчет системного времени, измерение аналогово сигнала и т.д. то есть все, что завязано на отсчетах временного интервала естественно для реализации используется прерывание по таймеру. Важное замечание! незачем плодить прерывания, если периодических процессов несколько просто подбираем период прерывания кратным этим периодическим процессам и одно и тоже прерывание считает период каждого процесса и их же выполняет.
2.2. Внешние события, не периодические: обмен с компьютером, другим микроконтроллером, изменение аналогового или цифрового сигнала и т.д. - для каждого такого события есть свое прерывание.
2.3. Сбой работы контроллера- разные типы контроллеров по разному обрабатывают данное событие. В AVR просто происходить аппаратный сброс контроллера при понижении питания и при переполнении собачьего таймера.
P.S. Вообще то если Вам надо таймер, то соберите его на 4000 логике, будет стоить рупь
![Улыбка](images/smilies/icon_smile.gif)
и нечего стрелять из меги16.