Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
228 Часть 111. Практическое программирование микроконтроллеров АVR сделать, если сменить частоту на входе таймера на более высокую - например, при частоте предделителя 1 /8 в место 1 / 6 4 каждый «старый» отсчет будет соответст вовать по длительности 8 «новым», и нам нужно будет отсчитать 4 «новых» интер вала (для чего придется предварительно записать в счетный регистр число 252). При этом следует еще учесть количество тактов, необходимое для перестройки таймера. Другой способ точной подгонки частоты - организовать простую задержку, и мы его рассмотрим позднее . А пока зададимся вопросом: нельзя ли избежать всех этих сложностей? Для этого можно, например, выбрать подходящее значение тактовой частоты МК - так, «кварц» с частотой 4096 кГц даст при делении на 64 ровно 64 кГц, и делить придется уже на целое число. Более общий способ - применить тот же метод, что и в примере из главы 5, - с дополнительным счетчиком пере полнений (переменная Count_time в листинге 5 . 1 3) . Тогда мы не ограничены часто той 256 кГц, а можем выбрать более высокую частоту на входе счетчика. Напри мер, если установить коэффициент предделителя 1 /8 , то мы из 4 МГц получим 500 кГц, которые поделим на 250 описанным ранее методом, и отсчитаем два таких цикла переполнения . Теперь посмотрим, как это может выглядеть в конкретной задаче. Предположим, нам нужно с частотой 1 кГц переключать внешний вывод МК (для определенности пусть это будет вывод PD6) . Чтобы частота переключения была 1 кГц, нам надо за один период переключить вывод дважды (от высокого к низкому уровню и обрат но). Листинг 9 . 1 иллюстрирует, как это может выглядеть в реальности. . device AТmegaB . include "m8def . inc " ; частота 4 Мгц . equ K_div = 2 5 0 ; коэффициент деления Кдел . def rK_div = r l б ; рабочая ячейка для Кдел . def count = rl 7 ; счетчик до 2 . def temp = rlB ; рабочая переменная ; ===== прерывания rjmp Reset ; вектор сброса . org OVFOaddr ; по адресу OVFOaddr прерывание переполнения TimerO rjmp TIMO OVF . org INT_VECTORS_S I ZE ; начинаем с адреса после таблицы векторов ; ====== начало программы TIMO_OVF : ; прерывание TimerO inc count sbrs count , O ; если счетчик нечетный, пропустить sbr temp , ObO l O O O O O O ; иначе установить бит 6 sbrc count , 0 ; если счетчик четный, пропустить cbr temp , ObO l O O O O O O ; иначе сбросить бит 6
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==