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

154 Часть 11. Программирование микроконтроллеров АVR на ассемблере Я обычно пишу в hех-форме только потому, что так короче и наглядней , и под рукой у меня всегда калькулятор, который переводит в hех-форму и обратно одним щелчком мыши . Счетчик counte r будет считать «вкруговую» - при переполнении он опять начнет с нуля. Программа выводит состояние счетчика в порт С целиком, таким образом работа ее не зависит от того, сколько именно светодиодов вы подключите в выво­ дам этого порта, - все шесть (доступных в АTmega8) или только три, как на схеме. ПОДРОБНОСТИ Пояснений здесь требует момент, связанный с определением переменных, - почему мы начали сразу с регистра r l б, а не с ro, например? Одно из самых больших не­ удобств AVR заключается в том , что команды , оперирующие с константами { lcti , sbci и suЬi - в нашем случае, а также команды cpi , ancti и др. ) не работают с первыми шестнадцатью РОН ( от ro до r 1 5 ) , их можно использовать только для регистров rlб - rЗl (заметим сразу про еще одно аналогичное ·ограничение: команды поразрядного досту­ па к РВВ sЬi, сЬi , sЬis и sЬic работают только для первых тридцати двух РВВ , до но­ мера $ 1F включительно) . Для сокращения программы рабочие переменные { temp, счетчики) всегда желательно выбирать из этой половины регистрового файла . Поло­ жение осложняется тем , что регистры из старшей половины наиболее дефицитны - последние шесть из них объединены в пары х, У и z для работы с памятью и некото­ рых других операций (см . далее) , r24 и r25 задействованы в команде adiw, и т. п . Если переменных не хватает, то , чтобы не связываться с локальными переменными или не переходить на работу с памятью, загрузку регистра из первой половины регистрового файла (допустим , это r15 ) непосредственным значением приходится осуществлять парой команд: ldi temp , 10 mov r 1 5 , temp Но самое главное не это - возникает вопрос, нельзя ли улучшить алгоритм так, чтобы не приходилось думать о том, как быстро надо снять палец с кнопки? Это можно сделать, если дополнительно еще отслеживать отпускание кнопки, что не так уж и просто, поскольку из-за дребезга нажатие и отпускание - с точки зрения контроллера - по большому счету различаются только начальной и конечной фа­ зой, а в остальном они представляют собой одинаковые пачки импульсов общей длительностью, как правило, несколько десятков микросекунд. Поэтому общая схема «отлова>> «настоящего» отпускания кнопки должна быть в этом случае такой: «ловим» нажатие (т. е. появление низкого уровня на выводе PD2), делаем паузу, чтобы пропустить дребезг, и начинаем «ловиты> отпускание (т. е. первое появление высокого уровня на выводе) . Затем проделываем необходимые действия и опять выдерживаем «антидребезговую» паузу перед тем, как все начать сначала. Дли­ тельность пауз нужно достаточно точно рассчитать, иначе возможен пропуск коротких и быстро следующих друг за другом нажатий. Примем для простоты, что обе паузы будут составлять О, 1 с (возможно, в реальной конструкции эти величины потребуется подогнать «по месту»). ЗАМЕТКИ НА ПОЛЯХ Наверное, вы замечали , что экранные кнопки в графическом интерфейсе Windows реагируют именно на отпускание кнопки мыши . Психологически нажатие есть опера­ ция , к которой человек - особенно нетренированный «чайник» - должен подгото-

RkJQdWJsaXNoZXIy MTExODQxMg==