Реализация функций и дискретных автоматов на МК

PAGE 5

Дисциплина «Микроконтроллеры в системах управления», 3-й курс, семестр 6. Модуль 2 – семестр 8

Модуль 2 – Тема 8 Реализация функций и дискретных автоматов на МК

8.1 Особенности реализации табличных функций

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

В дисциплинах, связанных с изучением численных методов (информатика, исследование операций) рассматривается классический метод линейной интерполяции. Согласно нему, значение функции в произвольной точке Х находится на основании значений функции в двух ближайших узлах интерполяции: Хi X Xi+1. Функция задается в виде массива значений аргумента и соответствующих значений функции. Перед вычислением значения функции необходимо найти соответствующий отрезок между узами интерполяции. Применение этого метода требует поисковой процедуры и интерполяционных вычислений.

В некоторых случаях можно существенно упростить интерполяционную процедуру. Предпосылками этого являются:

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

Классическим примером является формирование кодов управления семисегментным индикатором. В этом случае по входному аргументу от 0 до 15 нужно формировать байтовый код для индикатора (7-й бит – сегмент “р”, 6-й бит – сегмент “g”,…, 0-й бит – сегмент “a”). Набор значений аргументов формируется в соответствии с таблицей:

Аргумент
(индекс)

Символ
для
отображения

Результат функции

Сегменты индикатора

HEX-представление
константы

p

g

f

e

d

c

b

a

7

6

5

4

3

2

1

0

0

0

0

0

1

1

1

1

1

1

3F

1

1

0

0

0

0

0

1

1

0

06

2

2

0

1

0

1

1

0

1

1

5B

3

3

0

1

0

0

1

1

1

1

4F

4

4

0

1

1

0

0

1

1

0

66

5

5

0

1

1

0

1

1

0

1

6D

6

6

0

1

1

1

1

1

0

1

7D

7

7

0

0

0

0

0

1

1

1

07

8

8

0

1

1

1

1

1

1

1

7F

9

9

0

1

1

0

1

1

1

1

6F

10

A

0

1

1

1

0

1

1

1

77

11

b

0

1

1

1

1

1

0

0

7C

12

C

0

0

1

1

1

0

0

1

39

13

d

0

1

0

1

1

1

1

0

5E

14

E

0

1

1

1

1

0

0

1

79

15

F

0

1

1

1

0

0

0

1

71

Гашение индикаторов

16

Нет свечения

0

0

0

0

0

0

0

0

00

17

Нет свечения

0

0

0

0

0

0

0

0

00

Другие символы …

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

При реализации такого подхода для MCS-51 удобно воспользоваться командой чтения константы из памяти программ: MOVC A,@A+DPTR. При этом адрес памяти программ, из которого читается константа, будет вычислен как сумма содержимого А и текущего значения регистра DPTR. Т.е. значение DPTR является базовым адресом начала массива. Сам массив значений может располагаться в любом месте памяти программ (до или после подпрограммы определения функции).

mov a,#3 ; задание нужного индекса (начиная с 0)

call F1 ; вызов подпрограммы

. . . ; прочие команды

; таблица значений функции (константы в памяти программ)

table: db 3Fh,06h,5Bh,4Fh,66h,6Dh,07Dh,07h,7Fh,6Fh,77h,7Ch,39h,5Eh,79h,71h

; подпрограмма получения значения функции по аргументу-индексу

F1: mov dptr,#table ; задание адреса таблицы

movc a,@a+dptr ; чтение элемента таблицы в аккумулятор

ret ; возврат из подпрограммы

В результате выполнения приведенного фрагмента подпрограмма F1 вернет в аккумуляторе значение 4Fh (элемент с индексом 3 при нумерации, начиная с 0).

Единственный недостаток данной подпрограммы – необходимо использовать регистр DPTR, который может потребоваться для других целей.

Альтернативный вариант решения – использование относительной адресации в таблице. Этот подход основан на том, что таблица значений функции должна располагаться в памяти программ непосредственно после команды RET, т.е. положение таблицы может быть точно определено относительно определенных операторов внутри подпрограммы (при этом абсолютный адрес таблицы знать не нужно). Чтение элемента таблицы выполняется командой MOVC A,@A+PC. При этом адрес памяти программ, из которого читается константа, будет вычислен как сумма содержимого А и текущего значения регистра PC.

mov a,#3 ; задание нужного индекса (начиная с 0)

call F1 ; вызов подпрограммы

. . . ; прочие команды

; подпрограмма получения значения функции по аргументу-индексу

F1: inc a ; коррекция индекса (учет команды RET)

movc a,@a+pc ; чтение элемента таблицы в аккумулятор

ret ; возврат из подпрограммы

; таблица значений функции должна располагаться в памяти программ

; сразу после подпрограммы F1

table: db 3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h,7Fh,6Fh,77h,7Ch,39h,5Eh,79h,71h

При чтении команды MOVC A,@A+PC из памяти перед ее выполнением в регистре PC формируется адрес следующей команды, т.е. однобайтовой команды RET. Адрес начала таблицы на 1 больше адреса команды RET. Именно это учитывается с помощью команды INC A, которая корректирует заданный индекс (смещение от начала таблицы до нужного элемента). Предложенная подпрограмма не использует никакие дополнительные регистры. Заметим, что значение адреса таблицы явно не используется.

Еще один пример использования указанного подхода – реализация функции sin(x). Пусть аргумент функции изменяется в пределах от 0 до , и, следовательно, значение функции нарастает от 0 до 1, затем уменьшается до 0. Значение аргумента и результат можно представлять в однобайтовом формате. В таком случае аргумент может принимать 256 различных значений, и вес единицы младшего разряда в представлении аргумента составляет (/255). При представлении значений функции будем полагать, что запятая располагается перед старшим разрядом, т.е. значению 0 соответствует двоичный код 00000000, а значению 1 – код 11111111. Набор значений функции может быть получен итерационным расчетом по следующей формуле:

где [ ] – операция получения целой части числа.

Функция получения значения синуса может выглядеть так:

SIN: inc a ; коррекция индекса (учет команды RET)

movc a,@a+pc ; чтение элемента таблицы в аккумулятор

ret ; возврат из подпрограммы

; таблица значений функции – 256 байт

table: db 00h,01h,...,0FEh,0FFh,0FEh,...,01h,00h

Для вызова функции SIN в основной программе нужно записать в аккумулятор значение индекса – т.е. «взвешенное» значение аргумента:

mov a, #arg

call SIN

. . .

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

8.2 Реализация дискретных (конечных) автоматов

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

Дискретные автоматы подразделяют на:

  • автоматы Мура, в которых выходные сигналы Y являются функциями только состояний автомата Q: QH = f1(Q, X), Y = f2(Q); X – входные сигналы;
  • автоматы Мили, в которых выходы зависят непосредственно как от входных сигналов X, так и от состояния автомата: QH = f1(Q, X), Y = f2(Q, X);
  • автономные автоматы, которые не имеют информационных входов Х, а переключаются только под воздействием тактовых импульсов.

Способы физической реализации дискретных автоматов:

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

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

Одним из способов описания работы такого автомата может быть временная диаграмма.

Например, автомат должен циклически формировать набор двоичных сигналов управления A, B, C и D в такой последовательности (рис. 8.1)

Рисунок 8.1 – Исходная временная диаграмма одного цикла работы автомата

Как видно, работа автомата состоит из P = 5 состояний такой продолжительности:
T1 = 7,4с, T2 = 3с, T3 = 2,6с, T4 = 5,8с и T5 = 2с.

Шаг 1. Определяем продолжительность такта времени для работы автомата TD – как наибольший общий делитель всех интервалов времени для отдельных состояний. Получаем TD = 0,2c.

Шаг 2. Определяем общее количество тактов в цикле работы автомата как:

,

где P – количество состояний в цикле работы автомата.

Для нашего примера получаем:

такта.

Шаг 3. Определяем количество и номера тактов для каждого состояния:

Номер
состояния

Ti, с

Количество
тактов
Ni =Ti /TD

Номера
тактов
для состояния

1

7,4

37

1..37

2

3

15

38..52

3

2,6

13

53..65

4

5,8

29

66..94

5

2

10

95..104

Шаг 4. Записываем выходной код автомата (ABCD) для каждого из Р состояний по временной диаграмме. Результаты можно представить в таблице:

Номер
состояния

Номера
тактов

A

B

C

D

1

1..37

1

0

0

1

2

38..52

1

1

0

0

3

53..65

0

1

0

0

4

66..94

0

0

1

1

5

95..104

0

1

1

0

Шаг 5. Для формирования алгоритма работы автомата нужно задать переменную – счетчик тактов К. Через каждый интервал времени TD = 0,2c нужно увеличивать К на 1 и получать значение выходного кода автомата, соответствующее значению К. Счетчик тактов К меняет свои значения от 1 до N, после чего опять принимает значение 1.

Шаг 6. Работу с таблицей выходных кодов автомата удобно реализовать на основе индексного доступа. Для этого можно использовать подход, описанный в разд. 8.1. В данном примере таблица выходных кодов будет содержать N = 104 элемента.

Автор конспекта: Джулгаков В.Г., доцент каф. 301, ХАИ

Реализация функций и дискретных автоматов на МК