Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микроконтроллеры семейства MCS-196.DOC
Скачиваний:
67
Добавлен:
02.05.2014
Размер:
1.09 Mб
Скачать

4. Требования к отчету

Отчет по лабораторной работе должен содержать:

а) исходники проверенных программ;

б) графики и таблицы, полученные в процессе тестирования программ 2,3,4;

в) выводы о проделанной работе.

5 Контрольные вопросы

  1. Объяснить работу лабораторного стенда по функциональной схеме.

  2. Демонстрация работы разработанных программ на стенде.

  3. Объяснить работу PTS в режиме сканирования АЦП.

Список литературы

  1. А.В. Гусев, О.В. Мироненко. Однокристальные микроЭВМ MCS-96. Справочное руководство. Екатеринбург, УГТУ-УПИ.

  2. Phyton Project 96 Demo 2.04.20. “PDS-96”. Manual.

  3. Компьютерные файлы ведущих фирм в Internet.

ПРИЛОЖЕНИЕ B

(справочное)

Общие правила написания программ. Примеры программ. Полезные процедуры

При написании программ важно учитывать, что на самом деле в микроконтроллерах 8XC196KC/KD нет регистров общего назначения. Для удобства программирования они определены и являются просто макроименами для ячеек памяти встроенного ОЗУ. Эти макроимена содержатся в файле tmpreg.inc. А в файле sfrs_kb.inc описаны макроимена для портов и других программных средств микроконтроллера, поэтому эти два файла обязательно должны быть подключены с помощью директивы .INCLUDE ‘имя файла’.

Во всех случаях мы настоятельно рекомендуем использовать следующий формат программы:

.PMODULE <имя модуля>

?CCB_DATA .equ 0FCh ; Байт конфигурации кристалла. Стенд

; поддерживает именно этот режим.

.public ?CCB_DATA

; В этой точке программы удобно расположить операторы присвоения .EQU

.INCLUDE 'sfrs_kb.inc'

.INCLUDE 'tmpreg.inc'

.rseg STACK,mem ; Стек выделяется автоматически при компиляции

.rseg CODE,mem ; Главный кодовый сегмент программы.

.FUNC ?START ; Главная ветвь программы также является функцией.

.PUBLIC ?START ; Метка ?START должна быть доступна извне.

di ; Запрет любых прерываний на время инициализации.

ld AX,#.sfe STACK ; Инициализируем указатель стека

and AX,#0FFFEh ; с четного адреса

ld SP,AX

ldb WSR,#0 ; Устанавливаем нужное вертикальное и

; горизонтальное окна.

ldb INT_MASK,#0 ; Устанавливается младший байт маски

; прерываний,

ldb INT_MASK1,#0 ; а затем старший.

ldb BAUD_RATE,#04dh ; Установка скорости передачи по

; последовательному порту.

ldb BAUD_RATE,#080h ; Величина 0480h соответствует 9600 baud.

ldb IOC1,#21h ; Регистры контроля устройств.

; Устанавливаем TxD, PWM_SEL,

ldb IOC2,#04h ; Slow PWM.

ldb SP_CON,#09h ; Контроль последовательного порта: RxD,

; mode 1 n/rc.

ei ; Теперь прерывания можно разрешить.

……. ; Тут располагается сам код главной ветви программы.

; Внутри главной функции можно также описывать подфункции.

.FUNC func1

……. ; Тело функции 1.

.ENDF

;

.FUNC func2

……. ; Тело функции 2.

.ENDF

.ENDF ; Конец главной функции.

; Описание сегмента переменных. (Должны располагаться в ОЗУ!)

.rseg REGS,reg ; В данном случае в качестве ОЗУ используется

; регистровый файл.

VAR1 .dsb 1 ; Переменная – байт.

VAR2 .dsw 1 ; Переменная – слово.

VAR3 .dsl 1 ; Переменная – длинное слово.

DIM .dsw 10 ; Массив данных длиной в 10 слов.

; Описание постоянных. Могут находится в ПЗУ.

.rseg CONST,mem

TAB1 .dcb 1,2,3,4,5,15,4,32,81 ; Таблица байтов.

TAB2 .dcw 04567h,0FFFFh,0AABBH ; Таблица слов.

STRING .dcb ‘Any string’,0 ; Строка текста.

; Обработчики прерываний.

.rseg CODE

; Прерывание "Unimplemented OpCode". Должно быть обязательно.

.FUNC ?INTERRUPT17

.PUBLIC ?INTERRUPT17

ldb ioport2,#00h ; Выводим условные символы на

ldb ioport1,#01h ; индикаторы в случае встречи

ldb ioport2,#40h ; невыполнимого кода.

ldb ioport1,#01h

ldb ioport2,#80h

ldb ioport1,#01h

di

ljmp $ ; Бесконечный цикл при запрещенных

; прерываниях = зависание.

.ENDF

; Прерывание “Переполнение таймера 1”.

.FUNC ?INTERRUPT02

.PUBLIC ?INTERRUPT02

pusha

……… ; Ваши действия.

popa

ei

ret

.ENDF

.END ; Абсолютный конец программы.

Пример программы

Эта простая программа получает байт данных от IBM PC и сразу отправляет его назад.

.PMODULE SIMPLE

?CCB_DATA .equ 0FCh

.public ?CCB_DATA

.INCLUDE 'sfrs_kb.inc'

.INCLUDE 'tmpreg.inc'

.rseg STACK,mem

.rseg CODE,mem

.FUNC ?START

.PUBLIC ?START

di

ld AX,#.sfe STACK

and AX,#0FFFEh

ld SP,AX

ldb WSR,#0

ldb INT_MASK,#0

ldb INT_MASK1,#0 ; Прерывания не используются.

ldb BAUD_RATE,#04dh ; 9600 бод.

ldb BAUD_RATE,#080h ;

ldb IOC1,#21h ; TxD, PWM_SEL

ldb IOC2,#04h

ldb SP_CON,#09h ; RxD, mode 1 n/rc.

ei

lp: call InRS232C ; Получаем байт в AL.

call OutRS232C ; Отправляем его назад.

ljmp lp ; Зацикливаемся.

; Функция получения байта с RS232C.

.FUNC InRS232C

inr1: ldb al,INT_PEND1 ; Ожидаем установки флага заполнения

andb al,#02h ; буфера приема.

cmpb al,#0

be inr1

ldb al,SBUF ; Считываем принятое значение.

andb INT_PEND1,#0fdh ; Сбрасываем флаг заполнения.

ret ; Выходим.

.ENDF

; Функция передачи байта в RS232C.

.FUNC OutRS232C

push ax ; Сохраняем AX в стеке.

ldb SBUF,al ; Записываем AL в буфер передачи.

ors: ldb al,INT_PEND1 ; Ожидаем установку флага

andb al,#01h

cmpb al,#0 ; опустошения буфера передачи.

be ors

andb INT_PEND1,#0feh ; Сбрасываем флаг опустошения.

pop ax ; Снимаем со стека AX.

ret ; Выходим.

.ENDF

.ENDF

;INTERRUPTS*********************************

.rseg CODE

;Interrupt: "Unimplemented OpCode"

.FUNC ?INTERRUPT17

.PUBLIC ?INTERRUPT17

ldb ioport2,#00h ; В случае ошибки на все индикаторы

; выведутся верхние подчеркивания.

ldb ioport1,#01h

ldb ioport2,#40h

ldb ioport1,#01h

ldb ioport2,#80h

ldb ioport1,#01h

di ; Возможен только сброс.

ljmp $

.ENDF

.END

Полезные процедуры

В дополнение к приведенной выше программе приводим еще несколько полезных процедур:

Вывод символа на индикатор

Вх: AH=0..2 – номер индикатора;

AL=символ в коде семисегментного индикатора.

Вых: нет.

.FUNC SetChar

push ax

andb ah,#03h

shlb ah,#6

ldb IOPORT2,ah

ldb IOPORT1,al

pop ax

ret

.ENDF

Ввод информации с АЦП 0. (Не PTS)

Вх: нет.

Вых: AL=введенный байт.

.FUNC GetADC0Value

push bx

ldb bl,#0 ; Channel=0;

orb bl,#18h ; Start=1; Mode=1 (8 bit);

ldb ad_command,bl ; Запись команды.

nop ; Требуется небольшая задержка.

nop

nop

nop

GA_w:

ld ax,ad_result ; Считываем и проверяем готовность

ldb bl,#8 ; результата оцифровки.

andb bl,al

cmpb bl,#0

bne GA_w ; В цикле до готовности.

ldb al,ah ; Значение будет в AL теперь.

andb INT_PEND,#0fdh ; Сброс готовности АЦП.

pop bx

ret ; Выход.

.ENDF

Таблица ASCII-символов для семисегментного индикатора

В связи с небольшими возможностями семисегментного индикатора к выводу различных символов, кроме стандартных цифр, некоторые символы не могут быть выведены корректно, например, символы “U” и “V” на индикаторе выведутся одинаково. Поэтому возникает некоторая сложность в отображении на индикаторах чего-то еще, кроме цифр. Вашему вниманию предлагается следующая таблица. В ней записан знакогенератор для символов с кодами от 0 до 127. При выводе ASCII-символов в соответствии с этим знакогенератором достигается максимальная (на наш взгляд) различимость символов. Для некоторых букв различаются строчные и прописные варианты.

Convert: .dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

.dcb 0,30h,22h,63h,64h,52h,7ch,1,39h,0fh,63h,70h,0ch,40h,04h,52h

.dcb 3fh,6,5bh,4fh,66h,6dh,7dh,7,7fh,6fh,41h,0dh,61h,41h,43h,53h,67h

.dcb 77h,7ch,39h,5eh,79h,71h,3dh,76h,6,1eh,75h,3ch,37h,54h,3fh

.dcb 73h,67h,50h,6dh,78h,3eh,3eh,7eh,76h,6eh,5bh,39h,64h,0fh,23h,8

.dcb 67h,77h,7ch,58h,5eh,79h,71h,5fh,74h,6,1eh,75h,30h,37h,54h,5ch

.dcb 73h,67h,50h,6dh,78h,1ch,1ch,7eh,76h,6eh,5bh,39h,64h,0fh,23h,8

Если Вы планируете выводить в программе только цифры (0..9,A..F), то вот таблица для этого случая:

DecHex: .dcb 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h

В ней первые 10 значений представляют из себя цифры от 0 до 9, а последние пять – шестнадцатеричные символы (A,b,C,d,E,F).

ПРИЛОЖЕНИЕ C

(справочное)

Регистры 8XC196KC/KD