Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

152 Часть 11. Программирование микроконтроллеров АVR на ассемблере число регистров (каждый регистр - еще одна команда sbci продолжительностью в 1 такт) . Всего с двумя регистрами и тактовой частотой 1 МГц мы можем получить задержку до 0,26 с, если запишем в них число 65 535 = $ FFFF, а с тремя регистрами при той же тактовой частоте - задержку почти до 84 с, если запишем в них число 1 6 777 2 1 5 = $FFFFFF. П рограмма счетчика Сначала разберемся с нажатием кнопки. Отслеживать состояние вывода удобно командами sbic или sЬis (Skip if Bit in 1/0 register Clear/Set, пропустить следующую команду, если бит в РВВ очищен/установлен) применительно к второму биту мас­ сива PinD, к которому и подключена кнопка. Листинг 6 . 1 5 иллюстрирует простей­ ший цикл слежения за состоянием кнопки (когда кнопка нажимается, состояние вывода меняется с единицы на ноль). Pincykle : ; цикл отслеживания кнопки sЬic PinD, 2 ; пропустить , если нажата rjmp Pincykle ; вернуть ся обратно , если не нажата <кнопка нажата - что-то делаем> rjmp Pincykle ; вернуть ся обратно к отслеживанию Даже когда нам требуется отслеживать только нажатие (а не последующее отпус­ кание, как описано далее), то такой простейший цикл работал бы отвратительно: вся процедура вместе с возможными действиями по факту нажатия займет микро­ секунды, а даже при самом быстром ударе по кнопке замкнутое состояние контак­ тов будет продолжаться доли секунды. Потому, обнаружив при переходе к началу цикла, что замкнутое состояние продолжается, процедура будет выполняться снова и снова, пока вы кнопку не отпустите (сравните с описанием работы прерывания по уровню в главе 3). Чтобы этого не происходило, как минимум, необходимо ввести задержку перед возвращением к началу цикла, а еще лучше при этом проверять со­ стояние кнопки несколько раз, чтобы уберечься от случайной помехи. Чтобы потом не повторять процедуру задержки в коде несколько раз с разными значениями, мы сразу оформим задержку в виде макроса (можно в виде функции, но тогда надо еще не забыть инициализировать стек, и мы будем терять по 7 тактов при каждом вызове, что в других случаях может оказаться существенным при ма­ лых задержках). Тогда вся программа, включая секцию определений, будет такой, как в листинге 6 . 1 6 . ; Программ а счета нажатий кнопки в двоичном коде . device AТmega8 . include "m8def . inc " ; частота по умолчанию 1 МГц

RkJQdWJsaXNoZXIy MTExODQxMg==