Кнопка (без фиксации) подсоединяется к выводу INTO (PD2, вывод 16 для ATmega8535). Если кнопка имеет перекидной контакт (т. е. три вывода), она подсоединяется к «земле» и питанию так, как показано на рис. 8.3, б (вместо элемента «исключающее ИЛИ» выступает, естественно, наш МК). Чаще встречаются кнопки с двумя выводами, тогда их подсоединяют так, как показано на рис. 17.2. В обоих случаях при ненажатой кнопке на выводе должен быть потенциал питания, т. е. высокий уровень, а при нажимании вывод коммутируется на «землю».
Рис. 17.2. Подсоединение кнопки с двумя выводами к МК АТтеда8535
Заметки на полях
Еще раз напомню (см. главу 12 ), что в принципе от резистора на схеме рис. 17.2 можно отказаться, поскольку специально для таких случаев в AVR предусмотрено подключение внутреннего «подтягивающего» резистора. Однако для надежности ставить его все же следует (так же, как и по выводам программирования, см. описание схемы к рис. 14.2 в главе 14 ), т. к. номинал встроенного «подтягивающего» резистора достаточно велик (минимум 35 кОм, согласно руководству), то на нем могут возникать наводки, которые приведут к ложным срабатываниям кнопки. Вы можете попробовать исключить резистор из схемы и убедиться в этом сами — ложные срабатывания появятся обязательно. И уж наверняка ложное прерывание будет возникать в ситуации, описанной в главе 14 для кнопки Кн1, когда питание внезапно переключается с сети на батареи. Так как мы тут такой режим не используем, то конденсатор параллельно кнопке (см. схему подключения Кн1 на рис. 14.2) ставить необязательно.
Доработка программы
Доработку программы измерителя (напоминаю, что за основу берем листинг П5.2, приведенный в Приложении 5 , в разделе «Программа измерителя температуры и давления») начнем с того, что, во-первых, включим питание аналоговой части. Для этого в разделе начальной загрузки, там, где устанавливаются порты («установка портов вход/выход»), вместо команды ldi temp, 0b10000000(перед out DDRD, temp) запишем ldi temp, 0b11000000. Теперь вывод 20 сконфигурирован на выход и для надежности следует добавить еще оператор cbi PortD, 6(т. к. включается ключ низким уровнем).
Во-вторых, инициализируем таймер (Timer 1). В пробной программе записи во flash из главы 16 мы его настраивали ровно на 15 с, а здесь выберем вдвое меньший интервал — 7,5 с. В загрузочную секцию вместо строк инициализации Timer 0 ( ldi temp, (i<и out TIMSK, temp) добавляем строки листинга 17.1.
Листинг 17.1
;++++++++Set Timer 1
ldi temp,high(292 97)
out OCR1AH,temp
ldi temp,low(2 9297)
out OCR1AL,temp
ldi temp,0b00001101
out TCCR1B,temp ;1/1024; очистить после совпадения
ldi temp,(1<< ;разреш. прерывания
;по совпадению для Timer 1 и переполнению Timer 0
out TIMSK,temp
Переключающий режим для вывода PDS-OC1Aздесь мы не используем. Кроме этого, введем переменную count_min, с помощью которой будем считать интервалы в 7,5 с. В секции объявления переменных добавим:
def count_min = r23 ;счетчик 7,5-секундных интервалов
А в секции начальных установок его не забудем обнулить:
clr count_min
Далее введем специальный флаг sleep(пусть будет бит 7 в регистре Flag), который будет сигнализировать о режиме. Если этот бит установлен — пора «спать», если обнулен — работаем, как ни в чем не бывало. По умолчанию он обнулен (см. секцию «начальная установка переменных») и нам ничего не грозит, если мы вставим в основной цикл запуск режима энергосбережения по схеме, согласно листингу 17.2.
Листинг 17.2
Gcykle:
sbrs Flag,7 ;если бит 7 установлен, то засыпаем
гjmp Gcykle ;иначе бесконечный цикл
cli ;на всякий случай запрещаем прерывания; все порты на вход, и нули в разряды, кроме PortD,6
clr temp
out DDRB,temp
out DDRC,temp
out DDRD,temp
out PortB,temp
out PortC,temp
ldi temp,0b01000000 ;выключение питания на всякий случай
out PortD,temp
ldi temp,0b11100000 ;разрешение Sleep, режим Standby прерывание по уровню
out MCUCR,temp
ldi temp,(1< ;разрешение INTO
out GICR,temp
sei ;разрешаем прерывания
Sleep ;наконец, спим
cbr Flag, $80 ;по выходу из сна сбрасываем флаг sleep
clr count_min ;отсчет времени
;сначала установка портов вход-выход обратно
cli ;на всякий случай запрещаем прерывания
Читать дальше
Конец ознакомительного отрывка
Купить книгу