Пятница, 29.03.2024, 12:07
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Меню сайта
Реклама Google
Форма входа
Категории раздела
Это нужно знать! [17]
Изучаем AVR [30]
Программаторы [12]
Необходимое ПО [8]
Готовые устройства [73]
Справочная [38]
Инструмент [0]
Технология [8]
Литература [0]
Arduino скетчи [18]
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Микроконтроллеры - это просто!
Главная » Статьи » Изучаем AVR

Задержка
Давайте начнем с формирования временного интервала. Нам нужно сформировать задержку порядка долей секунды. Метод без таймера основан на том, что каждая команда в МК выполняется за строго определенное время. В AVR считать время вообще очень просто: большинство команд выполняется за один такт, и потому, например, для формирования интервала в одну секунду при тактовой частоте 4 МГц, нам требуется выполнить какую-нибудь (в принципе неважно, какую) последовательность из четырех миллионов команд.

Обычно программисты используют декрементирование (т. е. последовательное уменьшение на единицу) какой-либо величины. Предположим, что необходимое число займет три регистра-разряда (это даст максимальную величину 16 777 215). Схема действий такая: мы последовательно уменьшаем самый младший разряд (назовем его Razr0) на единицу, когда его величина достигает нуля, уменьшаем на единицу следующий (Razr1) и переходим опять к уменьшению младшего, начиная со значения 255 (это значение загружать специально не требуется, т. к. при вычитании единицы из нуля результат получится равным 255 автоматически). Когда, в свою очередь, величина Razr1 достигает нуля, уменьшаем на единицу самый старший (Razr2) и так до тех пор, пока все разряды не станут нулями. Предварительно следует загрузить в переменные Razr0-Razr2 нужное число. Какое? Это зависит от конкретного алгоритма.

Следующая последовательность команд реализует этот алгоритм "в лоб".

Листинг 
Delay:
dec Razr0 
brne Delay 
dec Razr1 
brne Delay 
dec Razr2 
brne Delay 
[все равны 0 — конец задержки]

Обратите внимание, что при использовании команды dec никаких дополнительных команд сравнения при достижении нуля не требуется (подробности см. в следующей главе). Некрасивость такого решения заключается в наличии команд перехода, которые выполняются за один такт, если условие (в данном случае равенство нулю) не выполняется, и за два такта, если оно выполняется. К тому же число циклов в каждой итерации, вообще говоря, разное. Поэтому точно подсчитать число циклов становится довольно сложно. Это хорошо, что в этой данной задаче необязательно выдерживать точный интервал, а если надо?

Значительно более компактной и предсказуемой будет реализация алгоритма на основе команды вычитания с учетом переноса.

Листинг 
Delay:
subi Razr0,1 
suci Razr1,0 
suci Razr2,0 
brcc Delay

Работает это так: команда suci вычитает сразу две величины — то, что записано в самой команде, плюс флаг переноса с. Если результат предыдущего вычитания устанавливает флаг переноса (что происходит при переходе через ноль, когда из нуля вычитается единица), то команда suci вычтет его значение, равное единице, если нет, то не вычтет ничего (точнее, вычтет ноль). В результате в каждой итерации выполняется строго определенное число команд и за строго определенное время: по одному такту на каждое вычитание плюс два такта на переход обратно к началу цикла (ведь для команды brcc условие перехода выполняется, если флаг переноса не установлен), всего пять тактов. (Для особо въедливых отметим, что самый последний цикл будет на один такт короче.)

Итак, для того чтобы получить ровно 4 000 000 тактов, нам нужно записать в регистры Razr2-Razr0 число 4 000 000/5 = 800 000 или $0С3500. Это даст интервал в 1 с при тактовой частоте 4 МГц. В общем случае число N, соответствующее нужному интервалу времени Т (с) при тактовой частоте F (Гц), можно получить по формуле 7775. всего с тремя регистрами и тактовой частотой 4 МГц мы можем получить задержку до 4,19 с, если запишем в них число 16 777 215 = $FFFFFF.
Категория: Изучаем AVR | Добавил: Alex (05.01.2014)
Просмотров: 2287 | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2024