Микропроцессоры и микроконтроллеры

 
 
 
«Anybody who comes to you and says he has a perfect language is either naive or a salesman.»
Bjarne Stroustrup
Русский | Українська


Микропроцессоры и микроконтроллеры :: Каналы ввода-вывода на основе МК51 :: Реализация периода дискретности выполнения вычислений

Реализация периода дискретности выполнения вычислений

Алгоритмы управления, сформированные в процессе синтеза цифрового регулятора, в качестве одного из параметров содержит значение периода (периодов) дискретности Т0. Например:

.

Хотя параметр Т0 непосредственно не является коэффициентом алгоритма или измеряемой переменной, его учет и точная программная реализация необходимы, т.к. от этого зависит качество управления.

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

Простейшим способом реализации периода дискретности является вычисление точного времени выполнения действий по вводу, обработке и выводу информации ТВОВ, и времени ожидания ТОЖ = Т0 – ТВОВ. Ожидание можно реализовать в виде фиксированного, заранее рассчитанного количества программных циклов (реализация зависит от тактовой частоты и принципов выполнения команд процессором).

Заполнение периода дискретности работы вычислителя

Рис. 23.2. Заполнение периода дискретности работы вычислителя

Для микроконтроллеров MCS-51 часто используют программные циклы на основе команды DJNZ Rg,метка, причем в регистр Rg загружают нужное число повторений. Выполнение команды занимает два машинных цикла.

При соотношении ТОЖ >> ТВОВ можно организовать простейшую разновидность этого способа. Вся длительность периода дискретности Т0 реализуется в виде циклов ожидания. При этом фактический период дискретности Т0Ф = Т0 + ТВОВ.

В любом случае использовать такой программный подход имеет смысл лишь для простых алгоритмов управления, не содержащих большого количества ветвлений (для таких алгоритмов ТВОВ будет приблизительно одинаковым в соседних периодах, что позволит приблизительно выдерживать реальное время). В ответственных системах реального времени (real-time systems) для реализации периодов дискретности всегда используют таймеры.

Использование таймера с программным ожиданием завершения периода Т0

При использовании таймера в качестве устройства задания интервалов времени (в том числе периодов дискретности) прежде всего нужно оценить реализуемость периода дискретности. Для этого пользуются соотношением

[ T0 / Ti ] < NMAX

где Ti – период импульсов, подсчитываемых таймером (как правило, от ГТИ);

NMAX – максимальное значение в счетных регистрах таймера (конфигурация), зависящее от их разрядности NT : .

Если подобрать конфигурацию (разрядность) таймера не удается, то период T0 реализуют в виде некоторого количества M дискрет времени. Конфигурацию (разрядность) таймера подбирают из соотношения:

[ T0 / (Ti × M)] < NMAX .

Для этого таймер настраивают на реализацию дискреты ТД = T0 / (Ti × M), а отработанное количество дискрет подсчитывают программно. При выполнении М дискрет очередной период Т0 считается реализованным. Момент выполнения одной дискреты ТД определяется сигналом прерывания от таймера.

При программном ожидании завершения периода T0 контроль за прерываниями (т.е. завершениями периода T0 или дискрет ТД) выполняется программно.

Пример Т1. Период T0 полностью реализуется на таймере Т0 (16 бит)

init_T0 equ 00000001b ; Таймер Т0 в конфигурации 16 бит

init_IE equ 0 ; Прерывания запрещены

Nst equ 12000 ; Стартовое число для реализации периода Т0

org 0

main_prog: ; Основная программа

mov TMOD,#init_T0 ; Настройка таймеров и прерываний

mov IE,#init_IE

mov TL0,#Low(Nst) ; Задание стартового числа для таймера Т0

mov TH0,#High(Nst) ;

setb TR0 ; Включение таймера Т0

calc:. . . ; Вычисления по алгоритмам,

. . . ; выполняемые с нужным периодом дискретности

. . .

wt0: jnb TF0,wt0 ; Ожидание завершения периода Т0

clr TF0 ; «Ручное» обнуление флага прерывания TF0

clr TR0 ; Останов таймера Т0

mov TL0,#Low(Nst) ; Задание стартового числа для таймера Т0

mov TH0,#High(Nst) ;

setb TR0 ; Включение таймера Т0

. . . ; Другие действия при завершении периода Т0

jmp calc ; Возврат к началу блока обработки данных

Если использовать таймер Т2, то загрузка стартового числа будет выполняться автоматически в момент переполнения таймера из регистров (RCAP2H, RCAP2L). В обработчике нужно сбрасывать флаг прерывания TF2.

Пример Т2. Период T0 реализуется дискретами ТД на таймере Т2 (16 бит)

init_T2 equ 00000000b ; таймер Т2 в режиме автоперезагрузки

init_IE equ 0 ; прерывания запрещены

Nst equ 56000 ; стартовое число для реализации дискрет Тд

M equ 20 ; отношение Т0 к Тд

DC data 30h ; переменная - счетчик дискрет

org 0

main_prog: ; Основная программа

mov T2CON,#init_T2 ; Настройка таймеров и прерываний

mov IE,#init_IE

mov TL2,#Low(Nst) ; Задание стартового числа для таймера Т2

mov TH2,#High(Nst) ;

mov RCAP2L,#Low(Nst); Задание числа перезагрузки для таймера Т2

mov RCAP2H,#High(Nst)

mov DC,#M ; Начальное значение счетчика дискрет

setb TR2 ; Включение таймера Т2

calc:. . . ; Вычисления по алгоритмам,

. . . ; выполняемые с нужным периодом дискретности

. . .

wtd: jnb TF2,wtd ; Ожидание завершения дискреты Тд

clr TF2 ; «Ручное» обнуление флага прерывания TF2

djnz DC,wtd ; Цикл до отработки (M*Тд) дискрет

mov DC,#M ; Начальное значение счетчика дискрет

. . . ; Другие действия при завершении периода Т0

jmp calc ; Возврат к началу блока обработки данных

Нужно подчеркнуть, что точная отработка периода T0 при его реализации в виде дискрет возможна лишь в случае, если ТВОВ < ТД . Такое ограничение связано с тем, что во время выполнения ввода-вывода информации и ее обработки по алгоритмам контроль состояния таймера (флага прерывания) не производится. Поэтому при ТВОВ > ТД прерывания от таймера, возникшие в течение интервала ТВОВ, просто не будут фиксироваться программой.

Использование таймера с обработкой завершения периода Т0 через прерывание

Этот способ является наиболее эффективным, т.к. позволяет разгрузить процессор от непроизводительного ожидания (что может быть важно в многозадачных системах). Все расчеты для выбора конфигурации и стартового числа таймера остаются такими же, как и для программной обработки завершения периода T0.

Принципиальное отличие состоит в том, что ожидание завершения периода T0 возлагается на аппаратный контроллер прерываний. Соответственно, действия, связанные с окончанием периода дискретности, производятся в подпрограмме обработки прерывания.

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

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

Пример П1. Период T0 полностью реализуется на таймере Т0 (16 бит)

init_T0 equ 00000001b ; Таймер Т0 в конфигурации 16 бит

init_IE equ 10000010b ; Разрешено прерывание от таймера Т0

Nst equ 12000 ; Стартовое число для реализации периода Т0

org 0

jmp main_prog ; Переход на основную программу

org 000Bh ; Вектор прерывания от таймера Т0

jmp handler_T0 ; Переход на обработчик прерывания

org XXXX

main_prog: ; Основная программа

mov TMOD,#init_T0 ; Настройка таймеров и прерываний

mov IE,#init_IE

mov TL0,#Low(Nst) ; Задание стартового числа для таймера Т0

mov TH0,#High(Nst) ;

setb TR0 ; Включение таймера Т0

calc:. . . ; Вычисления по алгоритмам,

. . . ; выполняемые с нужным периодом дискретности

. . .

jmp $ ; Пустой цикл – ожидание завершения периода

handler_T0: ; Обработчик прерывания от таймера Т0

clr TR0

mov TL0,#Low(Nst) ; Запись стартового числа в таймер Т0

mov TH0,#High(Nst) ;

setb TR0

pop ACC ; Удаление из стека старой точки возврата

pop ACC

mov a,#Low(calc) ; Запись в стек новой точки возврата:

push ACC ; сначала младшая часть адреса CALC,

mov a,#High(calc) ; затем старшая часть адреса CALC

push ACC

reti ; Возврат в основную программу

; на начало вычислений

В этом случае так же при использовании таймера Т2 загрузка стартового числа будет выполняться автоматически в момент переполнения таймера из регистров (RCAP2H, RCAP2L). В обработчике нужно сбрасывать флаг прерывания TF2.

Пример П2. Период T0 реализуется дискретами ТД на таймере Т2 (16 бит)

init_T2 equ 00000000b ; Таймер Т2 в режиме автоперезагрузки

init_IE equ 10100000b ; Разрешено прерывание от таймера Т2

Nst equ 56000 ; Стартовое число для реализации дискрет Тд

M equ 20 ; Отношение Т0 к Тд

DC data 30h ; Переменная - счетчик дискрет

org 0

jmp main_prog ; Переход на основную программу

org 002Bh ; Вектор прерывания от таймера Т2

clr TF2 ; Сброс флага прерывания от таймера Т2

jmp handler_T2 ; Переход на обработчик прерывания

org 0040h

main_prog: ; Основная программа

mov T2CON,#init_T2 ; Настройка таймеров и прерываний

mov IE,#init_IE

mov TL2,#Low(Nst) ; Задание стартового числа для таймера Т2

mov TH2,#High(Nst) ;

mov RCAP2L,#Low(Nst); Задание числа перезагрузки для таймера Т2

mov RCAP2H,#High(Nst)

mov DC,#M ; Начальное значение счетчика дискрет

setb TR2 ; Включение таймера Т2

calc:. . . ; Вычисления по алгоритмам,

. . . ; выполняемые с нужным периодом дискретности

. . .

jmp $ ; Пустой цикл – ожидание завершения периода

handler_T2: ; Обработчик прерывания от таймера Т2

djnz DC,out ; Цикл до отработки (M*Тд) дискрет

mov DC,#M ; Начальное значение счетчика дискрет

. . . ; Другие действия при завершении периода Т0

pop ACC ; Удаление из стека старой точки возврата

pop ACC

mov a,#Low(calc) ; Запись в стек новой точки возврата:

push ACC ; сначала младшая часть адреса CALC,

mov a,#High(calc) ; затем старшая часть адреса CALC

push ACC

out: reti ; Возврат в основную программу

; на начало вычислений

В данном примере отметим одну важную особенность. Команда djnz в обработчике прерывания реализует т.н. «распределенный во времени» цикл. Это значит, что пока значение переменной DC не станет равным 0, после проверки сразу выполняется выход из обработчика. Следующий декремент и проверка значения DCбудут выполнены через интервал ТД. Таким образом, тело обработчика и возврат к началу вычислений выполняются один раз на M интервалов ТД. Промежуточные (М – 1) вызовы обработчиков могут приходиться как на выполнение вычислений, так и на фазу ожидания периода (рис. 23.3). Возврат из обработчика при промежуточных вызовах будет выполняться обычным образом – в ту точку программы, откуда производился переход на обработчик.

Рис. 23.3

Принципиальной особенностью программ для систем управления является их циклический характер, т.е. выполнение вычислений производится с периодом Т0 фактически бесконечно (до выключения питания). Поэтому алгоритмы, представленные в виде блок-схем, могут не иметь блока «Конец». Естественно, что в каждом конкретном случае могут осуществляться программные переходы на различные режимы функционирования системы, в том числе на нециклические разовые действия.

Еще один пример – комбинация подхода, основанного на программном контроле за завершением периода дискретности Т0, и подхода на основе обработки прерывания от таймера. Рассматривается случай, когда период Т0 реализуется дискретами ТД. Тогда моменты завершения дискрет ТД, попадающие на фазы ввода информации, обработки данных и вывода информации, будут обрабатываться с помощью прерываний, а остальные, попадающие на фазу ожидания – программным ожиданием. Реализацию удобнее выполнить на основе таймера Т2, чтобы использовать возможность автоперезагрузки в 16-битовой конфигурации.

Пример П3. Комбинированный подход

init_T2 equ 00000000b ; Таймер Т2 в режиме автоперезагрузки

init_IE equ 10100000b ; Разрешено прерывание от таймера Т2

Nst equ 56000 ; Стартовое число для реализации дискрет Тд

M equ 20 ; Отношение Т0 к Тд

DC data 30h ; Переменная - счетчик дискрет

org 0

jmp main_prog ; Переход на основную программу

org 002Bh ; Вектор прерывания от таймера Т2

clr TF2 ; Сброс флага прерывания от таймера Т2

dec DC ; Уменьшение счетчика дискрет

reti ; Возврат в точку прерывания вычислений

org 0040h

main_prog: ; Основная программа

mov T2CON,#init_T2 ; Настройка таймеров и прерываний

mov IE,#init_IE

mov TL2,#Low(Nst) ; Задание стартового числа для таймера Т2

mov TH2,#High(Nst) ;

mov RCAP2L,#Low(Nst); Задание числа перезагрузки для таймера Т2

mov RCAP2H,#High(Nst)

mov DC,#M ; Начальное значение счетчика дискрет

setb TR2 ; Включение таймера Т2

calc: setb ET2 ; Разрешение прерывания от таймера Т2

. . . ; Вычисления по алгоритмам,

. . . ; выполняемые с нужным периодом дискретности

. . .

clr ET2 ; Запрет прерывания от таймера Т2

wtd: jnb TF2,wtd ; Ожидание завершения дискреты Тд

clr TF2 ; «Ручное» обнуление флага прерывания TF2

djnz DC,wtd ; Цикл до отработки (M*Тд) дискрет

mov DC,#M ; Начальное значение счетчика дискрет

. . . ; Другие действия при завершении периода Т0

jmp calc ; Возврат к началу блока обработки данных

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