программа переведет нас на главное окно с открытым блокнотом в котором мы будем в писывать нашу программу.
2. Ход работы
В нашей первой программе для AVR Studio 4 мы покажем, как можно формировать интервал времени без использования таймеров и отслеживать события без привязки к внешним прерываниям. Программа будет считать в двоичном коде и демонстрировать на светодиодах (LED). После нажатия на кнопку счет остановиться. Для примера мы ограничимся тремя светодиодами, т.е. будем считать до 8.
Сначала собираем экспериментальную установку в программе Proteus 7 Professional (рисунок 1).
Рисунок 1 – Схема в программе Proteus
Далее формируем временной интервал. Нам нужно сформировать задержку долей секунды. Метод без таймера основан на том, что каждая команда в МК выполняется за строго определенное время. В AVR считать время очень просто большинство команд выполняется за один такт, и по этому, например, для формирования интервала в одну секунду при тактовой частоте 4МГц, нам потребуется выполнить какую-нибудь последовательность из четырех миллионов команд. Обычно программисты используют декрементирование какой-либо величины. Предположим, что необходимое число займет три регистра-разряда (это даст максимальную величину 16777215). Схема действия такая последовательно уменьшаем самый младший разряд (назовем его Razr0) на единицу, когда его величина достигнет нуля, уменьшаем на единицу следующий (Razr1) и переходим опять к уменьшению младшего, начиная со значения 255 (это значение загружать не требуется так как при вычитание единицы из нуля результат получается равным 255 автоматом). Кода в свою очередь, величина Razr1 достигнет нуля, уменьшаем на единицу самый старший разряд (Razr2) и так до тех пор, пока все разряды не станут нулями.
Значительно более компактно и предсказуемо будет реализовать алгоритм на основе команды вычитание с учетом переноса. Пример задержки с вычитанием с учетом переноса:
Delay:
Subi Razr0,1
Suci Razr1,0
Suci Razr2,0
Brcc Delay
Команда suci вычитает сразу две величины – то, что записано в самой команде, плюс флаг переноса «с». Если результат предыдущего вычитания устанавливает флаг переноса (что происходит при переходе через ноль, когда из нуля вычитается единица), то команда suci вычтет его значение, равное единице, если нет, то не вычтет ничего.
Итак для того чтобы получить ровно 4 000 000 тактов, нам нужно записать в регистры Razr2-Razr0 число 4 000 000/5 = 800 000 или $0C3500. Это даст интервал в 1с при тактовой частоте 4МГц. В общем случае число N, соответствующее нужному интервалу времени T(c) при тактовой частоте F (Гц), можно получить по формуле:
N = TF/5
Отслеживание состояние вывода (кнопки) удобно командами sbic или sbis (Skip if in I/O register Clear/Set – пропустить следующую команду, если бит в РВВ очищен/установлен) применительно ко второму биту массива PIND. Приведем листинг слежения за состоянием кнопки:
Pincykle: ; цикл отслеживания кнопки
Sbic PIND,2 ; пропустить, если нажата
rjmp Pincykle; вернуться обратно, если не нажата
Таким образом текст нашей программы можно представить как:
; Программа счета нажатия в двоичном коде
.device ATmega8
.include "m8def.inc"
; частота 4 МГц
.def temp = r16 ; рабочая переменная
.def Razr0 = r17 ; разряды задержки
.def Razr1 = r18
.def Razr2 = r19
.def Counter = r20; счетчик
;+++++++++Программа+++++++++++
ldi temp, 0b00000100 ; для вторго разряда порта D
out PORTD, temp ; подтягивающий резистор
ldi temp,0b00000111; порт B на выход
out DDRB, temp
clr Counter ; очищаемсчетчик
Pincykle: ; цикл отслеживания кнопки
sbic PIND,2; пропустить если нажата
rjmp Pincykle ; вернуться обратно если не нажата
; кнопака нажата пауза 0,2с, N = $027100
ldi Razr2, $02
ldi Razr1, $71
ldi Razr0, $00
Pin_release: ; отслеживаем отпускание
sbis PIND,2 ; пропускаем если отпущена
rjmp Pincykle ; вернуться обратно если нажата
inc Counter; если отпущена увеличиваем счетчик
out PORTB, Counter ; выводим счетчик в порт B
; пауза 0,5 c N = $061A80h
ldi Razr2, $06
ldi Razr1,$1A
ldi Razr0,$80
rjmp Pincykle ; вернуться обратно к отслеживанию
ret ; возврат из процедуры
Далее набираем код программы в AVR Studio 4 (рисунок 2).
Рисунок 2 – Текст программы в AVR Studio 4
По окончанию ввода программы компилируем ее нажатием клавиши F7. Видим, что никаких ошибок в коде нет, и программа готова к выполнению. Выполняем программу нажатием клавиш Ctrl+F7. Для прогона программы нажимаем клавиши Alt+F5
Для проверки работоспособности программы проверим ее на собранном стенде в Proteus 7 Professional (рисунок 3).
Рисунок 3 – Загрузка программы в МК
Демонстрация работы программы представлена на рисунках 4-5.
Рисунок 4 - Демонстрация работы программы
Рисунок 5 - Демонстрация работы программы
Счетчик Counter будет считать в «круговую» - при переполнении он опять
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.