Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
1 60 Часть 11. Программирование микроконтроллеров АVR на ассемблере sbci Razrl , O brcc R suЬ . endm ЕХТ INTO : ; кнопка нажата clr temp ; запрещаем прерывание INTO out GICR , ternp Delay l , $ F4 ; задержка 2 мс , sbic PinD , 2 ; пропустить , если нажата rjrnp push_butt ; иначе ничего не делаем inc Counter ; если нажата , увеличиваем счетчик out PORTC , Counter ; выводим счетчик в порт С push_butt : ldi ternp , ( l<<INTO ) ; разрешаем прерывание INTO out GICR , ternp reti ; конец прерывания INTO Reset : ldi ternp , low (RAМEND ) ; устанавливаем указатель . на стек out SPL, temp ldi ternp , high ( RAМEND ) out SPH , ternp ldi ternp , ObO O O O O l O O ; для второго разряда порта D out PORTD , temp ; подтягивающий резистор на всякий случай ldi ternp , OЫl l l l l l l ; порт С все контакты на выход out DDRC , ternp clr Counter ; очищаем счетчик ldi temp, ( l<<ISCO l ) 1 ( l<<ISCOO ) ) ; прер . INTO по фронту out MCUCR , ternp ldi ternp , ( l<<INTO ) ; разрешаем прерывание INTO out GICR , ternp sei ; разрешаем прерывания Gcykle : ; цикл отслеживания кнопки rjrnp Gcykle ; вернуть ся обратно , если не нажата Как видите, логика работы упростилась, но это не единственный выигрыш. Другой положительный момент заключается в том, что контроллер у нас основное время совершенно свободен. В прерывании по ручному нажатию имеется задержка в 2 мс, и с точки зрения контроллера эти события настолько редкие, что их можно не учи тывать. Если вы при этом параллельно будете еще отслеживать какие-нибудь дат чики, выводить данные на дисплей и передавать их по радиоканалу, то контроллер этого даже не заметит. И даже если вдруг какие-то другие действия случайно сов падут с моментом нажатия таймера, и задержка продлится на миллисекунду боль ше, чем запланировано, - велика ли беда? Причем задержка в 2 мс - это с боль шим запасом, в расчете на самые плохие кнопки, обычно достаточно задержки
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==