Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное_пособие.doc
Скачиваний:
70
Добавлен:
10.11.2019
Размер:
8.13 Mб
Скачать

Ext_l: ldi r17, X ;х – число внутренних циклов

INT_L: DEC R17 ;

BRNE INT_L ; внутренний цикл.

DEC R16 ;

BRNE EXT_L ; внешний цикл.

RET

Сначала выполняется внутренний цикл циклическим уменьшением содержимого регистра R17. При обнулении регистра R17, происходит уменьшение содержимого регистра внешнего цикл R16 на 1. Если его содержимое не равно 0 (команда BRNE , EXT_L), то выполняется переход по метке EXT_L и снова выполняется внутренний цикл.

Если процедура является подпрограммой, то длительность задержки в тактах рассчитывается по формуле:

N = (3*X+3)*Y+7, тактов. (4)

(Число 3 – время выполнения команд BRNE EXT_L и LDI R17, X ).

Из этой формулы могут быть определены значения X и Y.

Максимальная задержка составляет (3*255 + 3)*255+7 = 195847 тактов.

Для получения задержек больших по величине используют циклы двойной, тройной и т.д. вложенности. При использовании циклов двойной вложенности длительность задержки в тактах вычисляется по формуле:

N = [ (3*X+3)*Y+3]*Z + 7. (5)

Пример Рассчитать значение констант X и Y для получения временной задержки равной 103 мкс, если тактовая частота микроконтроллера равна 16мГц.

Время задержки в тактах:

N = tsek*Fтакт = 103*10-6*16*106 = 1648 тактов.

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

Подставляем в формулу значения:

N = (3*X+3)*Y+7; 1648=(3*Х+3)*Y+7, или 1641=(3*Х+3)*Y.

Уменьшаем N на единицу 1640=(3*Х+3)*Y, тогда можно взять Y=10.

Далее: 1640=(3*Х+3)*10. → 164=3*Х+3 → 161=3*Х.

Выбираем ближайшее целое (на два меньшее) 159=3*Х → Х=53.

При таких заменах время задержки не будет равно заданному. Поэтому во внешний цикл необходимо вставить команду NOP, а за пределами циклов вставить две команды NOP, т.е. получится фактически формула

N = (3*X+3+2)*Y+7+1.

Подставив в нее значения Х и Y получим N равное 1648.

Текст подпрограммы для примера:

DELAY: LDI R16, 10 ;Загрузка в R16 константы внешнего цикла

Ext_l: ldi r17, 53 ;Загрузка в r17 константы внутреннего цикла

INT_L: DEC R17 ; Уменьшение на 1 значения в R17

BRNE INT_L ; Если R17 ≠ 0, то переход на команду по метке

;иначе будет выполняться следующ. команда

NOP

DEC R16 ; Уменьшение на 1 значения в R16

BRNE EXT_L ; Если R16 ≠ 0, то переход на команду по метке

;иначе будет выполняться следующ. команда

NOP

NOP

RET

При необходимости уменьшения значения на значительную величину Nд (использование значительного числа команд NOP) рекомендуется вместо команд NOP добавить в подпрограмму задержки одиночный цикл со значением, рассчитанным по формуле: Nд=3X.

Недостатком формирования временных интервалов программным способом является не выполнение требований к основным функциям микроконтроллера: измерение параметров, обработка данных и формирование сигналов управления. В приведенных примерах микроконтроллер выполняет функцию двоичного счетчика.

      1. Формирование временных интервалов с использованием таймера\счетчика

При использовании таймера\счетчика подсчет тактовых (временных) импульсов производится таймером, а в это время программой микроконтроллера будут выполняться его основные функции.

Для формирования временных интервалов удобно применять режим “Сброса по совпадению”. Рассмотрим вариант использования таймера Т0.

Напомним, что в режиме сброса по совпадению значение таймера/счетчика Т0 сравнивается в цифровом компараторе со значением в специальном регистре сравнения OCR0. При равенстве их значений устанавливается флаг прерывания по совпадению OCF0 и может быть вызвана подпрограмма прерывания по совпадению (если эти прерывания разрешены).

Таким образом, от момента включения таймера Т0 до момента совпадения проходит временной интервал, равный произведению значения в регистре совпадения на длительность периода входных импульсов (см. рис.2).

tинт = (OCR0 – 1)* Твх . (6)

При изменении значения в регистре совпадения изменяется величина временного интервала.

На вход таймера Т0 поступают импульсы от тактового генератора через делитель частоты. Коэффициент деления делителя К может принимать одно из значений 1,8,64,256,1024. Таким образом, соотношение между периодом импульсов тактового генератора и периодом импульсов на входе таймера:

Твх = Ттакт * К.

Подставив это соотношение в формулу (6), получим:

tинт = (OCR0 – 1) * Ттакт * К.

Отсюда находится значение, которое необходимо поместить в регистр совпадения OCR0, для получения заданного временного интервала.

OCR0 = tинттакт / К - 1 (8)

Пример Рассчитать значение, которое надо поместить в регистр совпадения для получения временного интервала 320 мксек. Коэффициент деления делителя частоты К = 256. Тактовая частота микроконтроллера Fтакт =16мГц .

Значение периода импульсов тактового генератора:

Ттакт = 1/ Fтакт = 1/16*106 = 2-4*10-6 сек.

Значение регистра совпадения по формуле (8):

OCR0 = tинттакт * К - 1 = 320*10-6/ 2-4*10-6 * 256 - 1= 19.

Для загрузки этого значения используются команды:

LDI R16,19 ;загрузка значения в регистр R16

OUT OCR0,R16 ;содержимое R16 выводится в TCCR0

Максимальное значение временного интервала будет, если коэффициент деления делителя частоты равен 1024 и значение в регистре совпадения равно 255. При значении тактовой частоты 16 мГц:

tинт_мах = Ттакт * К * 256 = 2-4*10-6 * 210 * 28) = 0,01630 сек.

.Include "m16def.inc"

.Org 0

Rjmр Start

.Org 0х26

;Адрес вектора прерывания по ;совпадению Т0

Rjmp timer0_COMP

Start:

ldi r16,4

;Организация cтека ATMega16

Out SPL,r16

;(начало стека- последняя ячейка ОЗУ)

ldi r16,0х5F

out SPH,r16

SEI

;Разрешить все прерывания.

LDI R16,0b00000010

;Разрешить прерывания по совпадению Т0

OUT TIMSK,R16

LDI R16, ...........

;В регистр сравнения загружается байт, ;соответствующий временному интервалу

OUT OCR0,R16

LDI R16,0B00001001

;Разряды 6 и 3 (01) - режим “Сброс по ;совпадению”, мл. разряды 001 – коэфф. ;деления =1 и пуск Т0 (начала времен. ;интервала)

OUT TCCR0,R16

.

.

.

;Работает Т0 и программа

;микроконтроллера

Timer0_COMP:

;Окончание временного интервала (начало ;подпрограммы прерываний)

Для больших временных интервалов можно использовать 16-разрядный таймер Т1.

По директиве ассемблера .Include "m16def.inc" в текст программы включается файл m16def.inc, в котором определены (прописаны) имена регистров ввода-вывода, векторов, битов и др. Благодаря этому в командах можно использовать не адреса регистров ввода-вывода, а их имена.

По директиве .Org 0 следующая за ней команда RJMP Start будет при компиляции помещена в нулевую ячейку программной памяти.

В директиве .Org 0х26 определен адрес вектора прерывания по совпадению таймера Т0. В ячейку $26 помещается команда перехода к подпрограмме обработки прерываний Rjmp timer0_COMP (вектор). Командами ldi r16,4 Out SPL,r16 ldi r16,$5f Оut SPH,r16 организован стек с начальным адресом 45F (адрес старшей ячейки ОЗУ).

Далее следуют команды общего разрешения прерывания, разрешения прерывания по совпадению Т0 и загрузки в регистр сравнения значения, соответствующего длительности временного интервала. После загрузки в регистр управления TCCR0 значения 00001001, таймер Т0 настраивается в режим сброса по совпадению, устанавливается значение коэффициента деления входного делителя и происходит включение таймера. С этого момента таймером производится счет импульсов от тактового генератора и сравнение значения в таймере со значением в регистре совпадения, а программа выполняет заданные функции. При наступлении равенства значений (окончен временной интервал) устанавливается флаг прерывания по совпадению OCF0 и вызывается подпрограмма по метке timer0_COMP, в которой фиксируется окончание временного интервала. При вызове подпрограммы содержимое счетчика команд сохраняется в двух ячейках стека, а в счетчик помещается значение $26. Следовательно, будет считываться из памяти и выполняться команда Rjmp timer0_COMP. Содержимое счетчика команд загружается в стек за 4 такта, а команда перехода выполняется за 2 такта. Таким образом, от момента пуска таймера до входа в подпрограмму проходит время на 6 тактов большее, чем время по значению в регистре совпадения.