- •Микроконтроллеры семейства mcs-196 методические указания
- •1. Цель работы
- •2. Теоретические сведения
- •2.1. Архитектура семейства mcs-196
- •2.1.1 Центральный процессор (cpu)
- •2.1.2. Периферийные устройства 8xc196kc и 8xc196kd
- •2.2. Прерывания
- •2.2.1. Модификация приоритетов прерываний
- •2.2.2. Подпрограммы обработки прерывания
- •2.3. Регистры специальных функций
- •2.3.1. Карта памяти
- •2.3.2. Специальные функциональные регистры (sfr)
- •2.3.3. Горизонтальные окна
- •VWindow7
- •2.3.4 Вертикальные окна
- •2.4. Порты ввода/вывода
- •2.5. Сервер периферийного обмена (pts)
- •2.6. Система команд и способы адресации
- •2.7. Работа с пакетом pds
- •2.8. Работа с программой pds2com
- •3. Задание на лабораторную работу
- •4. Требования к отчету
- •5. Контрольные вопросы
- •Применение 87c196kc для ввода/вывода и обработки дискретной и аналоговой информации.
- •1 Цель работы
- •2 Теоретические сведения. Описание лабораторного стенда
- •3. Задание и порядок выполнения работы
- •4. Требования к отчету
- •5 Контрольные вопросы
- •Регистр Управления ацп (ad_command) (Адрес 02h,Горизонтальное окно 0 (Запись) Горизонтальное окно 15 (Чтение)).
- •Регистр Результата ацп (ad_result)
2.7. Работа с пакетом pds
Приложение PDS-96 предоставляет функции компилятора, линковщика, а также дебаггера с возможностью просмотра состояния процессора, памяти и периферийных устройств для однокристальных микро ЭВМ серии MCS-96. Оно имеет удобный интерфейс:
все основные команды представлены на панели инструментов (toolbar).
ключевые слова подсвечиваются;
в заголовочных файлах *.inc отождествлены имена SFR (регистры специальных функций ) и их местоположения в памяти, а также объявлены регистры общего назначения AX, AL, AH, BX и т. д.;
состояние каждого периферийного устройства и памяти может быть представлено в отдельном окне;
состояния устройств и памяти можно изменять, нажав на кнопку Modify, находящуюся рядом с заголовком соответствующего окна.
Вид панели инструментов представлен на рисунке ХХХХХ.
Рисунок ХХХХХ :1- (Open project) открыть новый проект; 2- (Make) компилирует и линкует проект при условии, что текст программы был изменён; 3 - (Build ) делает предыдущие операции в любом случае; 4 - (Tools setup) настройка инструментов (далее будет рассмотрена подробно); 5 - (Load program) загружает файл *.mce; 6- (Reload program) аналогично (3); 7- (High-level step) выполняет одну команду Си или Ассемблера; 8 - (High-level step over) выполняет одну команду Си или Ассемблера или вызов функции; 9 - (Run) запуск программы на исполнение; 10 - (Step back) переход на предыдущую команду с восстановлением состояния системы в тот момент; 11- (CPU reset) сброс процессора; 12 - (Low-level step) выполняет одну команду Ассемблера (даже если идёт трассировка СИ); 13 - (Low-level step over) выполняет одну команду Ассемблера или вызов функции;14 - (Add watch) добавить к списку просматриваемых переменных ещё одну; 15 - (Inspect) аналогично (14), но просматриваются также структуры и указатели; 16 - (Redraw screen) обновление экрана; 17 - (Auto-step/Redraw setup) настройка пауз между шагами; 18 - (Script files) Открыть командный файл (используется для эмуляции внешней среды); 19 - (Start programmer) запустить программу интерфейса с программатором
Система построена по принципу автоматического размещения сегментов программы в памяти. Существует понятие областей памяти. Сегменты программы должны быть размещены по областям памяти. По умолчанию созданы области ROM, RAM, UPPER_REGFILE (верхний регистровый файл), default_reg (нижний регистровый файл). Можно удалять текущие и добавлять свои.
Для распределения сегментов по областям нужно воспользоваться кнопкой Tools setup (4) на панели инструментов. Выбрав пункт Address areas, получаем доступ к списку областей адресного пространства. При нажатии кнопки Edit появляется окно, в котором можно изменять параметры области, а также добавлять или удалять имена размещаемых в ней сегментов. С помощью галочки (check box) рядом со строкой Allow code placement можно разрешать или запрещать размещение кода в данной области; можно также выбирать тип памяти, где располагается область (регистры процессора или внешняя память).
Чтобы определить расположение стека и его размер необходимо после нажатия кнопки Tools setup выделить пункт Linker (компоновщик) и нажать Edit. В появившемся окне будет доступна информация о стеке, а также о подключаемых библиотеках (для корректной работы с Ассемблером библиотека Ассемблера должна быть подключена, а Си - нет).
Более подробно остановимся на сегментах. Здесь их может быть два типа: абсолютный (aseg) и перемещаемый (rseg). Абсолютные сегменты имеют жесткое расположение в памяти, заданное пользователем (директива .org), а перемещаемые размещаются компоновщиком без привязки к определённому адресу. При объявлении нужно обязательно указывать расположение (reg или mem).
Итак, объявление сегмента имеет вид (.aseg| .rseg) <имя>, ( reg| mem).
Далее рассмотрим процедуры. Объявление их имеет вид .func <имя>.
Существуют зарезервированные имена процедур. Наиболее важные из них:
?START – с неё всегда начинается выполнение программы аналогично main() в Си;
?INTERRUPT00 - ?INTERRUPT17 – имена процедур обработки прерываний. Таким образом, если произошло прерывание, то осуществляется переход на одну из этих процедур, соответствующую прерыванию. Вектора прерываний настраиваются компилятором автоматически.
Любая процедура должна заканчиваться директивой .endf.
И в заключение рассмотрим важные для нас директивы компилятора:
.include ‘<имя файла>’ . Включает в текст программы содержимое файла;
<имя> .equ <выражение>. Присваивает имени значение выражения;
.public <имя>. Делает имя доступным из других модулей. Описанные выше имена;
?START, ?INTERRUPT00 - ?INTERRUPT17 обязательно должны быть описанными как public;
<имя> .DSx [<выражение>]. Определяет переменную типа x, где х:
x=b – байт
x=w – слово
x=d – двойное слово;
.org <число>. Загружает счётчик команд (PC) указанным числом. Действует в этом виде только для сегментов типа .aseg; для .rseg нужно писать
.org $+<число>, где $ - текущее значение счётчика команд
.align <X>. Выравнивает значение счётчика команд
X=0 – без выравнивания
X=1 – по чётному значению адреса
X=2 – по значению адреса, делящемуся на 4;
необходима при выравнивании контрольного блока PTS;
#.sfa <имя сегмента>, #.sfe< имя сегмента > - возвращают соответственно адрес начала и конца сегмента; #.sfe необходима при загрузке указателя стека (SP);
.end – означает окончание текста программы.
После того, как программа будет успешно набрана и откомпилирована, необходимо сохранить объектный код. По существу, последний является образом внешней памяти и, соответственно, начинается с адреса 2000h. Сохранить код можно в меню File/Save file from CPU memory… , где Вам предложат выбрать адресный диапазон, а также имя файла для сохранения. В качестве стартового адреса, как уже было оговорено, берется 2000h. Что касается длины, то ее можно сразу взять по максимуму – 0800h, именно столько информации помещается в ОЗУ стенда, то есть, конечный адрес равен 27FFh. Тип файла – Binary image. Теперь сохраняем, и можно начать тестирование программы на реальном процессоре.