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

280 Часть 111. Практическое программирование микроконтроллеров AVR Поэтому мы поступим проще : будем записывать не каждое изменение на ступень­ ку, а только то значение порога, на котором пользователь в конце концов остано­ вился. Зафиксировать его очень просто - по моменту отпускания кнопки. Для фиксации момента отпускания мы при первом же нажатии для обеих кнопок объ­ явим прерывание по фронту (перепаду из нуля в единицу) и, выполнив в нем запись в EEPROM, тут же его запретим . Независимо от того, сколько вы будете держать кнопку нажатой, такое прерывание произойдет только один раз при отпускании. Этот подход снизит количество необходимых перезаписей раз в сто, что уже впол­ не приемлемая величина с точки зрения со х ранности EEPROM. Сохраненное значение будет прочитано при следующем запуске и сразу записано в регистр срав­ нения . Все указанное реализовано в следующей программе (листинг 1 0 . 3) . Обратите вни­ мание, что мы вернулись от жутких мегагерцев с внешним кварцем к спокойному тактированию от внутреннего генератора 1 МГц (не забудьте переустановить fusе­ биты CKSEL, а для АTtiny23 1 3 еще нужно включить бит CKDN8, - см. главу 5) . . device ATtiny2 3 1 3 ; встроенный 1 MHZ . include "tn2 3 1 3de f . inc" . de f ternp =rl б . de f RazrO r1 7 ; разряды задержки . de f Razrl = r 1 8 . de f porog = r2 0 ; ============ прерывания ============ rjrnp RESET ; Reset Handle rjrnp EXT_INTO ; External InterruptO Vector Address rjrnp EXT_INTl ; External Interrupt l Vector Address . org INT VECTORS S I ZE ; начинаем с адреса после таблицы векторов ; ========== программа ============ .rnacro Delay ; процедура задержки ldi Razrl , @ 0 ; старший байт N ldi RаzrО , @ l ;младший байт N R suЬ : . endrn suЬi Razr0 , 1 sbci Raz rl , O brcc R suЬ ЕХТ INTO : ; кнопка "больше " отпущена cbi PortD , 6 ; РDб = low гасим reti rcall WriteEEP ; пишем текущее значение porog clr ternp ; запрещаем прерывание out GIMSK , temp

RkJQdWJsaXNoZXIy MTExODQxMg==