Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
150 Часть 11. Программирование микроконтроллеров АVR на ассемблере вающий» конденсатор С2 по питанию устанавливается всегда, его емкость можно выбирать любой в пределах от О, 1 до 2,2 мкФ. Кнопку Кн 1 для нашего случая можно подсоединять к любому из свободных кон тактов любого порта, но именно к выводу PD2 я подключил ее с далеко идущими целями, о чем вы узнаете далее. Резистор R2 также можно не устанавливать, если обойтись встроенным «подтягивающим» резистором, но, как мы уже говорили, без него помехоустойчивость схемы будет значительно ниже : без такого резистора, может, например, происходить ложное срабатывание кнопки при бросках питания (скажем, при переключении питания с сетевого блока на резервную батарею) . На личие внешнего резистора гарантированно решает такие проблемы, поэтому лучше его устанавливать всегда. Проблема, которую нам предстоит преодолеть, заключается в том, что любая кноп ка дребезжит, и потому при ее нажатии или отпускании генерируется множество импульсов, из которых придется выбрать один. Использование прерывания, как следовало бы сделать «по-правильному», не избавляет от необходимости учиты вать дребезг, поэтому в принципе решение проблемы и там, и здесь одинаково, - придется делать искусственную задержку реакции МК, для чего нам и понадобится имитатор таймера. З адержка Давайте начнем с формирования временного интервала. Нам нужно сформировать задержку порядка секунд или долей секунды. Метод без таймера основан на том, что каждая команда в МК выполняется за строго определенное время . В AVR счи тать время вообще очень просто: большинство простых команд выполняется за один такт, и потому, например, для формирования интервала в одну десятую секунды при тактовой. частоте 1 МГц (которая, напомним, устанавливается для контроллера «по умолчанию» за счет встроенного RС-генератора), нам требуется выполнить какую-нибудь (в общем-то неважно, какую) последовательность из ста тысяч команд. Обычно программисты используют декрементирование (т. е. последовательное уменьшение на единицу) какой-либо величины. Предположим, что необходимое число займет два регистра-разряда, что даст максимальную величину числа 65 535 . Схема действий такая: мы последовательно уменьшаем самый младший разряд (на зовем его Razro) на единицу, когда его величина достигает нуля, уменьшаем на единицу следующий ( Razrl) и переходим опять к уменьшению младшего, начиная со значения 255 (это значение загружать специально не требуется, т. к. при вычита нии единицы из нуля результат получится равным 255 автоматически), и так до тех пор, пока все разряды не станут нулями. Предварительно следует загрузить в пере менные RazrO и Razrl нужное число. Какое? Это зависит от конкретного алгоритма. Следующая последовательность команд (листинг 6 . 1 3) реализует этот алгоритм «в лоб».
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==