Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
Шаг 5. Переходим непосредственно к разработке устройств и программ 245 После того, как режим таймер выбран, нужно записать код совпаде ния в соответствующий регистр. Для канала А этот регистр называется OCR1A. Он имеет шестнадцать разрядов и физически состоит из двух отдельных регистров OCR1AH и OCR1AL. В каждую из этих половинок регистра записывается своя часть кода совпадения. В регистр OCR1AH записывается старший байт (строки 40, 41), а в регистр OCR1AL — младший байт (строки 42, 43) кода. Данный регистр совпадения обла дает свойством двойной буферизации. Поэтому и здесь важен порядок записи двух его половинок. Сначала нужно записывать старший байт кода, а затем младший. После инициализации таймера необходимо инициализировать систему прерываний. Инициализация системы прерываний сводится к выбору нового значения маски прерываний по таймеру. Значение маски записывается в регистр TIMSK. В данном случае нам нужно разрешить лишь один вид прерываний: прерывания по совпадению в канале А. Для этого соответствующий выбранному прерыванию бит в байте маски дол жен быть установлен в единицу. Остальные биты должны оставаться равными нулю. Запись маски производится в строках 44 и 45. Во всем остальном новый модуль иници ализации полностью соответствуют аналогичному модулю в программе из предыдущего примера (листинг 5.11). За модулем инициализации начинается основная программа. В нашем случае она занимает всего четыре строки (строки 48 — 51). В строках 48, 49 происходит присвоение начального значения рабочему регистру rab и сохранение этого значения в буфере buf . Как и в предыдущих примерах, рабочий регистр будет использоваться для операций сдвига, имитирую щих движение нашего «огня». Начальное значение должно представлять собой двоичное число, один двоичный разряд которого равен единице, а все остальные — нулю. Затем процедура обработки прерывания будет двигать этот разряд вправо и влево. Поэтому будет логично, если первоначально нашу единичку мы расположим где-то посередине. То есть выберем в качестве начального значения, например, число ОЬООО 10000. Что и сделано в строке 48. Так как мы договорились, что в промежутках между двумя прерыва ниями эта величина будет храниться в буфере buf , в строке 49 содержи мое rab помещается в этот буфер. Теперь все готово к запуску системы прерываний. В строке 50 находится команда, разрешающая все прерыва ния. Обратите внимание, что к этому моменту наш таймер/счетчик уже находится в режиме счета. Он начал работать сразу после записи значе ния в регистр TCCR1B. Однако все прерывания до сих пор были запре щены. Теперь, когда прерывания мы разрешили, система бегущих огней сразу начинает работать.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==