Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

252 Микроконтроллеры AVR от азов программирования... И первое, что нам пришлось сделать, — это создать переменную rab. Эта переменная нам будет нужна для операций сдвига, и использоваться она будет как в функции main, так и в функции обработки прерывания. То есть переменная должна быть глобальной. Поэтому описание этой переменной мы поместили вне обеих функций в самом начале программы (строка 2). Функция main претерпела наименьшие изменения. Потребовалось лишь добавить команду присвоения начального значения перемен ­ ной rab (строка 40) и команду разрешения прерываний (строка 41). Главный же цикл программы оставлен пустым, как и в программе на Ассемблере. Доработанная подобным образом функция main работает точно так же, как основная программа в программе на Ассемблере. То есть после выполне ­ ния команд конфигурации и разрешения прерывания таймер/счетчик будет запущен в режиме сброса при совпадении. Каждые 200 мс он будет вызывать процедуру обработки прерывания, то есть функцию timerl_comp_isr. Теперь посмотрим, как доработана функция timerl_comp_isr. Основная часть доработок пришлась именно на нее. Новые команды, составляющие тело функции, занимают в программе строки 4 — 10. Функция обработки прерывания так же, как и соответствующая проце ­ дура в программе на Ассемблере, занимается сдвигом содержимого пере ­ менной rab на один шаг влево или вправо и выводом полученного зна ­ чения в порт РВ. Но перед тем, как выполнить сдвиг, нужно определить направление этого сдвига. Для этого нужно проверить состояние переключателя. Для проверки состояния переключателя служит команда if (строка 4). Эта команда проверяет значение младшего разряда порта PD. Если значение разряда равно единице (контакты переключателя разомкнуты), то выполняется процедура сдвига на один бит вправо (строки 5,6). Если младший бит PD равен нулю (контакты переключателя замкнуты), то выполняется про ­ цедура сдвига на один бит влево (строки 8,9). Рассмотрим подробнее процедуры сдвига. Сдвиг на один бит вправо выполняется в строке 5. Оператор if в строке 6 проверяет, не дошла ли сдвигаемая единица до конца байта. Признаком того, что единица уже дошла до конца, является равенство переменной rab нулю. Если условие выполняется, то переменной rab будет присвоено значение ОЫООООООО. То есть дойдя до правого края, единица появляется слева. Таким образом реализуется эффект кругового движения единичного бита. Обратите внимание, что в команде i f в строке 6 не используются фигурные скобки. Язык СИ допускает опускать фигурные скобки только в том случае, когда в них заключен всего один оператор. Процедура сдвига на один бит влево (строки 8,9) выполнен аналогич ­ ным образом. Я думаю, что тут вы легко разберетесь сами.

RkJQdWJsaXNoZXIy MTExODQxMg==