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

232 Часть 111. Практическое программирование микроконтроллеров AVR Закомментированные строки относятся к другим моделям контроллеров, в которых размещение вывода ОС 1 А, разумеется, отличается от Mega8 . В регистр сравнения нужно загружать число, на единицу меньшее заданного числа отсчетов таймера (почему - пояснено во врезке «Подробности» далее). · Бит з в регистре тссRlВ, называемый WGМ12 (в некоторых моделях Mega он носит другое название - стс1 ) , необходимо устанавливать в 1 - это означает, что по достижении записанного в регистрах срав�:�ения числа таймер обнулится и начнет отсчет заново. В противном случае переключение вывода произойдет, но таймер будет считать до заполнения регистра и далее опять до заданного числа - факти­ чески прерывания просто сдвинутся по фазе относительно прерываний по перепол­ нению, но будут происходить с той же частотой . Установка бита СОМlАО в регистре тccRlA задает режим работы вывода OC lA. Этот вывод может переключаться в заданное состояние каждый раз, когда таймер дости­ гает предустановленного значения в регистре сравнения OCRlAН : OCRlAL. Установка битов coМlAl : соМlАО (биты 7 и б в регистре тcCRlA ) в состояние 0 1 означает, что этот вывод (если он сконфигурирован на выход) будет автоматически переключаться каждый период «туда-обратно», формируя меандр. Тогда к выводу OC l A можно подключить, например, светодиод, который в этом случае будет загораться или гаснуть раз в секунду (обратите внимание, что в предыдущем случае с использова­ нием простейшего ТimerO нам приходилось вывод переключать «вручную») . При­ чем работа этого вывода не зависит от того, задействовано ли соответствующее прерывание для обработки таких событий или нет. Иными словами, просто для получения частоты на одном выводе ничего больше делать не требуется . Оформите текст в виде законченной программы, не забыв оп­ ределить temp и вставить в конец бесконечный цикл (см. текст программы timer1 _1 c.asm в архиве по адресу, указанному во введении), и загрузите ее в контрол­ лер. Если это модель, отличная от Mega8, раскомментируйте или заново впишите соответствующие строки инициализации вывода ОС l A и замените наименование INС-файла. Вся программа займет 22 байта, причем она легко адаптируется под иное значение частоты на выходе ОС 1 . Еще раз обратим внимание, что переключение светодиода на выводе происходит каждое совпадение, т. е. период собственно мигания вдвое больше секунды, а частота фактически равна 0,5 Гц, а не 1 Гц. Промежуток между сравнениями (длительность импульса) ровно в 1 секунду нам понадобится далее, когда мы будем задействовать прерывание. Если же нам требуется именно частота 1 Гц на выводе, а не промежуток между сравнениями в 1 секунду, то нужно заме­ нить загружаемое в регистры сравнения число на вдвое меньшее - 3 1 249. Изменение частоты возможно как с помощью изменения числа сравнения, так и с помощью установки иного коэффициента деления входной частоты таймера. При той же тактовой частоте 4 МГц, установив максимально возможный коэффициент 1 / 1 0 2 4, вы можете получить максимальную длительность импульса более 1 6 секунд, а установив все в минимум (коэффициент деления 1 : 1 и число сравнения = 1 ) ми­ нимальную длительность импульса в 0,5 мкс (частоту 1 МГц). В последнем случае можно еще увеличить частоту вдвое, если загружать в регистр сравнения нулевое

RkJQdWJsaXNoZXIy MTExODQxMg==