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

156 Часть 11. Программирование микроконтроллеров АVR на ассемблере rjmp Pincykle ; вернуться обратно к отслеживанию Delay $ 6 1 , $А8 ; задержка 0 , 1 с, N = $ 6 1А8 Pin_release : ; отслеживаем отпускание sbis PinD, 2 ; пропустить , если отпущена rjmp Pin_release ; вернуться обратно , если еще нажата inc Counter ; если отпущена , увеличиваем счетчик out PORTC, Counter ; выводим счетчик в порт С ; кнопка отпущена - пауза Delay $ 6 1 , $А8 ; задержка 0 , 1 с , N = $ 61А8 rjmp Pincykle ; вернуться обратно к отслеживанию Как видите, программа (листинг 6 . 1 7) не больше предыдущей - в памяти она зай­ мет 5 8 байтов. Работает она гораздо лучше: не дребезжит, если вы забыли вовремя снять палец, и на меньшее время «тормозит» контроллер - 0,2 с вместо целой секунды с лишним в предыдущем случае. Можно еще снизить эту величину, если подогнать паузы «по месту» - реальный дребезг, конечно, никогда не продлится целых 1 00 миллисекунд. ПОДРОБНОСТИ Да , кстати , а почему мы тут не проверяем дважды состояние при отпускании? А пото­ му, что никакая помеха не сможет пробиться на вывод, который накоротко замкнут с «землей» . На «подтягивающий» резистор вполне может (особенно если вы забыли поставить внешний и обошлись внутренним) , а если уж на замкнутой ранее кнопке вдруг образовался высокий уровень - это ее однозначно отпустили . Ради любопытства давайте проверим упрощенный Arduino-aнaлoг второго варианта (листинг 6. 1 8) . byte count=O ; void setup ( ) { DDRC = Oxff ; PORTD=Ox0 4 ; ) void loop ( ) i f ( digita1Read ( 2 ) ! =1 ) { delayMicroseconds ( l O O OO ) ; i f ( digita1Read ( 2 ) ==1 ) { delayMicroseconds ( l O O OO ) ; count++ ; PORTC=count ; Здесь мы по возможности минимизировали код, не проверяя состояние дважды и не пользуясь штатными ардуиновскими функциями pinМode ( ) и digitalWrite ( ) (иначе

RkJQdWJsaXNoZXIy MTExODQxMg==