прерывания. Перед переходом в SLEEP сигнал PGD ставился в 0, и в 1 при продолжении работы. Это давало очень важную информацию о работе системы в целом: сколько времени процессор проводит в прерываниях прекрасно было видно (при отключенном программаторе) на ножке PGC, на осциллографе. А загрузку процессора -- на ножке PGD. Если почти 100% прерывания, да даже если больше ~четверти -- это сулит проблемы. Если загрузка постоянно 100% то тоже повод задуматься (значит не успевает вовремя отреагировать на события). Здесь же дело не в том, что если у тебя питание от сети, то экономить батарейку нечего и спать незачем. Дело в том, что есть скорей какой-то "биг луп" (big loop) в котором крутится программа. И этот биг-луп будится в конечном счёте только от прерываний (в т.ч. прерываний от таймера). И потом работает пока есть внутренние события для обработки (сгенерированные при обработке других событий, а изначально от аппаратного события). Когда все события обработаны -- можно засыпать. Как-то так. И ясно, что если не засыпает никогда -- время реакции на внешние события начинает увеличиваться вплоть до неприличия. Кроме моментов, конечно, когда есть какие-то долгие вычисления. Или если не засыпает -- есть какой-то баг, какие-то циклы в событийной системе (когда сам себе генерирует и обрабатывает, и так без конца), условно говоря зависание некоторых компонентов (цикл при этом крутится, другие события могут обрабатываться, ватчдог сбрасываться).
Ссылка на старый пост (как можно организовать на PIC):