Цитата(zheka @ Dec 30 2006, 22:28)

Все кнопки одной ногой к пинам, другие ноги на минус питания. Включены внутренние pullup резисторы. Т.е. если на пине - 0, значит кнопка нажата, если 1, значит кнопка отпущена (работае pullup)
С внешними прерываниями уже не получится... У меня плата собрана - все кнопки на PORTB, а прерывания у mega16 на PORTD.
Ну может хитрость какая есть в программировании?
WHALE, и еще - у меня обработка калвиши по приципу флажка - нажал однократно - включил, еще раз нажал - выключил.
Путь 1. (Найболее простой)
Прерывание не по кнопке делается, а по таймеру. С определённой периодичностью опрашивается клавиатура.
DS1820 позволяет увеличить времянки в 2 раза. Прерывание от таймера не должно превышать критическое время (то есть не должно серьёзно увеличивать формируемые задержки для DS). Либо задержки должны формироваться в том же прерывании. В местах, где принципиально не допустимы задержки - их запрещают.
Путь 2.
Что-то типо микроOS. (Саму OS наверное не удастся прикрутить, так как слишком задержки малы для нормального функционирования)
Формируются временные метки. Управление попеременно передаётся, то на одну, то на другую задачу. Каждая задача разбивается на фазы. Каждая фаза выполняется за одну метку.
Написал, а потом задумался (

)
Вообще-то Вам всё это ни к чему. Съём с одного датчика занимает максимум 13мс (согласно документу). С одним датчиком меньше 10мс. Нормальный период опроса для клавиш от 20 до 100мс. Так, что у Вас просто хомут какой-то.