- •Эрни Каспер Программирование на языке Ассемблера для микроконтроллеров семейства i8051
- •1.Что нужно знать программисту о микроконтроллерах семейства i8051
- •1.1.Общие сведения об архитектуре i8051
- •1.2.Правила записи команд микроконтроллера семейства i8051 на Ассемблере
- •1.3.Форматы и способы адресации данных
- •1.4.Форматы и способы адресации команд
- •1.5.Команды пересылки информации
- •1.6.Команды поразрядной обработки информации
- •1.7.Команды арифметических операций
- •1.8.Управляющие команды
- •2.Директивы ассемблера для микроконтроллеров семейства i8051
- •2.1.Общие понятия о процессах трансляции и компоновки
- •2.2.Обработка имен транслятором и компоновщиком
- •2.3.Директивы резервирования памяти и инициализации данных
- •2.4.Использование выражений в операндах
- •2.5.Директивы условной трансляции
- •2.6.Директивы подстановок
- •2.7.Директивы управления вводом и выводом
- •Глава 3.
- •3.Кросс-средства фирмы 2500 a.D. Software, Inc. Для семейства i8051
- •Глава 4
- •4.Программирование арифметических действий
- •4.1.Кодирование информации в микроконтроллере
- •4.2.Арифметические действия с большими числами
- •4.3.Арифметические действия с отрицательными числами
- •4.4.Контроль точности при программировании арифметических операций
- •Глава 5
- •5.Программирование вычисления функций
- •5.1.Возведение в квадрат и извлечение квадратного корня
- •5.2.Переход от десятичной системы счисления к двоичной и обратно
- •5.3.Вычисление функций при помощи таблиц
- •5.4.Вычисление обратной функции по таблице прямой функции
- •5.5.Компенсация систематических погрешностей при помощи таблиц
- •Глава 6
- •6.Программирование фильтрации сигналов
- •6.1.Особенности цифровой фильтрации сигналов
- •6.2.Программирование простейших фильтров нижних частот
- •6.3.Программирование фильтра для оценки параметров сигнала
- •6.4.Программирование медианного фильтра
- •Глава 7
- •7.Программирование взаимодействия с внешними устройствами
- •7.1.Общие вопросы взаимодействия
- •7.2.Порядок выполнения прерываний в микроконтроллерах семейства i8051.
- •7.3.Синхронизация работы программы внешним или внутренним сигналом
- •7.4.Программирование приема информации от датчиков
- •7.5.Программирование выдачи команд на исполнительные устройства
- •7.6.Программирование ввода и вывода информации для пользователя
- •8.Несколько рекомендаций о стиле программирования
- •8.1.Стиль программирования и использование ресурсов
- •8.2.Оформление исходного текста программы
- •8.3.Системы обозначений, выражения и простые подстановки
- •8.4.Применение подпрограмм и сложных текстовых подстановок
6.3.Программирование фильтра для оценки параметров сигнала
В случае обработки измерений бывает необходимо получить оценку параметров сигнала и вычислить некоторую величину, характеризующую достоверность этой оценки. Рассмотрим простейший фильтр для оценки значения медленно изменяющегося сигнала. Если шум распределен по нормальному закону, то оптимальной оценкой сигнала является его среднее значение на некотором интервале времени. Предполагается, что изменение значения сигнала в течение этого интервала времени достаточно мало по сравнению с допустимой погрешностью оценки. В качестве критерия достоверности оценки воспользуемся суммой квадратов разностей между значениями выборок сигнала и его оценкой.
Чтобы вычислить оценку сигнала и величину, используемую для оценки достоверности, нужно хранить необходимое количество последних выборок сигнала в линии задержки. С этой целью резервируется массив ячеек в ОЗУ, называемый буфером. Для уменьшения размера программы и увеличения ее быстродействия в качестве линии задержки целесообразно использовать следующий порядок записи в массив. В первый раз входной сигнал записывается в начало массива. При каждом последующем обращении к программе фильтрации входной сигнал записывается в следующие ячейки массива до тех пор, пока не будет достигнута верхняя граница массива. После этого запись снова производится в начало массива. Таким образом новый сигнал всегда записывается вместо самого старого, а в буфере всегда находится некоторое заранее заданное количество предыдущих сигналов. При таком способе записи буфер называется кольцевым. Адрес для записи в кольцевой буфер должен сохраняться в отдельной ячейке ОЗУ и изменяться программой фильтрации.
Рассмотрим пример с усреднением по 8 выборкам сигнала, представленным в двухбайтовом формате целыми положительными числами со значениями не более 2000h. Резервирование памяти для кольцевого буфера и для указателя производится директивами .RSECT
buf: DS 16
pbuf: DS 1
В начале каждого обращения к программе фильтрации нужно записать в фильтр новую выборку на место самой старой. Для этого нужно вычислить новое значение указателя и с помощью косвенной адресации записать в буфер новое значение сигнала. В приведенном примере считается, что в буфере младший байт предшествует старшему, а значение сигнала перед обращением к программе фильтрации было записано в регистры Rl, RO.
INC pbuf ;приращение указателя
ANL pbuf, #07h ; ограничение приращения
MOV A, pbuf ; для формирования адреса
RL А ; учет двухбайтового формата
ADD A, #buf ; формирование адреса в буфере
ХСН A, R0 ; загрузка адреса в регистр
MOV @R0, А ; запись мл. байта в буфер
INC R0 ; адрес для ст. байта
MOV A, R1
MOV @R0, А ; запись ст. байта в буфер
После обновления буфера можно суммировать все хранящихся в нем значения сигналов:
CLR А ; для накопления мл. байтов
MOV В, А ; для накопления ст. байтов
MOV R1, #8 ; для счета количества циклов
MOV R0, #buf ; для чтения из буфера
acum: ADD A, @R0 ; накопление мл. байтов
ХСН А, В
INC R0
ADDC A, @R0 ; накопление ст. байтов
ХСН А, В
INC R0
DJNZ Rl, acum ; на следующий цикл
MOV R2, А ; запоминание мл. байта суммы
ХСН А, В
MOV R3, А ; запоминание ст. байта суммы
Полученная сумма может использоваться в качестве оценки сигнала с наибольшим количеством значащих цифр, а для вычисления суммы квадратов нужно вычислить среднее значение сигнала делением полученной оценки на 8. Это можно сделать посредством трех сдвигов вправо находящейся в накопителе и регистре В суммы, а затем вычислить сумму квадратов отклонений выборок сигнала.
CLR С
RRC А
ХСН А, В
ADD A, #4 ; округление перед делением
ANL A, #F8h ; очистка лишних разрядов
RRC А ; сумма разделена на 2
ХСН А, В
RRC A
ХСН А, В
RRC А ; сумма разделена на 4
ХСН А, В
RRC A
ХСН А, В
RRC А ; сумма разделена на 8
MOV R4, А ; мл. байт среднего значения
MOV R5, В ; ст. байт среднего значения
Программу вычисления суммы квадратов следует завершить досрочно по большому отклонению одной из выборок или по большой сумме квадратов.
MOV R6, #0 ; для накопления суммы квадратов
MOV R0, #buf ; адрес начала буфера
MOV R1, #8 ; количество данных в буфере
rms: CLR С ; для вычитания
MOV A, @R0 ; чтение мл. байта
SUBB A, R4 ; мл. байт разности
MOV В, А ; для возведения в квадрат
INC R0 ; адрес ст. байта
MOV A, @R0 ; чтение ст. байта
INC R0 ; адрес следующего сигнала
SUBB A, R5 ; ст. байт разности
JNC nmi ; переход по положительной разности
XRL В, #FFh ; для вычисления модуля
CPL А ; для вычисления модуля
ХСН А, В
ADD A, #1 ; модуль мл. байта
ХСН А, В
ADDC А, #0 ; модуль ст. байта
nmi: JNZ bad ; переход по разности больше 255
MOV А, В ; для возведения в квадрат
MUL АВ ; квадрат разности
JB 0V, bad ; переход по квадрату больше 256
ADD A, R6 ; сумма квадратов разности
JC bad ; переход по большой сумме квадратов
DJNZ Rl, rms ; на следующий цикл
SJMP ех ; на продолжение вычислений
bad: MOV R6, #255 ; насыщение суммы квадратов
ex: NOP ; для записи метки
В данном случае для накопления суммы квадратов используется только один байт, так как приемлемыми считаются серии измерений с малыми отклонениями. Поэтому при выходе отклонения одной выборки за пределы 15 или при заведомом выходе суммы за пределы 255 программа выходит из цикла и заносит в ячейку с оценкой суммы квадратов максимальное однобайтовое число.
Оценка суммы квадратов отклонений может увеличиваться не только из-за влияния шума. При скачкообразном изменении сигнала его оценка изменяется линейно за время, равное длительности накопления. Во время переходного процесса сумма квадратов отклонений сначала увеличивается, а затем уменьшается до уровня, зависящего от шума. Если сумма квадратов отклонений превышает заранее заданный порог, то для дальнейшей обработки используется старая оценка сигнала. Если сумма квадратов находится в заданных пределах, то используемая для дальнейшей обработки оценка сигнала обновляется.
Интересно сравнить этот алгоритм фильтрации с простым накоплением значения входного сигнала в течение 8 тактов. Приведенной программе для получения первоначальной оценки требуется 8 тактов, а затем оценка выдается каждый такт с запаздыванием 8 тактов. При простом накоплении оценка будет выдаваться только один раз за 8 тактов с тем же запаздыванием. Но при этом нет необходимости запоминания всех значений сигналов. Даже если нужно вычислить сумму квадратов отклонений, то для этого достаточно накопить сумму квадратов значений сигнала. Для накопления суммы квадратов выборок и последующего вычисления суммы квадратов отклонений необходимо работать с промежуточными результатами в форматах до 5 байт.
