| Главная страница | | Архитектура микроЭВМ | | Принципы обмена данными | | Лабораторные работы | | Примеры систем | | Программно-логическая модель | | Справочная информация |
 
Однокристальная микроЭВМ МК51 Принципы обмена данными

Общая схема взаимодействия ЭВМ с объектом управления
Элементы интерфейса с внешними устройствами
Программная реализация функций управления
Принципы ввода аналоговых сигналов

   ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ФУНКЦИЙ УПРАВЛЕНИЯ

    В процессе обмена с внешними устройствами (независимо от источника инициализации обмена) микроЭВМ реализует одну или несколько вполне определенных функций управления, суть которых сводится к следующему:
     - параллельный опрос потенциальных сигналов;
     - анализ состояния слова и переход в зависимости от его состояния;
     - ожидание события;
     - опрос двоичного датчика;
     - опрос двоичного датчика и переход в зависимости от его состояния;
     - ожидание события;
     - ожидание импульсного сигнала;
     - параллельный вывод двоичных сигналов;
     - выдача отдельного двоичного сигнала;
     - формирование управляющего сигнала;
     - формирование временной задержки;
     - формирование последовательности сигналов;
     - определение временного интервала;
     - преобразование сигналов.

   ПАРАЛЛЕЛЬНЫЙ ОПРОС ПОТЕНЦИАЛЬНЫХ СИГНАЛОВ

    Если состояние потенциальных выходных сигналов внешних устройств, подключенных к разрядам порта микроЭВМ, не изменяется (сигналы статичные), то чтение состояния порта (например, P2) c записью в аккумулятор или регистр (например, R4) командой
    MOV A,P2
    или
    MOV R4,P2
позволяет получить точное значение потенциальных сигналов. Если количество опрашиваемых сигналов меньше восьми, нужные разряды затем выделяются маскированием аккумулятора или регистра.
    Естественно, что разряды порта должны быть настроены на ввод данных - в регистре-защелке порта должны находиться "1".
    Самым ответственным моментом является момент изменения состояния сигналов, так как момент чтения может совпасть с моментом их изменения. Для точного восприятия нового значения необходимо программным образом несколько раз считывать данные с портов микроЭВМ или же использовать источники сигналов, где имеется синхроимпульс, появление которого свидетельствует об изменении потенциальных сигналов (импульс формируется уже после момента изменения). В этом случае опрос потенциальных сигналов выполняется после процедуры ожидания импульса.

    Если источниками сигналов являются механические контакты, то при изменении их состояния возникает так называемый "дребезг" контактов. Наибольшее распространение получили два программных способа ожидания установившегося значения таких сигналов:
    - подсчет заданного числа совпадающих значений сигнала;
    - временная задержка опроса изменившегося состояния сигнала.
    Оба этих метода требуют экспериментального подбора числа совпадений или величины задержки. Поэтому для вариантов заданий, выполняемых студентами кафедры, рекомендуется использовать источники сигналов с аппаратной реализацией подавления "дребезга".

"Дребезг" контактов

   АНАЛИЗ СОСТОЯНИЯ СЛОВА

    В ряде случаев микроЭВМ требуется выполнить параллельный опрос группы автономных (логически независимых) или взаимосвязанных (формирующих двоичный код) потенциальных сигналов и передать управление отдельным фрагментам программы в зависимости от принятого кода.
    Передачу управления удобно осуществлять по таблице переходов. Для случая, когда требуется передача управления одной из восьми программ, расположенным в памяти по адресам PROG0, PROG1, ..., PROG7, в зависимости от кодовой комбинации, считываемой со входов P1.2-P1.0, программа анализа может иметь вид:
GO:    MOV DPTR, #BASE  ; загрузка в указатель данных 16-разрядного начального адреса
 ; таблицы переходов
           MOV A, P1  ; ввод байта
           ANL A, #00000111B  ; выделение младших разрядов - формирование смещения адреса
 ; строки в таблице переходов
           JMPP @A+DPTR  ; передача управления
BASE: LJMP PROG0  ; таблица переходов
           ...
           LJMP PROG7
    Адрес строки таблицы, в которой хранятся адреса переходов, вычисляется как сумма начального адреса таблицы BASE и принятого трехразрядного кода.

    Иногда необходимо осуществлять передачу управления в зависимости от соотношения принятого кода (например, 8-разрядного кода на входах порта P2) и некоторой заранее определенной константы (CONST). Передача при совпадении управления программе с меткой L1, а в противном случае - программе с меткой L2, реализуется следующим образом:
       MOV A, #CONST  ; загрузка константы
       CJNE A,P2,L1  ; сравнение и передача управления
L2: ...

   ОЖИДАНИЕ СОБЫТИЯ

    Если некоторое событие заключается в появлении заданной кодовой комбинации (CODE) на входах порта микроЭВМ (например, P0), то программная реализация процедуры ожидания события может иметь вид:
             MOV A, #CODE  ; загрузка в аккумулятор эталонного кода
WAIT: CJNE A,P1,WAIT  ; если кодовая комбинация на входах порта P0 не совпала
 ; с эталонным значением, то ждать
EXIT: ... ; выход из процедуры
    Задержка реакции программы на событие равна времени выполнения команды сравнения - два машинных цикла.

   ОПРОС ДВОИЧНОГО ДАТЧИКА

    Во внешних устройствах -системах управления объектами события в объекте управления в основном фиксируются с использованием разнообразных двоичных датчиков типа да/нет, например, тумблеров, выключателей, контактов реле, которые подключаются к разрядам портов микроЭВМ через различные формирователи уровней.
    Для опроса - ввода состояния статичного двоичного датчика следует использовать битовые команды передачи адресуемого разряда в разряд переноса (С) с последующим перемещением в одну из ячеек битовой памяти или в разряд одного из регистров, допускающих побитовую адресацию. Например, при подключении датчика к входу P1.0 опрос его состояния выполняется командой:
    MOV C,P1.0

Источники сигналов

Формирование
уровней

   ОПРОС ДВОИЧНОГО ДАТЧИКА И ВЫПОЛНЕНИЕ ПЕРЕХОДА

    Опрос состояния двоичного датчика (например, подключенного ко входу P2.4), его анализ и передача управления отдельным фрагментам программы в зависимости от значения разряда (например, переход на программу с меткой L1 при единичном значении и на программу с меткой L2 при нулевом значении) может быть реализован следующими командами:
       JB P2.4, L1  ; Опрос разряда и переход на метку L1 при единичном значении
 ; в противном случае переход на следующую команду
L2: ...
       ...
L1: ...

Опрос датчика
и переход

   ОЖИДАНИЕ СОБЫТИЯ

    Применительно к двоичному датчику событие заключается в появлении статичного сигнала "1" или "0" на выходе датчика. Ожидание появления "1" на входе адресуемого разряда порта микроЭВМ (например, P0.3) реализуется командой проверки бита
    WAIT1: JNB P0.3,WAIT1
ожидание появления "0" - командой
    WAIT0: JB P0.3,WAIT0
При наступлении события управление передается следующей команде программы. Задержка реакции программы на событие равна времени выполнения команд проверки битов - два машинных цикла.

Ожидание события

   ОЖИДАНИЕ ИМПУЛЬСНОГО СИГНАЛА

    Ожидание импульсного сигнала предполагает, что микроЭВМ должна обнаружить не только факт появления, но и факт окончания сигнала. Для программной реализации этой процедуры можно смонтировать последовательно в линейную программу процедуры ожидания событий, причем последовательность процедур зависит от формы импульса. Для случая "положительного" импульса сначала должно следовать ожидание появления "1", затем - ожидание "0", для "отрицательного" (инверсного) импульса очередность обратная.
    Импульсы длительностью меньше времени выполнения цикла ожидания - 2 машинных цикла могут быть «не замечены» микроЭВМ.
    Для реакции на "положительный" импульс можно использовать режим прерывания. Входной сигнал подается на вход INT0 или INT1. Вид прерывания настраивается как прерывание по фронту 1/0. Таким образом преход на программу обработки прерывания произойдет после окончания импульса, длительность которого не должна быть меньше одного машинного цикла.

   ПАРАЛЛЕЛЬНЫЙ ВЫВОД ДВОИЧНЫХ СИГНАЛОВ

    Выдача в порт микроЭВМ 8-разрядного двоичного кода, являющегося результатом вычислений, производится обычной командой пересылки байта в порт.
    Часто требуется выдавать параллельно в порт количество разрядов, меньшее восьми, состояние остальных разрядов порта при этом изменяться не должно. Для этого необходимо сформировать выходной код в аккумуляторе, так, чтобы в неиспользуемых разрядах были записаны "0", и затем (например, для вывода в порт P1) выполнить команду
    ORL P1,A
    Эта команда относится к классу команд, работающих в режиме "Чтение - модификация - запись", где операндом и регистром назначения является порт. Они считывают информацию из регистра-защелки порта, модифицируют это значение и записывают результат обратно в защелку.
    Если необходимо в определенные разряды порта выдавать заранее известные константы, то удобно пользоваться командами этого класса, содержащими непосредственные операнды.
    Команда ORL используется в этом случае для установки в "1" тех разрядов порта, которым соответствуют "1" в разрядах непосредственного опреранда. Так, команда
    ORL P1,#00001111B
устанавливает в "1" разряды 0-3 порта Р1.
    Команда ANL используется для сброса в "0" тех разрядов порта, которые в операнде заданы нулем.
    Команда XRL инвертирует значения разрядов порта, соответствующих "1" в операнде.

   ВЫДАЧА ОТДЕЛЬНОГО БИТА

    Данная функция подразумевает установку статичного значения на выходе отдельного разряда порта микроЭВМ (например, P1.0). При этом разряд может быть либо установлен в заранее известное определенное состояние ("1" или "0"), либо этому разряду должно быть присвоено значения, получаемое в результате выполнения программы.
    В первом случае проще всего использовать битовые команды установки адресуемого разряда в "1":
    SETB P1.0
    и установки в "0":
    CLR P1.0.
    Команды выполняются за один машинный цикл.
    Во втором случае значение выходного разряда программой должно быть сформировано в разряде флага переноса (С) и затем присвоено адресуемому разряду порта командой
    MOV P1.0,C.
    Команда выполняется за 2 машинных цикла.

   ФОРМИРОВАНИЕ УПРАВЛЯЮЩЕГО СИГНАЛА

    Для формирования импульсного управляющего сигнала на выходе адресуемого разряда порта в общем случае необходимо выполнить следующую последовательность действий:
    - в программе инициализации микроЭВМ установить пассивное значение сигнала на выходе порта ("0" для прямого импульсного сигнала, "1" - для инверсного);
    - сформировать передний фронт импульсного сигнала (установить разряд в состояние "1" для прямого импульсного сигнала, "0" - для инверсного);
    - реализовать временную задержку;
    - сформировать задний фронт импульсного сигнала (установить разряд в состояние "0" для прямого импульсного сигнала, "1" - для инверсного);
    Длительность импульса определяется временем задержки и временем выполнения команд формирования заднего фронта. Минимальная длительность сигнала получается при отсутствии временной задержки. Для прямого импульсного сигнала на выходе порта P1.3 это реализуется двумя командами:
    SETB P1.3
    CLR P1.3
    или
    SETB P1.3
    CPL P1.3.
    Длительность импульса в обоих случаях равна одному машинному циклу - времени выполнения последних команд.
    При длительностях импульса порядка нескольких машинных циклов временная задержка может быть реализована несколькими последовательными командами NOP, длительность которых равна одному машинному циклу. При больших длительностях временная задержка реализуется с помощью программных циклов или с использованием таймеров.

   ФОРМИРОВАНИЕ ВРЕМЕННОЙ ЗАДЕРЖКИ

    Группа команд, реализующих временную задержку может находиться в соответствующем месте программы или оформляться как подпрограмма (например, DELAY). При использовании метода программных циклов в некоторый регистр (например, R4) загружается число X, которое затем в каждом проходе цикла уменьшается на 1 до тех пор, пока содержимое регистра не станет равным нулю:
    DELAY:  MOV R4, #X
    COUNT: DJNZ R4, COUNT
                 RET
    Время задержки определяется числом, загруженным в регистр, и временем выполнения команд, образующих программный цикл. Команды MOV и RET длительностью по 2 машинных цикла выполняются однократно, число повторений команды DJNZ равно числу Х. Кроме того, следует учитывать время исполнения (2 цикла) команды CALL DELAY, по которой осуществляется обращение к подпрограмме.
    Для реализации временной задержки, равной Т, при длительности машинного цикла t число Х можно определить из выражения: T=(2+2+2X+2)*t.
    Если число Х получается дробным, то временную задержку можно реализовать лишь приблизительно. Для более точной подстройки в подпрограмму могут быть включены команды NOP. Минимальная задержка, реализуемая подпрограммой, составляет 8 машинных циклов (Х=1), максимальная - 516 циклов (Х=255).

Формирование
временной задержки
    Для реализации задержки большей длительности можно увеличить тело цикла включением дополнительных команд NOP или использовать метод вложенных циклов, когда во внутреннем цикле с параметром Y уменьшается на 1 содержимое регистра (например, R5), а во внешнем с параметром Х - содержимое другого регистра (например, R4):
    DELAY:  MOV R4, #X
    LOOPX: MOV R5, #Y
    LOOPIN: DJNZ R5, LOOPIN
                 DJNZ R4, LOOPX
                 RET
    Числа Х и Y выбираются из соотношения Т=[2+2+Х(2+2Y+2)+2]*t. Максимальная задержка при Х=Y=255 составляет 131076 циклов. При длительности машинного цикла, равного 1 мкс, задержка будет равна примерно 0,13 с. Для точной подстройки временного интервала может потребоваться добавление команд NOP или введение дополнительного цикла.

Формирование
временной задержки
    Для реализации временной задержки между двумя фрагментами программы можно использовать таймер микроЭВМ, работающий в режиме таймера (временные интервалы пропорциональны длительности машинного цикла) или в режиме счетчика (временные интервалы пропорциональны периоду сигналов от внешнего генератора, подаваемым на входы T0 или T1).
    Например, для того, чтобы организовать временную задержку длительностью T с использованием прерывания от таймера T/C0, необходимо настроить его на работу таймера в режиме "1", загрузить младший и старший байты константы пересчета (К пересч), запустить таймер, разрешить прерывание от таймера и затем перейти в режим ожидания (или холостого хода). Программа обработки прерывания от таймера должна прекращать работу таймера. Эта процедура реализуется следующей последовательностью команд:
           .ORG 0BH  ; адрес программы прерывания от Т/С0
           CLR TCON.4  ; останов Т/С0
           CLR IE.1  ; запрет прерывания от Т/С0
           RETI  ; выход из программы обработки прерывания
   
           .ORG 100H  ; начальный адрес программы
           MOV TMOD,#01H  ; настройка Т/С0
           MOV TLO, #LOW CONST  ; загрузка младшего байта константы пересчета
           MOV THO, #HIGH CONST  ; загрузка старшего байта константы пересчета
           ...  
LAST: ...  ; окончание первого фрагмента программы
           SETB TCON.4  ; запуск Т/С0
           SETB IE.7  ; разрешение прерываний
           SETB IE.1  ; разрешение прерывания от Т/С0
           JMP $  ; переход в режим ожидания
NEXT: ...  ; начало второго фрагмента программы
    Временная задержка между окончанием первого фрагмента программы (метка LAST) и началом второго фрагмента (метка NEXT) определяется суммой времени выполнения команды запуска таймера (1 машинный цикл), времени работы таймера до переполнения ((65536-К пересч) циклов), времени входа в обработчик прерывания (3 цикла), времени выполнения программы обработки прерывания (4 цикла):
    T = [ 1 + (65536 - К пересч) + 3 + 4 ] * t.
    Из этого выражения можно определить значение константы пересчета. Максимальное время задержки может быть равно 65544 машинным циклам, минимальное может быть обеспечено в случае, когда время работы таймера будет не меньшим времени выполнения команд разрешения прерываний (2 цикла), т.е. T = 10 циклам.

   ФОРМИРОВАНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ СИГНАЛОВ

    Генерация периодического управляющего сигнала на выходе некоторого разряда порта микроЭВМ реализуется чередованием процедур выдачи изменяемого значения сигнала ("0" или "1") и вызова подпрограмм временных задержек, равных длительности импульса и разницы между величиной периода и длительностью испульса.
    Для генерации меандра удобно воспользоваться командой изменения значения выходного разряда (например P2.0) и подпрограммой реализации временной задержки, равной половине периода сигнала:
    XCOR: CPL P2.0
                 ACALL DELAY
                 SJMP XCOR
    Предпочтительнее все же для генерации периодических сигналов использовать таймеры, что позволит микроЭВМ одновременно выполнять другие задачи, в том числе и программно управлять генерацией этих сигналов.
    Последовательность апериодических сигналов с произвольной длительностью и скважностью также может быть получена чередованием процедур выдачи значения сигнала ("0" или "1") и вызова подпрограмм временных задержек заданных длительностей.

   ОПРЕДЕЛЕНИЕ ВРЕМЕННОГО ИНТЕРВАЛА

    Обычно события в объекте управления представляются сигналами от двоичных датчиков. Считая событиями фронты 0/1 и 1/0 импульса, можно определять временные характеристики импульсных сигналов: длительность, период и скважность.
    Наиболее эффективно использование для измерения длительности сигнала таймеров микроЭВМ, имеющих входы разрешения счета. В качестве таких входов используются входы P3.2 (INT0) для T/C0 и P3.3 (INT1) для T/C1. При установке в "1" разрядов GATE0 или GATE1 в регистре TMOD работа таймеров T/C0 или T/C1 будет разрешаться при единичном значении сигналов на входе соответственно INT0 или INT1.

Таймеры/счетчики
    Если, например, измеряемый сигнал подключен ко входу INT0, то измерение длительности «положительного» импульса будет выполняться в Т/С0 (при условии, что прерывание от Т/С0 и внешнее прерывание по входу INT0 запрещены):
              MOV TMOD, #00001001B  ; настройка Т/С0
              MOV TH0, #0  ; сброс таймера
              MOV TL0, #0
              SETB TCON.4  ; запуск таймера
WAIT1: JNB P3.2, WAIT1  ; ожидание «1» - начала импульса
WAIT0: JB P3.2, WAIT0  ; ожидание «0» - окончания импульса
              CLR TCON.4  ; останов таймера
EXIT: ... ; выход из процедуры
    Управление этой программе должно быть передано при условии, что на входе INT0 присутствует низкий уровень.
    По завершению программы в Т/С0 будет находиться число, пропорциональное длительности импульса на входе INT0. Верхний предел измерения, при длительности машинного цикла 1 мкс, равен 65536 мкс, а максимальная погрешность - 1 мкс. При необходимости измерения временных интервалов большей длительности можно программным способом подсчитывать число переполнений от таймера.

   ПРЕОБРАЗОВАНИЕ СИГНАЛОВ

    Обработка данных в микроЭВМ осуществляется в параллельном двоичном коде, а поступать в микроЭВМ и выводиться из нее информация может в иной форме представления. Наиболее распространены следующие преобразования информации из одной формы представления в другую:
    - из унитарного кода в двоичный (при вводе информации с клавиатуры или от оцифрованных переключателей) и из двоичного в унитарный;
    - из одной системы счисления в другую (при работе со специальными клавиатурами);
    - специальные преобразования (для организации индикации и при выводе информации на периферийные устройства);
    - из последовательного кода в параллельный (при вводе) и из параллельного в последовательный (при выводе);
    - из аналоговой формы представления в цифровую и наоборот (для связи с аналоговыми датчиками и исполнительными механизмами).
     Способы программной реализации преобразования информации, представленной в цифровой форме, многообразны и во многом определяются конкретной задачей.

    В лабораторных работах и в вариантах домашних заданий, выполняемых студентами кафедры, может потребоваться только аналого-цифровое преобразование, которое рекомендуется выполнять с использованием БИС аналого-цифрового преобразоветеля (АЦП), подключаемой к портам микроЭВМ (см. >>).

Принципы ввода
аналоговых сигналов

| На главную страницу | На начало раздела | На начало страницы | ©КСиТ МИФИ, 2002 г.