Разработка прикладного программного обеспечения на языке Ассемблере - творческая задача, требующая от программиста отличного знания программистской модели МК-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.
Рассчитаем количество больших и малых циклов необходимых для формирования задержки указанной длительности.
Так как максимальное количество малых циклов не может превышать FFh или 255, получим:
отсюда , .
Так как число циклов не может быть дробным, уменьшим количество малых циклов на 1, т.е. примем Y=254. Получим:
, отсюда .
Рассчитаем число пустых операций:
После начальной установки начинается выполнение программы по заданному алгоритму. Вначале в указатель стека загружается адрес вершины стека, затем происходит переход на основную программу.
Программа обработки прерывания производит чтения байта порта P1, содержимое которого пересылается в регистр аккумулятор. Следующим этапом происходит сравнение содержимого аккумулятора и регистра R7, в котором храниться константа.Сравнение выполняется следующим образом: из содержимого аккумулятора вычитается содержимое регистра R7 и если флаг переноса С=0 (Date<Const) выполняется передачаинформации через последовательный порт, иначе - выдача в порт импульса заданной длительности.
Блок-схема алгоритма начальной установки и прерывания показана на рисунке 7.
Рисунок 7 - Блок-схема алгоритма начальной установки и прерывания
Объединив все модули, получим алгоритм программы обработки данных, который показан на рисунке 8.
Рисунок 8 – Блок-схема алгоритма программы обработки данных
На основе полученного алгоритма составим машинный алгоритм и программу на языке Ассемблер.
Машинный алгоритм показан на рисунке 9.
Рисунок 9 – машинный алгоритм программы обработки данных
Программа обработки данных:
START: CLRA; ОЧИСТКА АККУМУЛЯТОРА
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; ОЧИСТКА РЕГИСТРА - СЧЕТЧИКА
MOVR7,#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
CLRP3.1 СБРОСБИТАP3.1
SJMPWAIT;
ЛИТЕРАТУРА
1. ГореликА.В., ГореликВ.Ю., ЕрмаковА.Е., ЕрмаковаО.П. Микропроцессорные информационно-управляющие системы железнодорожного транспорта. – М.: МИИТ, 2011. – 230 с.
2. Однокристальные микро-ЭВМ./ Боборыкин А.В., Липовецкий Г.П. и др. М.: МИКАП, 1994. - 400 с.
3. Сташин В.В., Урусов А.В., Мологонцева О.Ф. Проектирование цифровых устройств на однокристальных микроконтроллерах. М.: Энергоатомиздат, 1990. - 224 с.
Приложение. Листинг программы
START:
CLRA
MOVP1, #255
MOV PSW, #00011000B
MOV IP, #00010001B
MOV IE, #10000001B
CLR TR0
CLR TR1
MOV R1, A
MOV R2, A
MOV R7, #100
WAIT:
NOP
SJMP WAIT
MOV A, P1
SUBB A, R7
JNC IMPULS
OUT:
CLR TR1
MOV TH1, #F3H
MOV SCON, #11011100B
MOV TMOD, #00100000B
SETB TR1
LABEL:
JNB T1, LABEL
CLR T1
MOV SBUF, A
SJMP WAIT;
IMPULS:
SETB P3.1
MOV R1, #49
CIKL2:
MOV R2, #254
CIKL1:
DJNZ R2, CIKL1;
DJNZ R1, CIKL2;
CLR P3.1
SJMP WAIT;