4. Разработка блок-схем алгоритмов и программы обработки данных
Разработка прикладного программного обеспечения на языке Ассемблере - творческая задача, требующая от программиста отличного знания программистской модели МК-51, состава и формата команд, способов адресации операндов и т.д. Однако существуют формальные правила составления программ, соблюдение которых позволяет даже начинающему разработчику составлять работоспособные программы. Подробно эти правила рассмотрены в [1], согласно которым для получения текста исходной программы необходимо выполнить следующую последовательность действий:
составить подробное описание исходной задачи;
выполнить инженерную интерпретацию задачи, желательно с привлечением того или иного аппарата формализации (сети Петри, графа автомата и т.п.);
разработать блок-схемы алгоритма работы МПС;
разработать детализированные блок-схемы алгоритмов отдельных процедур, выделенных на основе модульного принципа составления программ;
распределить рабочие регистры и память МК-51;
составить текст исходной программы.
Блок-схема алгоритма обработки данных представлена на рисунке 1.
В
соответствии c
блоком 2 алгоритма должна быть произведена
предварительная установка микроконтроллера
(МК-51), т.е. определены начальный адрес
программы, константы, приоритет и
источники прерывания, режим работы
таймера/счетчика Т/С1 и последовательного
порта, и задан вид сигнала прерывания
(по фронту). Блок 3 программы переводит
МК-51 в режим ожидания прихода прерывания.
Внешнее прерывание поступает со входа
.
После прихода прерывания МК-51 читает
байт данных (Date) из порта P1 (блок 4) и
производит его сравнение с константой
(Const) (блок 5). По результатам сравнения
МК-51 либо выводит принятый байт через
последовательный порт (блок 6), либо
формирует на заданной линии порта P3
импульс заданной длительности (блок
7). После этого осуществляется переход
в режим ожидания прихода следующего
прерывания.
Разобьем блок-схему алгоритма на следующие модули:
передача через последовательный порт;
формирование импульса заданной длительности;
начальная установка и обработка прерываний.
Последовательный порт МК-51 может использоваться в качестве универсального асинхронного приемо-передатчика с фиксированной или переменной скоростью последовательного обмена и возможностью дуплексного включения. Скорость последовательного обмена в режимах 1 и 3 определяется по формуле (1):
,
(1)
где
-
значение бита SMOD
регистра PCON;
-
частота синхронизации МК-51;
-
десятичное значение содержимого регистра
TH1.
Для
использования Т/С1 в качестве источника
для задания частот
и
необходимо:
запретить прерывания от Т/С1;
запрограммировать работу Т/С1 в качестве таймера или счетчика, установив при этом для него один из режимов 0, 1 или 2;
запустить Т/С1 на счет.
Обычно для установки скорости передачи данных через последовательный порт таймер Т/С1 включается в режим 2 (режим автозагрузки).
Рассчитаем десятичное значение для получения заданной скорости передачи через последовательный порт.
.
Примем
бит
,
тогда получим
,
отсюда
.
.
Переведем десятичное число в
шестнадцатеричную систему счисления
.
Составим блок-схему алгоритма передачи данных через последовательный порт. Первым делом необходимо остановить Т/С1, после чего загрузить в регистр TH1 число, определяющее скорость передачи через последовательный порт. Далее необходимо в регистрах SCON и TMOD установить режимы работы последовательного порта и Т/С1 соответственно. После всех установок производится запуск Т/С1 на счет и запускается цикл ожидания окончания передачи. Если передача окончена выполняется очистка флага передачи T1. После чего происходит выдача 9 бит данных в последовательный порт.
Блок схема алгоритма передачи через последовательный порт показана на рисунке 5.
Рисунок 5- Блок схема алгоритма передачи через последовательный порт
Для выдачи в порт импульса заданной длительностью установить заданную линию порта P3 в 1. Сформировать импульс заданной длительности можно, используя либо таймер/счетчик, либо регистры РПД. Блок-схема алгоритма формирования временной задержки большой длительности показана на рисунке 6.
Данный алгоритм использует так называемые вложенные циклы. На начальном этапе в регистр R1 загружается число “большого” цикла X (блок 2), а в регистр R2 – число “малого” цикла Y (блок 3). Эти две команды выполняются за один машинный цикл. С помощью блоков 4, 5 подпрограммы содержимое регистра R2 уменьшается до 0 и осуществляется переход к блоку 6 подпрограммы. Этот цикл удобнее организовать с помощью команды DJNZ Rn, rel которая выполняется МК-51 за два машинных цикла. Аналогично организуется и “большой” цикл (блоки 6, 7). Таким образом, длительность временной задержки, формируемой с помощью этого алгоритма, в машинных циклах можно рассчитать по формуле (2):
(2)
Время задержки в секундах рассчитывается по формуле (3):
.
(3)
Рисунок 6 - Блок-схема алгоритма формирования временной задержки
Если задана длительность импульса, формируемого с помощью рассмотренного алгоритма, то необходимо подобрать X и Y так, чтобы выполнялось условие (4):
,
(4)
где
-
заданная длительность импульса
Для того чтобы МК-51 сформировал импульс с точностью плюс/минус 1 цикл в подпрограмму необходимо добавить команду “нет операции” (NOP), число которых можно рассчитать по формуле (5):
.
(5)
Если число команд NOP, необходимых для “подгонки” задержки, получится больше 5, то рекомендуется для этих целей использовать локальный цикл, который вставляется в тело подпрограммы после блока 7.
Рассчитаем количество больших и малых циклов необходимых для формирования задержки указанной длительности.
Так как максимальное количество малых циклов не может превышать FF h или 255, получим:
отсюда
,
.
Так как число циклов не может быть дробным, уменьшим количество малых циклов на 1, т.е. примем Y=254. Получим:
,
отсюда
.
Рассчитаем число пустых операций:
После начальной установки начинается выполнение программы по заданному алгоритму. Вначале в указатель стека загружается адрес вершины стека, затем происходит переход на основную программу.
Программа обработки прерывания производит чтения байта порта P1, содержимое которого пересылается в регистр аккумулятор. Следующим этапом происходит сравнение содержимого аккумулятора и регистра R7, в котором храниться константа. Сравнение выполняется следующим образом: из содержимого аккумулятора вычитается содержимое регистра R7 и если флаг переноса С=0 (Date < Const) выполняется передача информации через последовательный порт, иначе - выдача в порт импульса заданной длительности.
Блок-схема алгоритма начальной установки и прерывания показана на рисунке 7.
Рисунок 7 - Блок-схема алгоритма начальной установки и прерывания
Объединив все модули, получим алгоритм программы обработки данных, который показан на рисунке 8.
Рисунок 8 – Блок-схема алгоритма программы обработки данных
На основе полученного алгоритма составим машинный алгоритм и программу на языке Ассемблер.
Машинный алгоритм показан на рисунке 9.
Рисунок 9 – машинный алгоритм программы обработки данных
Программа обработки данных:
START: CLR A; ОЧИСТКА АККУМУЛЯТОРА
MOV P1, #255; ПОДГОТОВКА ПОРТА P1 НА ВВОД
MOV PSW, #00011000B; УСТАНОВКА БАНКА 3
MOV IP, #00010001B; ВЫСШИЙ ПРИОРИТЕТ INT0
MOV IE, #10000001B; ПРЕРЫВАНИЕ ОТ INT0
CLR TR0; ОСТАНОВ ТАЙМЕРА Т/С0
CLR TR1; ОСТАНОВ ТАЙМЕРА Т/С1
MOV R1, A; ОЧИСТКА РЕГИСТРА - СЧЕТЧИКА
MOV R2, A; ОЧИСТКА РЕГИСТРА - СЧЕТЧИКА
MOV R7, #100; ЗАПИСЬ CONST
WAIT: NOP; ПУСТАЯ ОПЕРАЦИЯ
SJMP WAIT; ОЖИДАНИЕ ПРЕРЫВАНИЯ
MOV A ,P1; ЧТЕНИЕ БАЙТА ДАННЫХ ИЗ P1
SUBB A, R7; СРАВНЕНИЕ БАЙТА С CONST
JNC IMPULS; ПЕРЕХОД, ЕСЛИ МЕНЬШЕ
OUT: CLR TR1; ОСТАНОВ Т/С1
MOV TH1, #F3H; ЗНАЧЕНИЕ ДЛЯ СКОРОСТИ 300 бит/с
MOV SCON, #11011100B; УСТАНОВКА РЕЖИМА 3 ПОРТА
MOV TMOD, #00100000B;УСТАНОВКА РЕЖИМА 2 Т/С1
SETB TR1; ЗАПУСК ТАЙМЕРА
LABEL: JNB T1, LABEL; ОЖИДАНИЕ ОКОНЧАНИЯ ПЕРЕДАЧИ
CLR T1; ОЧИСТКА ФЛАГА ПЕРЕДАЧИ
MOV SBUF, A; ВЫДАЧА ДАННЫХ В ПОРТ
SJMP WAIT; ОЖИДАНИЕ ПРЕРЫВАНИЯ
IMPULS: SETB P3.1; УСТАНОВКА БИТА P3.1
MOV R1, #49; ЗАПИСЬ В R1 X
CIKL2: MOV R2, #254; ЗАПИСЬ В R2 Y
CIKL1: DJNZ R2, CIKL1;
DJNZ R1, CIKL2
CLR P3.1 СБРОС БИТА P3.1
SJMP WAIT;
