- •Проектирование микроконтроллеров
- •Isbn 5-7629-0812-7 сПбГэту «лэти», 2008
- •Список использованных сокращений
- •1.Цели и задачи курсового проектирования. Уточнение задания
- •2.Разработка структурной схемы контроллера Типы разрабатываемых контроллеров-имитаторов
- •2.1.Схемы алгоритмов функционирования контроллеров
- •2.2.Варианты заданий на курсовой расчет
- •2.3.Спецификация входных и выходных сигналов контроллеров
- •2.4.Параметры радионавигационного сигнала
- •2.5.Форматы пакетов управления и пакета «старт»
- •2.6.Упрощенная структурная схема контроллера
- •3.Разработка функциональных блоков контроллера
- •3.1.Блок cpu
- •3.2.Блок памяти
- •3.3.Блок приема пакетов управления
- •3.4.Входные сигналы параллельного интерфейса блока приема управляющих пакетов и пакета «старт»
- •3.5.Последовательный интерфейс для приема пакетов управления
- •3.6. Блок индикации
- •3.7.Электрический расчет драйверов сид-дисплея
- •3.8.Особенности построения сид-индикатора на приборах с оа
- •3.9.Блок формирования временного паттерна
- •3.10.Реализация интерфейса для передачи дельта-импульсов
- •3.11.Табличное представление временного паттерна
- •Другие варианты построения таймера временного паттерна, встречающиеся в курсовом расчете
- •3.12.Селектор адреса
- •4.Уточненная структурная схема контроллера
- •5.Разработка программного обеспечения
- •5.1.Программный модуль курсового расчета
- •5.2.Структура данных модуля
- •5.3.Конструирование программного модуля
- •6.Описание шаблонов программного обеспечения, представленного на cd
- •Последовательность действий для запуска исполняемого модуля программы
- •Варианты управления контроллером
- •6.1.Варианты шаблонов формирования временного паттерна
- •6.2.Варианты шаблона "Динамическая индикация"
- •Список иллюстраций Список таблиц
- •Список литературы
- •Типы схем
- •Проектирование микроконтроллеров
- •197376, С.-Петербург, ул. Проф. Попова, 5.
5.3.Конструирование программного модуля
В этом разделе курсового расчета должны быть представлены разработанные (не входящие в шаблоны) фрагменты программного модуля, ПП преобразования и другие самостоятельно разработанные тексты. При описании этих фрагментов может быть использован обратный порядок: сначала написан программный код, а затем он документирован с использованием схем алгоритма. В качестве примера такой разработки далее приведена ПП преобразования неупакованного BCD-кода в код 7-сегментного СИД-индикатора (предполагается схема индикатора, показанная на рис. 3.14). В программе используется табличное преобразование кодов, но вместо кодов 7-сег-ментного индикатора используются ASCII-коды соответствующих символов, наблюдение которых в окне дампа памяти значительно удобнее. Таблица TABL_DATA содержит исходные BCD-символы, подлежащие выводу на индикацию, и их ASCII эквивалент:
Seg code
TABL_DATA:
DB 00,'0' ; строка преобразования кода 0 в ASCII символ ‘0’
DB 01,'1' ; строка преобразования кода 0 в ASCII символ ‘1’
DB 02,'2' ; строка преобразования кода 0 в ASCII символ ‘2’
…
DB 07,'7' ; строка преобразования кода 0 в ASCII символ ‘7’
; коды основных частот SS,SL,SH,S,L,H
SIMB_S EQU 10H ; символ основной частоты повторения S
SIMB_L EQU 11H ; символ основной частоты повторения L
SIMB_H EQU 12H ; символ основной частоты повторения H
SIMB_G EQU 13H ; символ
DB SIMB_S,'S'; строка преобразования кода в ASCII символ ‘S’
DB SIMB_L,'L'; строка преобразования кода в ASCII символ ‘L’
DB SIMB_H,'H'; строка преобразования кода в ASCII символ ‘H’
DB SIMB_G,'G'; строка преобразования кода в ASCII символ ‘G’
; коды служебных символов
SIMB_? EQU 20H
simb_gash equ 30h ; код гашения индикатора
DB SIMB_?,'?'
DB SIMB_GASH,' ' ;
DB KONEC ; код конца таблицы
Замечание. Конец буфера отмечен специальным символом KONEC, содержимое которого (FFh) не используется в рабочей части таблицы.
Код стробов разрешения индикации представлен табл. TABL_SEG. Он соответствует 5-разрядному индикатору. Дополнительно содержимое таблицы включает установку бита 4 регистра DD4, который сбрасывает триггер DD9.1, формирующий запрос прерывания по входу R5.5.
Seg code
TABL_SEG:
; высветка разряда разрешена логической единицей в соответствующем разряде
; используются биты 0, 1, 2, 3, 4
; дополнительно задается сигнал сброса регистра запроса прерывания
DB 21h,22h,24h,28h,30H
DB KONEC
Содержимое буфера RG_BCD зависит от режима работы контроллера. Для режима mode = 1 буфер заполнен знаками «?» (код 20h). Фрагмент, начинающийся с метки MODE1_INST:, производит загрузку буфера и вызывает ПП преобразования TRANSLATE.
MODE1_INST:
; индикация ожидания пакета управления, mode = 1
MVI B,5 ; счетчик повторения равен числу разрядов
LXI H,RG_BCD ; указатель записи в регистр BCD-кодов
LOOP_IND1:
MVI M,SIMB_? ; запись кода символа ‘?’
INX H ; модификация указателя на следующую позицию
DCR B ; модификация счетчика повторения
JNZ LOOP_IND1 ; проверка на завершение цикла
MVI M,KONEC ; запись в буфер символа KONEC
CALL TRANSLAT ; вызов ПП преобразования BCD в коды 7-сегм.
…
ПП преобразования кодов TRANSLATE читает очередной код из буфера RG_BCD и сравнивает его поочередно с первыми байтами всех строк TABL_DATA. При совпадении кодов из таблицы выбирается последний код в соответствующей строке и записывается в буфер RG_7_SEG. Так продолжается до просмотра всех байтов буфера RG_BCD. В случае достижения конца таблицы TABL_DATA генерируется ошибка формирования кода символа индикации (здесь не разработана). Текст ПП TRANSLATE приведен ниже.
TRANSLAT: ; пп преобразования кодов BCD в коды 7-сегментного инд.
LXI D,RG_7_SEG
PUSH D ; текущий адрес таблицы индикации в стеке
LXI D,RG_BCD
MVI B,5
LOOP_TRANS:
LXI H,TABL_DATA
LOOP_STRING:
LDAX D ; получить код для преобразования
CMP M
JZ FOUND ; вход в таблицу найден
INX H
INX H
MOV A,M
CPI KONEC ; проверка выхода из таблицы
JNZ LOOP_STRING
ERROR: ; генерация ошибки формирования символа индикации
JMP $
FOUND:
INX H ; указатель на выходной код
MOV A,M ; получить выходной код
XTHL ; получить указатель в таблице
MOV M,A
INX H
XTHL ; сохранить новое значение указателя
INX D ; новое значение из буфера rg_7_seg
DCR B
JNZ LOOP_TRANS
LDAX D
XTHL
MOV M,A
POP D ; восстановить состояние стека
RET
Схема алгоритма ПП TRANSLATE представлена на рис. 5.1. ПП использует три указателя косвенной адресации (регистровую пару HL – указатель чтения кодов из таблицы TABL_DATA, регистровую пару DE – указатель чтения из буфера RG_BCD, и регистровую пару, помещенную на вершину стека, – указатель записи в буфер RG_7_SEG (блоки 1…4)). Поиск соответствия текущего кода с первым байтом строки таблицы TABL_DATA производится последовательностью блоков 5…9. При обнаружении совпадения управление передается на метку FOUND, при не обнаружении и достижении конца таблицы – на метку ERROR.
Процесс от метки FOUND (последовательность блоков 11...17) состоит из чтения второго байта в найденной строке таблицы TABL_DATA, подготовке к преобразованию следующего байта (переход к метке LOOP_TRANS) и повторения процесса поиска соответствия следующего прочитанного кода коду таблицы преобразования.
|
Рис. 5.36. Схема алгоритма преобразования неупакованного BCD-кода в код 7-сегментного индикатора |
После выполнения преобразования всех BCD-кодов, заданных счетчиком повторения, производится запись кода KONEC в буфер RG_7_SEG (блок 18), восстановление указателя стека (содержимое регистровой пары не представляет интереса, нужно только переместить SP на адрес возврата) и сам возврат в главную программу.
Обычно ПП TRANSLATE используется только один раз при загрузке буфера RG_BCD новым значением.
