Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
246 Микроконтроллеры AVR от азов программирования... В строке 51 основная программа завершается. Так как все операции по управлению движением «огней» выполняет процедура обработки прерывания, то основной программе больше ничего делать не нужно. Поэтому в строке 51 организован бесконечный цикл. Он представляет собой безусловный переход сам на себя. Попав в такой цикл, программа будет бесконечно выполнять один и тот же оператор. Немного о том, как происходит вызов прерывания. Таймер/счетчик непрерывно производит подсчет тактовых импульсов системного гене ратора. В момент, когда содержимое счетного регистра совпадет с содер жимым регистра OCR1A, счетчик сбрасывается и начинает счет сначала. При очередном совпадении все повторяется. В момент сброса счетчика вызывается прерывание. Таким образом, процедура обработки прерыва ния выполняется периодически, каждый раз, когда счетчик досчитает до момента совпадения. Коэффициент предварительного деления и величину кода совпадения мы выбрали таким образом, что период, с которым происходит вызов прерывания, равен 200 мс. То есть соответствует нашему техническому заданию. Процедура обработки прерывания заканчивается гораздо быстрее. Время выполнения этой процедуры примерно равно 6 мкс. Поэтому к тому времени, когда прерывание будет вызвано повторно, процедура обработки предыдущего прерывания уже давно закончится. Теперь перейдем к самой процедуре обработки прерывания. Текст этой процедуры занимает строки 52 — 71. Начинается процедура с сохра нения всех регистров, которые она в дальнейшем будет использовать (строки 52, 53). Как видите, мы сохраняем даже регистр rab. Теперь, в случае необходимости, наша основная программа сможет использовать этот регистр для своих целей. Так как в промежутке между двумя пре рываниями содержимое rab хранится в буфере ОЗУ, то в строке 54 мы извлекаем это значение из буфера и помещаем в rab. Теперь все готово к операции сдвига. Но сначала нам нужно опреде лить направление этого сдвига. Для этого достаточно проверить состоя ние контактов переключателя. Проверка производится в строках 55 — 57. В строке 55 читается содержимое порта PD и записывается в регистр temp. В строке 56 проверяется значение младшего разряда считанного значе ния. Если значение этого разряда равно единице (контакты переключа теля разомкнуты), то строка 57 пропускается, и программа переходит к процедуре сдвига вправо, которая начинается в строке 58. Если контакты замкнуты, то выполняется безусловный переход в строке 57, и управление передается по метке р2, где начинается процедура сдвига влево. Процедура сдвига вправо занимает строки 58 — 61. Собственно сдвиг происходит в строке 58. В строке 59 происходит проверка, не дошла ли в результате этого сдвига сдвигаемая единица до последнего разряда.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==