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

Глава б. Основы программирования МКАVR После задания стека иногда ставят следующие строки : ldi ternp , l<<ACD out ACSR , ternp ; выкл. аналог . компаратор 137 Почему «иногда>>, а не всегда? Потому что по умолчанию аналоговый компаратор всегда включен, и, соответственно, расходует питание. Если вы его не используете, то зачем лишнее потребление? Правда, это практически не скажется на потребле­ нии в нормальном режиме работы - доля компаратора очень мала. Потому кри­ тичной вставка этих строк становится только в случае, если задействованы режимы энергосбережения, а в обычных режимах эти команды просто ни на что не повлия­ ют. Если компаратор необходим (см. главу 1 1), то, конечно, эти строки нужно ис­ ключить. После всего этого в процедуре RESET обычно идет секция инициализации, где раз­ решаются конкретные прерывания, устанавливаются состояния выводов портов, инициализируются начальные значения переменных, и т. п. Примеры мы еще встретим в тексте этой книги неоднократно. Секция инициализации, как мы гово­ рили ранее, обязательно должна заканчиваться командой sei - общим разрешени­ ем прерываний, т. к. по умолчанию они запрещены. Теперь вроде бы все готово к работе, но что станет делать контроллер в ожидании прерываний? Ведь основная функциональность наших программ будет сосредото­ чена именно в обработчиках прерываний, и в простейшем случае контроллер по­ просту ничего не должен делать, пока не придет сигнал очередного прерывания . Поэтому простейшая программа должна заканчиваться пустым · циклом, перед которым обязательно должно идти общее разрешение прерываний, если вы их, ко­ нечно, используете (команда sei) : sei ; разрешаем прерывания LOOP : rjrnp LOOP Я намеренно употребил здесь для наименования метки хорошо знакомое вам слово LOOP, потому что замкнутый цикл здесь делает ровно то же самое, что и функция loop ( ) в среде Arduino (название метки, понятно, никакой роли не играет). Именно внутри такого цикла работают программы, не использующие прерываний (или ис­ пользующие их неявно, как в Arduino) . И правда, в этом цикле можно делать что-то полезное - например, войти в один из режимов энергосбережения, или отслежи­ вать изменение состояния какого-либо вывода, или, например, ожидать прихода байта через UART и т. п. - в дальнейшем мы увидим примеры подобных дейст­ вий. Но мы во всех случаях, когда это возможно, постараемся без таких действий обойтись - так программа получается компактнее, а ее логика работы становится более понятной и проще проверяемой. ЗАМЕТКИ НА ПОЛЯХ Если вы рассмотрите внимательно структуру любой программы для Aгduino, то увиди­ те, что она устроена совершенно аналогично нашей ассемблерной . Единственное различие - там тип контроллера указывается не в программе, а определяется от-

RkJQdWJsaXNoZXIy MTExODQxMg==