
- •1.Функциональное описание микроконтроллера i80196kc
- •1.1. Обзор архитектуры
- •1.1.1. Ядро 80xc196kc
- •1.1.1.1. Файловый регистр (Register File)
- •1.1.1.2. Регистровое арифметико-логическое устройство (ралу)
- •1.1.1.4. Контроллер памяти ( Memory Controller)
- •1.1.1.5. Контроллер прерываний и pts (Interrupt Controller)
- •1.2. Параметры синхронизации
- •1.3. Внутренние периферийные устройства
- •1.3.1. Стандартные порты ввода-вывода
- •1.3.2. Последовательный порт ввода-вывода
- •1.3.3. Быстродействующий модуль
- •1.3.4. Аналого-Цифровой Преобразователь (ацп)
- •1.3.5. Широтно-импульсный модулятор (шим)
- •1.3.6. Сторожевой Таймер
- •2.Введение в программирование 8xc196kc
- •2.1. Типы программирования микроконтроллера
- •2.2. Система команд
- •2.3. Типы данных
- •2.4. Способы адресации
- •3. Карта памяти микроконтроллера i80c196kc
- •3.1. Основные разделы памяти
- •3.1.1. Разделы внешней памяти
- •3.1.2. Порты 3 и 4
- •3.1.3. Программная память и Память Специального назначения
- •3.1.3.1. Управление доступом к внутренней или внешней памяти
- •3.1.3.2. Память для программ
- •3.1.3.3. Память специального назначения
- •3.1.4. Регистровый Файл(Register File)
- •3.1.4.1. Указатель Вершины стека (sp)
- •3.1.4.2 Регистры Специальных Функций
- •3.2. Работа через горизонтальное окно
- •3.2.1. Выбор hWindow
- •3.3.1. Выбор vWindow
- •3.3.2. Работа с вертикальными окнами и Способы Адресации
- •4. Прерывания
- •4.1 Обработка Прерывания
- •4.2. Описание работы Контроллера Прерывания
- •4.3. Описание работы Периферийной Станции Транзакций(pts)
- •4.4. Приоритеты Прерывания
- •4.5. Изменение Приоритетов Прерывания
- •4.6. Программы Обработки прерывания
- •4.7. Распознавание Прерываний
- •4.8. Время Ожидания Прерывания
- •4.9. Специальные Прерывания
- •4.9.1. Прерывание по Невыполняемому Коду
- •4.9.2. Прерывание по Ловушке Программного
- •4.9.3. Немаскируемое Прерывание
- •4.10. Программирование Прерываний
- •4.11. Предоставление pts Прерывания
- •4.12. Предоставление Стандартных Прерываний
- •4.13. Выбор Источников Прерывания
- •4.14. Регистры Маскирования Прерываний
- •4.15. Регистры Захвата Прерывания
- •4.16. Pts Прерывания
- •4.16.1. Управляющие Блоки pts
- •4.16.1.1. Регистр ptscount
- •4.16.1.2. Прерывание End-of-pts
- •4.16.1.3. Регистр ptscon
- •4.16.2. Краткий Обзор Режима Одиночной
- •4.16.2.1. Пример Режима Одиночной Передачи
- •4.16.3. Краткий Обзор Режима Поблочной
- •4.16.3.1. Пример Режима Поблочной Пересылки
- •4.16.4. Краткий Обзор Режима Сканирования
- •4.16.4.1. Pts Циклы в Режиме Сканирования ацп
- •11Eh ad_result для ach0
- •102H ad_result для acHx
- •100H ad_command для acHx
- •4.16.5. Hsi. Краткий Обзор Режима
- •4.16.5.1. Пример Режима hsi
- •4.16.6. Hso. Краткий Обзор Режима
- •4.16.6.1. Пример Режима hso
- •6. Парраллельные порты ввода - вывода
- •6.1. Краткий Функциональный Обзор
- •6.2.Контакты Порта Ввода
- •6.3. Контакты Порта Вывода
- •6.4. Контакты квази-двунаправленного порта
- •6.5 Контакты Двунаправленного Порта с открытым стоком
- •6.6.Программирование Портов ввода-вывода
- •6.7.Организация Портов Ввода
- •6.7.1. Порт 0
- •6.8. Организация Портов Вывода
- •6.9. Порт 1
- •6.10. Порт 2
- •6.11. Доступ к Порту 3 и Порту 4
- •6.11.1. Порт 3 и Порт 4
- •6.12. Особенности работы с квази - двунаправленными портами
6.7.Организация Портов Ввода
Чтение порта ввода-вывода сначала производит выборку значения контакта порта, а затем оно сохраняется в буфере чтения. Поскольку каждое чтение порта производит выборку нового значения, то для хранения считанного значения необходимо использовать временную ячейку памяти.
Например, следующая операция читает текущее значение Порта 1 и сохраняет значение в ячейке памяти, помеченной P1TEMP:
LDB P1TEMP, ioport1 ; Читать P1 и запомнить в P1TEMP
Некоторые контакты Порта 2 сконфигурированы только для вывода и не содержат никакой схемы для ввода. После чтения порта, каждый бит SFR, отражающий состояние контакта “только для вывода”, должен быть замаскирован до использования этого регистра.
При использовании контакта квази - двунаправленного порта для ввода, сначала необходимо гарантировать отключение сильного низкого драйвера. Этому способствует запись единицы в требуемый контакт порта. Например, код, показанный ниже, конфигурирует использование для ввода младшей половины Порта 1.
LDB IOPORT1,#00001111B ;Записать 1 во входные кон- ;такты Порта 1
6.7.1. Порт 0
Аббревиатура - IOPORT0
Адрес 0EH
Только чтение из окна Hwindow0
Порт 0 - порт только для ввода. Контакты Порта 0 отличаются тем,что они могут быть использованы и как цифровые входы(Input Pin P0.x) и как аналоговые входы для АЦП(Analog Channel;ACHx) одновременно(но это не рекомендуется).
Контакт P0.7 может быть также сконфигурирован как вход внешнего прерывания.
В любом случае, если Порт 0 должен использоваться как аналоговый или цифровой вход, необходимо обеспечить напряжение на этом порту через VREF и ANGND контакты.
Aналого-Цифровой Преобразователь чувствителен к шуму, а одним из источников возникновения шума в преобразователе, является чтение Порта 0, поэтому строго рекомендуется не производить чтение из порта, пока не закончится операция А/Ц преобразования.
Порт 0 был разработан так, что защелка выборки не синхронизируется(нет сигнала CLK), если не выполняется чтение порта.
6.8. Организация Портов Вывода
Запись в порт ввода-вывода устанавливает или очищает соответствующую защелку порта. Выход защелки порта затем используется драйвером вывода. Операция записи воздействует на контакты “только для вывода” или на двунаправленные
( квази - двунаправленные или с открытым стоком ) контакты. Запись в контакты “только для ввода” не выполняет никакой операции ( то есть, никакая защелка не устанавливается и не сбрасывается ).
Существует несколько способов записи в порт ввода-вывода. Порт может быть записан непосредственно, используя следующие команды:
; Установить биты 0 и 7, очистить биты 1-6
LDB ioport1,#10000001B
; Или
LDB intrega,# 81H ; Значение, которое нужно записать
STB intrega, ioport1 ; Вывод значения в порт
Обычно, порт непосредственно записывается только при инициализации или когда должны измениться сразу все контакты порта.
Более часто, должен устанавливаться, очищаться или переключаться только один контакт. Для того, чтобы выполнить однобитные операции, на значении порта выполняется операция “чтение-модификация-запись”(read-modify-write), следующим образом:
LDB AL, ioport1 ; Читать текущее значение порта
ORB AL, #10000001B ; Установить биты 0,7 без
; воздействия на биты 1-6
LDB ioport1, AL ; Записать новое значение порта
Такая же операция может быть выполнена одной командой:
ORB ioport1,#10000001B ;Читает ioport1, изменяет его
; Записывает ioport1 обратно
Следующая операция может быть использована для дополнения значения контактька порта:
XORB ioport1,#1000000B ; Дополнение P1.7
Во всех описанных операциях, значение порта читается, изменяется, и затем записывается обратно.
Однако, следует помнить о ситуациях ,в которых выполнение
описанных операций “чтение-модификация-запись” приведет к неопределенным ситуациям. Например,
- чтение контактов порта 2 , предназначенных “только для вывода”;
- обнуление квази-двунаправленных контактов порта 1, предназначенных для ввода
Для решения таких проблем , в память копируется содержимое порта, и операция ( установка, очистка, инвертирование ), выполняется на этом образе в памяти, который затем непосредственно записывается в порт.
Например, следующая операция используется для инвертирования P1.7
XORB P1IMAGE, #10000000B
LDB ioport1, P1IMAGE ; Записать новое значение в Порт 1
Существуют другие способы избежать проблемы, например убедиться, что OR операция содержит единицы для любых двунаправленных контактов, используемых для ввода.
Однако, важно помнить, что смешивание входов и выходов на одном порту требует особого внимания при изменении значения выхода.