- •Микроконтроллеры семейства 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)
4. Требования к отчету
Отчет по лабораторной работе должен содержать:
а) исходники проверенных программ;
б) графики и таблицы, полученные в процессе тестирования программ 2,3,4;
в) выводы о проделанной работе.
5 Контрольные вопросы
Объяснить работу лабораторного стенда по функциональной схеме.
Демонстрация работы разработанных программ на стенде.
Объяснить работу PTS в режиме сканирования АЦП.
Список литературы
А.В. Гусев, О.В. Мироненко. Однокристальные микроЭВМ MCS-96. Справочное руководство. Екатеринбург, УГТУ-УПИ.
Phyton Project 96 Demo 2.04.20. “PDS-96”. Manual.
Компьютерные файлы ведущих фирм в 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