Как найти число импульсов

        1. Подсчет числа импульсов за заданный промежуток времени

При
решении задачи преобразования
числоимпульсного кода в двоичный код,
а также в ряде других задач может
потребоваться подсчёт числа импульсов
N
за заданный интервал времени (t1,
t2)
(рисунок 4.8).

Рисунок
4.8 – Иллюстрация к задаче подсчета числа
импульсов

за заданный промежуток
времени

Эта
процедура может быть реализована
четырьмя различными способами:

  • программной
    реализацией временного интервала и
    программным подсчетом числа импульсов
    на входе МК;

  • программной
    реализацией временного интервала и
    аппаратным подсчетом числа импульсов
    (на внутреннем таймере-счетчике);

  • аппаратной
    реализацией временного интервала и
    программным подсчетом числа импульсов;

  • аппаратной
    реализацией временного интервала с
    аппаратным подсчетом числа импульсов.

Первый
способ неэффективен и значительно
сложнее других, а потому не рассматривается.

При
аппаратной реализации подсчета числа
событий импульсный датчик должен быть
подключен ко входу одного из таймеров
(в приведённом примере программы (листинг
4.10) используется вход T1).

Листинг
4.10 – Программа подсчёта числа импульсов
за заданный промежуток времени с
использованием аппаратного счётчика
импульсов

.ORG
0000h

JMP
BEGIN

;
Адрес начала программы

;
Переход к основной части

;
программы

BEGIN

SETB
T1

MOV
IE, #00h

MOV
TMOD, #50h

MOV
TL1, #00h

MOV
TH1, #00h

SETB
TR1

CALL
DELAY

CLR
TR1

;
Инициализация входа
T1
на

;
ввод сигнала

;
Запрет всех прерываний

;
Настройка таймера
T/C1

;
на счёт внешних событий

;
Очистка регистров

;
счётчика

;
Разрешение счёта

; Вызов процедуры,

; реализующей
временную

; задержку

;
Остановка счёта

Подсчет
импульсов производится счетчиком
событий, а отсчет заданного временного
интервала – процедурой DELAY (см. листинг
4.7). Результат сохраняется в регистровой
паре TH1:TH0.

При
аппаратной реализации отсчета временного
интервала используется один из таймеров
микроконтроллера. Счёт импульсов
реализуется программно (листинг 4.11):

Листинг
4.11 – Программа подсчёта числа импульсов
за заданный промежуток времени с
использованием аппаратного счётчика
времени

T:

N:

F:

ST:

.EQU
0.025

.EQU
40

.EQU
24000000

.EQU
65536-T*F/12

; Требуемый
интервал

;
времени от

;
момента запуска таймера ; до его
переполнения

;
Необходимое количество

;
прерываний от таймера

;
Величина
T*N
– время

;
счёта

;Частота
кварцевого

;
резонатора (24 МГц),

;
подключаемого к

;
микроконтроллеру

;
Число, загружаемое в

;
регистровую пару
TH0:TL0

.ORG
0000h

JMP
BEGIN

.ORG
000Bh

JMP
TIMER

; Адрес начала
программы

;
Переход к основной

;
программе

;
Адрес обработчика

;
прерываний от таймера

;
Переход к процедуре

;
обработки прерывания

BEGIN:

C1:

C2:

STOP:

MOV
IE, #00h

SETB
T1

MOV
R0, #00h

MOV
A, #N

MOV
TMOD, #01h

MOV
TL0, #<ST

MOV
TH0, #>ST

MOV
IE, #82h

SETB
TR0

JNB
TR0, STOP

JB
T1, C1

INC
R0

JNB
TR0, STOP

JNB
T1, C2

JMP
C1

;
Запрет всех прерываний

;
Инициализация входа
T1
на

;
ввод сигнала

;Обнуление
счетчика

;
импульсов

;
Загрузка счетчика

;
прерываний от таймера

;
Настройка таймера
T/C0

;
на счёт по модулю 16

;
внутренней частоты

;
Загрузка таймера

;
Разрешение прерывания,

;
генерируемого таймером

;
Разрешение счёта

;
Проверка флага

;
разрешения счёта таймера

;
Ожидание заднего фронта

;
одного из подсчитываемых

;
импульсов

;
Увеличение счётчика

;
импульсов

;
Проверка флага

;
разрешения счёта таймера

;
Ожидание переднего

;
фронта одного из

;
подсчитываемых

;
импульсов

;
Переход к циклу ожидания

;
следующего импульса

;
Выход из процедуры

; После выхода
из процедуры результат будет сохранен
в

; регистре R0

; Обработчик
прерываний, генерируемых таймер-счетчиком
T/C0

TIMER:

TEXIT:

MOV
TL0, #<ST

MOV
TH0, #>ST

DJNZ
A, TEXIT

CLR
TR0

MOV
IE, #00h

RETI

; Загрузка
таймера

;
Декрементирование

;
счётчика прерываний

;
и переход на метку
TEXIT,

;
если
A0

; Сброс флага
разрешения

; счета

; Запрет
прерываний

; Выход из
прерывания

В
приведённой программе время счёта
(t2–t1)
составляет 1 секунду. Значения T
и N
выбирались из следующих соображений:
для отсчёта 1 с необходимо, чтобы
произведение Т×N=1.
При частоте кварцевого резонатора 24
МГц таймер ведет счет импульсов
внутреннего генератора, частота которых
2 МГц. Время отсчёта (с) 65536 периодов
внутреннего генератора составляет:


.

Целого
числа, умножение которого на 0,032768
составит 1, не существует, поэтому из
интервала

выбирается максимальное число, умножение
которого на целое число составит 1.
Очевидно, что одним из вариантов будет
комбинация: T
= 0,025, N=40.

Четвертый
способ подсчета числа импульсов может
быть реализован двумя способами:


с использованием двух таймеров-счётчиков
(один для генерации интервала времени,
другой – для счёта внешних импульсов);


с использованием таймера-счётчика (для
генерации интервала времени) и контроллера
прерываний (для регистрации импульсов).
При использовании этого способа
подсчитываемые импульсы должны подаваться
на один из входов контроллера прерываний,
INT0
или INT1.

Первый
способ позволяет полностью «разгрузить»
процессор микроконтроллера. Этот способ
является сочетанием двух предыдущих
(листинг 4.10 и 4.11).

Второй
способ аппаратной регистрации импульсов
представлен листингом 4.12.

Листинг
4.12 – Программа подсчёта импульсов за
заданный интервал времени с использованием
внутреннего контроллера прерываний

T:

N:

F:

ST:

.EQU
0.025

.EQU
40

.EQU
24000000

.EQU
65536-T*F/12

;
Интервал времени от

;
момента запуска таймера ; до его
переполнения

;
Необходимое количество

;
прерываний от таймера

;
Величина
T*N
– время

;
счёта

;Частота
кварцевого

;
резонатора (24 МГц),

;
подключаемого к

;
микроконтроллеру

;
Число, загружаемое в

;
регистровую пару
TH0:TL0

.ORG
0000h

JMP
BEGIN

.ORG
0003h

INC
DPTR

RETI

.ORG
000Bh

JMP
TIMER

;
Адрес начала программы

;
Переход к основной

;
программе

;
Адрес обработчика

;
прерываний по входу
INT0

;
Увеличение счётчика

;
импульсов

;
Выход из обработчика

;
Адрес обработчика

;
прерываний от таймера

;
Переход к процедуре

;
обработки прерывания

BEGIN:

MOV
IE, #00h

SETB
INT0

MOV
DPTR, #0000h

MOV
A, #N

MOV
TMOD, #01h

MOV
TL0, #<ST

MOV
TH0, #>ST

SETB
TR0

MOV
TCON, #01h

MOV
IE, #83h

JB
TR0,
$

;
Запрет всех прерываний

;
Инициализация входа
INT0

;
на ввод сигнала

;Обнуление
счетчика

;
импульсов

;
Загрузка счетчика

;
прерываний от таймера

;
Настройка таймера
T/C0

;
на счёт по модулю 16

;
внутренней частоты

;
Загрузка регистров

;
счётчика

;
Разрешение счёта

;
Настройка контроллера

;
прерываний на режим

;
срабатывания по спаду

;
сигнала на входе
INT0

;
Разрешение прерываний,

;
генерируемых таймером и

;
внешним источником

;
Проверка флага

;
разрешения счёта таймера

;
Выход из подпрограммы

;
счета

; Обработчик
прерываний, генерируемых таймером-счетчиком
T/C0

;
приведен в листинге 4.11

В
данной программе счетчик внешних
импульсов представлен регистром DPTR.
Подсчитываемые импульсы должны подаваться
на вход INT0.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
Игорь Михайлов

@SymbiSoft

Инженер наладчик станков с ЧПУ, в душе программист

Как подсчитать количество импульсов за единицу времени?

Доброго времени суток.
Встал вопрос по поводу подсчёта количества импульсов со счётчика Гейгера-Мюллера с помощью ардуины.
На вход цифрового пина подключен вывод транзистора, который при пробое трубки подает +3.3В(логическую единицу).
Как подсчитать количество импульсов – тут проще простого. А как сделать подсчет за определенный промежуток(1сек, 10сек, 100…)?дабы сделать разные режимы подсчёта и точности.


  • Вопрос задан

    более трёх лет назад

  • 1507 просмотров

Инкрементим по каждому импульсу переменную, а по таймеру с нужным интервалом читаем и обнуляем эту переменную.

То бишь “в лоб” читаем-обнуляем каждую минуту => число импульсов в минуту

Понятное дело что будет неблагодарным занятием читать-обнулять этот счетчик каждую секунду, если импульсы приходят раз в минуту (то бишь чаще чем прилетают импульсы).

Пригласить эксперта

Как мне кажется, проще всего считать за секунду и складывать в массив, длину которого выбрать по максимальному времени подчета. Нужно за 10 секунд? Складываешь 10 последних элементов. К тому же по массиву можно график во времени нарисовать, а это очень наглядно.

Как вариант – измерять не частоту, а период следования импульсов. И считать по скользящему среднему за N щелчков. Фон будет считаться медленно, потому что щелчков мало, но если данных будет много – то показания будут изменяться быстрее. Но в любом случае, точность будет предсказуема и примерно одинакова на любой скорости щелчков.


  • Показать ещё
    Загружается…

20 мая 2023, в 00:11

10000 руб./за проект

20 мая 2023, в 00:10

2000 руб./в час

19 мая 2023, в 23:57

40000 руб./за проект

Минуточку внимания

Расчёт скважности и длительности импульсов

Одним из важных параметров периодического сигнала является скважность импульсов

Основы скважности и длительности импульсов


Частота повторения импульсов F – это количество импульсов, генерируемых в течении одной секунды.
Период импульсной последовательности Т – это время импульса tH, сложенное со временем паузы tL:
T = tH + tL = 1 / F

Скважность S импульсной последовательности – это отношение периода к длительности импульса:
S = T / tH    (S > 1)

Обратная величина скважности – это коэффициент заполнения D:
D = tH / T
Коэффициент может быть выражен в процентах:
D = (tH / T) × 100%

Длительность прямоугольного импульса определяется на уровне 50% его амплитуды.
Время нарастания импульса tr – это интервал времени, измеренный между моментами, когда амплитуда изменяется от 0,1 до 0,9 установившегося значения. Между этими же уровнями измеряется и время спада импульса tf.
Сигнал идеальной формы имеет значение равное нулю для tr и tf.

Расчет скважности и длительности импульса

Введите любые два значения

Длительность импульсов 1

tH

Длительность импульсов 2

tL

Обнаружили ошибку или неточность в работе калькулятора? Сообщите нам об этом.
Соблюдайте технику безопасности во время работы с электронными компонентами!

Как определить количество импульсов

Автор Александр 2305, 15 февраля 2011, 18:58:44

0 Пользователи и 1 гость просматривают эту тему.


Александр 2305

  • Постоялец
  • Сообщения: 40
  • Записан

Подскажите как определить количество импульсов за один оборот 2х тактника 2 цилиндра.В маховике стоят 4 магнита.Определить надо для того чтоб правильно выставить показания тахометра.В паспорте на тах. есть таблица.
  45*=8 импульсов за оборот
  60*=6 импульсов за оборот
  90*=4 импульса за оборот
120*=3 импульса за оборот
180*=2 импульса за оборот
360*=1 импульс за оборот
720*=1 импульс за 2 оборота
(*-это я так обозначил градусы)
Подскажите пожалуста а то я в этих градусах и импульсах немогу разобраться в роде ничего сложного но тах. выдаёт чёт его знает что.При включение на хол.оборотах показания были 2450 при 360*.



Рома

  • Вот так ловить надо!!!
  • Прописан
  • Сообщения: 173
  • Расположение: Ростов-на-Дону
  • Записан


Саша (П2+S30)

  • Старожил
  • Сообщения: 881
  • Прежде, чем что-либо сказать – подумай трижды
  • Расположение: г.Ростов-на-Дону
  • Репутация: 1941
  • Записан

Доброго времени суток!

Цитата: Александр 2305 от 15 февраля 2011, 18:58:44
…..В маховике стоят 4 магнита.Определить надо для того чтоб правильно выставить показания тахометра.В паспорте на тах. есть таблица.
  45*=8 импульсов за оборот
  60*=6 импульсов за оборот
  90*=4 импульса за оборот
120*=3 импульса за оборот
180*=2 импульса за оборот
360*=1 импульс за оборот
720*=1 импульс за 2 оборота
(*-это я так обозначил градусы)
Подскажите пожалуста а то я в этих градусах и импульсах немогу разобраться в роде ничего сложного но тах. выдаёт чёт его знает что.При включение на хол.оборотах показания были 2450 при 360*
.

Четыре магнита стоят через каждые 45* , получается 8 импульсов. Импульс = изменению магнитного поля с сев. полюса на южный, а соответственно изменению напряжения с + на -. На х.х. тахометр должен намерять в районе 1000 тахов :).
Как-то так вот примерно :)



Александр 2305

  • Постоялец
  • Сообщения: 40
  • Записан

Мотор Хондекс,9.8 очень сильно похож на Тоху 9.8.
То есть получаеться что 8 импульсов делить на 2 цилиндра=4 импульса.Пробывал ставить на 4 тогда тах.показывал примерно 550-700 об.Настройки карб.с завода нетрогал.



ватр

  • Постоялец
  • Сообщения: 28
  • Для тех, кто никуда не плывет,нет попутного ветра
  • Записан

Цитата: Александр 2305 от 15 февраля 2011, 18:58:44
Подскажите как определить количество импульсов за один оборот 2х тактника 2 цилиндра.В маховике стоят 4 магнита.Определить надо для того чтоб правильно выставить показания тахометра.В паспорте на тах. есть таблица.
 45*=8 импульсов за оборот
 60*=6 импульсов за оборот
 90*=4 импульса за оборот
120*=3 импульса за оборот
180*=2 импульса за оборот
360*=1 импульс за оборот
720*=1 импульс за 2 оборота
(*-это я так обозначил градусы)
Подскажите пожалуста а то я в этих градусах и импульсах немогу разобраться в роде ничего сложного но тах. выдаёт чёт его знает что.При включение на хол.оборотах показания были 2450 при 360*.

на двухтактном каждому обороту коленвала будет соответствовать один импульс, если я правильно понял у тебя двух цилиндровый мотор и кол. магнитов нужно разделить на 2 и получается 2 импульса за оборот, т.е. 180*



Александр 2305

  • Постоялец
  • Сообщения: 40
  • Записан

Большое спасибо за подсказку. Значит сей тах врёт безбожно, если поставить на 180 то  он показывает на хол.об 1400,а по паспорту мотора 950плюс минус50



Svoland

  • Svoland
  • Дед
  • Сообщения: 1,259
  • Лучше переесть, чем недоспать.
  • Расположение: Ростов-на-Дону
  • Репутация: 494
  • Записан


Рома

  • Вот так ловить надо!!!
  • Прописан
  • Сообщения: 173
  • Расположение: Ростов-на-Дону
  • Записан

Цитата: Александр 2305 от 16 февраля 2011, 21:04:33
Большое спасибо за подсказку. Значит сей тах врёт безбожно, если поставить на 180 то  он показывает на хол.об 1400,а по паспорту мотора 950плюс минус50

Если мотор новый, то обороты будут завышины  с завода. Пробуй на 3-4, в основном  все двухтактники имеют такое количество полюсов.



ватр

  • Постоялец
  • Сообщения: 28
  • Для тех, кто никуда не плывет,нет попутного ветра
  • Записан

Цитата: Александр 2305 от 16 февраля 2011, 21:04:33
Большое спасибо за подсказку. Значит сей тах врёт безбожно, если поставить на 180 то  он показывает на хол.об 1400,а по паспорту мотора 950плюс минус50

По паспорту обороты обкатанного, прогретого мотора- на заводе ставят, обычно завышенные для устойчивого х.х. Если есть подозрения к тах.- проверь механическим, или заведомо исправным.


  • Форум рыбаков


  • Полезное для рыбака


  • Самоделки


  • Лодки и моторы


  • Как определить количество импульсов

Мы в соцсетях:
YouTube
Odnoklassniki
Vkontakte
Twitter

6.1.3. Подсчет числа
импульсов

Часто в управляющих
программах возникает необходимость
ожидания цепочки событий, представляемой
последовательностью импульсных сигналов
от датчиков. Рассмотрим две типовые
процедуры: подсчет числа импульсов
между двумя событиями и подсчет числа
импульсов за заданный интервал времени.

Подсчет числа
импульсов между двумя событиями
.
Эту типовую процедуру удобно
проиллюстрировать на конкретном примере.
Предположим, что необходимо подсчитать
число деталей, сошедших с конвейера от
момента его включения до момента
выключения. Факт схода детали с конвейера
фиксируется фотоэлементом, на выходе
которого формируется импульсный сигнал.

Для простоты
реализации программы считаем, что общее
количество деталей не превышает 99:

;ВЕРСИЯ ДЛЯ МК51

MOV
TMOD,#01000000B ;НАСТРОЙКА СЧЕТЧИКА I

MOV THI,#0 ;СБРОС CЧEТЧИKA ДЕТАЛЕЙ
WAITO: JB
P3.4,WAITO ;ОЖИДАНИЕ ВКЛЮЧЕНИЯ КОНВЕЙЕРА

SETB TCON,6
;ПУСК СЧЕТЧИКА 1
WAIT1: JNB Р3.4,WАIT1
;ОЖИДАНИЕ ВЫКЛЮЧЕНИЯ

;
КОНВЕЙЕРА
CLR TCON,6 ;ОСТАНОВ
СЧЕТЧИКА 1
MOV A,TN1 ;(АККУМУЛЯТОР)
<– ЧИСЛО ДЕТАЛЕЙ
EXIT: …
;ВЫХОД ИЗ ПРОЦЕДУРЫ

Подсчет числа
импульсов за заданный промежуток времени

При решении задачи
преобразования число-импульсного кода
в двоичный код, а также в ряде других
задач может возникнуть необходимость
подсчета числа импульсов
за заданный
интервал времени. Эта процедура может
быть реализована тремя различными
способами:

программной
реализацией временного интервала и
программным подсчетом числа импульсов
навходе МК;

программной
реализацией временного интервала и
аппаратурным подсчетом
числа импульсов
(на внутреннем таймере/счетчике) ;

аппаратурной
реализацией временного интервала и
программным подсчетом числа импульсов.

Для МК 51, имеющего
в своем составе два таймера/счетчика,
возможен четвертый способ: аппаратурная
реализация временного интервала с
аппаратурным подсчетом числа импульсов.

Первый способ
неэффективен и значительно сложнее
других, а потому не рассматривается,
второй и третий являются альтернативными,
поскольку у МК48 имеется только один
таймер/счетчик.

Четвертый (полностью
аппаратурный) способ подсчета числа
импульсов требует использования двух
аппаратурных счетчиков и поэтому
возможен лишь для МК51. На Т/С1 можно
выполнять подсчет числа импульсов, а
на Т/СО — отсчет заданного интервала.
Датчик импульсов должен быть подключен
к входу Т1:

; ВЕРСИЯ ДЛЯ МК51
TIME: EQU NOT(10000)+l ;ОПРЕДЕЛЕНИЕ
КОНСТАНТЫ TIME ;ДЛЯ
ОТСЧЕТА ИНТЕРBАЛА 10 МС

MOV
TMOD,#01010001B ;НАСТРОЙКА Т/С, 16 БИТ

;1 – СЧЕТЧИК, О –
ТАЙМЕР

CLR A ;СБРОС
АККУМУЛЯТОРА
MOV TH2,A ;СБРОС
Т/С1
MOV TH2,A

MOV TH0,#HIGH(TIME) ;ЗАГРУЗКА В Т/СО

MOV TLO,#LOW(TIME) ;КОНСТАНТЫ TIME
ORL
TCON,#5OH ;ПУСК Т/С1 И Т/СО

WAIT:
JBC TCON.5,EXIT ;ПРОВЕРКА ПЕРЕПОЛНЕНИЯ Т/СО
SJMP WAIT ;ЦИКЛ, ЕСЛИ TF=0

EXIT: MOV B,TH2 ;(В)(А)
<—— ЧИСЛО ИМПУЛЬСОВ

MOV A.TL1 ;ЗА
10 MC

… ;ВЫХОД ИЗ
ПРОЦЕДУРЫ

6.1.4. Опрос группы
двоичных датчиков

Микроконтроллеры
чаще всего имеют дело не с одним датчиком,
как в рассмотренных выше примерах, а с
группой автономных (логически независимых)
или взаимосвязанных (формирующих
двоичный код) датчиков (группу
взаимосвязанных датчиков называют
композицией). При этом МК может выполнять
процедуру опроса датчиков и передачи
управления отдельным фрагментам
прикладной программы в зависимости от
принятого кода.

Программную
реализацию процедуры ожидания заданного
кода (WTCODE) рассмотрим для случая
подключения группы из восьми взаимосвязанных
статических датчиков к входам порта 1
МК:

;ВЕРСИЯ ДЛЯ МК51

WICODE: MOV
A,#l0 ;ЗАГРУЗКА В АККУМУЛЯТОР ЭТАЛОННОГО
КОДА

WAIT: CJNE А,Р1,WА1Т;ЕСЛИ
КОДОВАЯ КОМБИНАЦИЯ НА ВХОДАХ ПОРТА 1

;
НЕ СОВПАЛА С ЭТАЛОННЫМ ЗНАЧЕНИЕМ, ТО
ЖДАТЬ

EXIT: … ;ВЫХОД ИЗ
ПРОЦЕДУРЫ

При работе с
композицией датчиков часто возникает
необходимость осуществлять передачу
управления не только в зависимости от
двоичного эквивалента принятого кода,
как в рассмотренном примере, но и в
зависимости от соотношения принятого
кода и некоторой заранее определенной
уставки. Пусть, например, в порте 1 от
группы двоичных датчиков формируется
восьмибитный двоичный код. Если код
равен десятичному эквиваленту 135, то
необходимо передать управление программе
с меткой LABELA, в противном случае –
программе с меткой LABELВ:

;ВЕРСИЯ ДЛЯ МК51

MOV А,#135
;ЗАГРУЗКА УСТАВКИ

CJNE
A,P1,LABELB;СРАВНEНИЕ И ПЕРЕДАЧА УПРАВЛЕНИЯ

LABELA: …

Опрос группы
импульсных датчиков
.
Эта процедура состоит из последовательности
действий: ожидания замыкания одного из
контактов, устранения дребезга, ожидания
размыкания замкнутого контакта.

Программная
реализация процедуры для случая
подключения четырех импульсных датчиков
к входам 0-3 порта 1 будет иметь вид

;ВЕРСИЯ ДЛЯ МК48

KBRD: IN A,P1 ;ВВОД КОДА

CPL
A ;ИНВЕРСИЯ КОДА

ANL A.,#0000llllB ;ЕСТЬ
ЗАМКНУТЫЙ КОНТАКТ?

JZ KBRD ;ЕСЛИ
НИ ОДИН КОНТАКТ НЕ ЗАМКНУТ, ТО ЖДАТЬ

MOV
R2,A ;ПЕРЕДАЧА ПРИНЯТОГО КОДА В R2

DBNC: CALL DELAY ;УСТРАНЕНИЕ
ДРЕБЕЗГА

WAIT:
IN A,P1 ;ВВОД
КОДА

CPL A ;ИНВЕРСИЯ
КОДА

ANL A,#00001111B;ЕСТЬ
ЗАМКНУТЫЙ КОНТАКТ?

JNZ WAIT ;ЕСЛИ
КОНТАКТ ЗАМКНУТ. ТО ЖДАТЬ,
ИНАЧЕ

exit:
;ВЫХОД ИЗ
ПРОЦЕДУРЫ

Анализ состояния
контактов осуществляется наложением
маски на принятый от датчиков код. Для
датчиков, формирующих “отрицательный”
импульс, принятый код удобно предварительно
проинвертировать.

Для группы импульсных
датчиков, представляющих собой êëàâèøный
регистр, процедура KBRD должна быть
дополнена процедурами идентификации
нажатой клавиши и защиты от одновременного
нажатия двух и более клавиш.

Идентификация
нажатой клавиши может осуществляться
двумя способами: по таблице или программно.
При табличном способе перекодирования
в памяти программ должна находиться
таблица двоичных эквивалентов кодов
клавиш.

Программное
преобразование унитарного кода, принятого
от клавиатуры, в двоичный может быть
выполнено методом сдвигов исходного
унитарого кода и подсчетом числа сдвигов
на счетчике до появления первого
переноса. Программа для МК48 будет иметь
вид

IDNKEY: MOV A,R2
;ПЕРЕДАЧА ПРИНЯТОГО КОДА В АККУМУЛЯТОР

MOV R1,#0 ;СБРОС СЧЕТЧИКА
СДВИГОВ
CLR C ;СБРОС
ФЛАГА ПЕРЕНОСА
ROTATE: RRC A ;СДВИГ
УНИТАРНОГО КОДА
JC
CHECK ;ЕСЛИ ВОЗНИК ПЕРЕНОС, ТО ПРОВЕРКА

;НА
МНОЖЕСТВЕННОЕ НАЖАТИЕ
JNC
R1 ;ИНКРЕМЕНТ СЧЕТЧИКА СДВИГОВ
JNP ROTATE ;ПРОДОЛЖЕНИЕ
СДВИГОВ
CHECK: JZ EXIT ;ЕСЛИ <А>=0,
ТО ВЫХОД ИЗ ПРОЦЕДУРЫ
MOV
R1,#OFFH ;ЗАНЕСЕНИЕ В Rl КОДА ОДНОВРЕМЕННОГО

;НАЖАТИЯ
НЕСКОЛЬКИХ КЛАВИШ

EXIT: …
;ВЫХОД ИЗ ПРОЦЕДУРЫ

Результат формируется
в регистре Rl. В программе предполагается,
что в R2 находится инверсия унитарного
кода, принятого от группы датчиков
процедурой KBRD. В результате работы
программы IDNKEY в R1 будет сформирован
двоичный код нажатой клавиши или
экстракод (FFH) “нажато несколько
клавиш”.

6.2. Вывод управляющих
сигналов из МК

6.2.1. Формирование
статических сигналов

Для управления
исполнительным механизмом, работающим
по принципу включено/выключено, на
соответствующей выходной линии порта
МК необходимо сформировать статический
сигнал 0 или 1, что реализуется командами
вывода непосредственного операнда,
содержащего в требуемом бите значение
0 или 1.

В случае параллельного
управления группой автономных
исполнительных механизмов, подключенных
к выходному порту, формируется не
двоичное управляющее воздействие, а
управляющее слово (УС), имеющее формат
байта, каждому разряду которого ставится
в соответствие 1 или 0 в зависимости от
того, какие исполнительные механизмы
должны быть включены, а какие выключены.

Управляющие слова
удобно формировать командами логических
операций над содержимым порта. Команда
ANL используется для сброса тех бит УС,
которые в операнде (маске) заданы нулем.
Команда ORL используется для установки
бит УС. Командой XRL осуществляется
инверсия бит в соответствии с выражением
х
.

Для формирования
сложных последовательностей УС удобно
пользоваться табличным способом, при
котором все возможные УС упакованы в
таблицу, а прикладная программа МК
вычисляет адрес требуемого УС, выбирает
его из таблицы и передает в порт вывода.

6.2.2. Формирование
импульсных сигналов

Управляющее
воздействие типа “импульс” можно
получить последовательной выдачей
сигналов включить
и отключить
с
промежуточным
вызовом подпрограммы временной задержки:

PULS:
;ВЫДАЧА ИМПУЛЬСА В ЛИНИЮ 3 ПОРТА 1
МК48
ON: ANL P1,#1111O111B ;ВКЛЮЧЕНИЕ
ИСПОЛНИТЕЛЬНОГО МЕХАНИЗМА

CALL DELAY
;ВРЕМЕННАЯ ЗАДЕРЖКА
OFF: ORL
P1,#0000l000B ;ВКЛЮЧЕНИЕ ИСПОЛНИТЕЛЬНОГО
МЕХАНИЗМА

Длительность
импульса определяется временной
задержкой, реализуемой подпрограммой
DELAY.

Генерация
периодического управляющего воздействия
(меандра).

Для генерации
меандра удобно воспользоваться процедурой
выдачи импульсного управляющего
воздействия (PULS) и подпрограммой
реализации временной задержки, равной
половине периода сигнала (DLYX):

;ВЕРСИЯ ДЛЯ
MK51

MEANDR:

XCOR:
CPL
-Pl.3
ACALL
DLYX
SJMP
XCOR

Бесконечный
периодический сигнал формируется в
линии 3 порта1; на остальных линиях порта
1 сигналы остаются неизменными.

Формирование
апериодического управляющего сигнала
.

Последовательность
импульсных сигналов с произвольной
длительностью и скважностью может быть
получена аналогичным образом, т.е. путем
чередования процедур выдачи изменяемого
значения сигнала (0 или 1) и вызова
подпрограмм временных задержек заданных
длительностей.

6.4. Реализация
функций времени

6.4.1. Программное
формирование временной задержки

Временная задержка
малой длительности
.
Процедура реализации временной задержки
использует метод программных циклов.
При этом в некоторый рабочий регистр
загружается число, которое затем в
каждом проходе цикла уменьшается на
1. Так продолжается до тех пор, пока
содержимое рабочего регистра не станет
равным нулю, что интерпретируется
программой как момент выхода из цикла.
Время задержки при этом определяется
числом, загруженным в рабочий регистр,
и временем выполнения команд, образующих
программный цикл. Программа имеет
символическое имя DELAY .

Предположим, что в
управляющей программе необходимо
реализовать временную задержку 100 мкс.
Фрагмент программы, реализующей временную
задержку, требуется оформить в виде
подпрограммы, так как предполагается,
что основная управляющая программа
будет производить к ней многократные
обращения для формирования выходных
импульсных сигналов, длительность
которых кратна 100 мкс:

;ВЕРСИЯ ДЛЯ МК48

DELAY:
MOV
R2,#X
;(R2)
<– X

COUNT: PJNZ
R2,COUNT ;ДЕКРЕМЕНТ R2 И ЦИКЛ, ЕСЛИ НЕ НУЛЬ
RET ;ВОЗВРАТ

Для получения
требуемой временной задержки необходимо
определить число X, загружаемое в рабочий
регистр. Определение числа Х выполняется
на основе расчета времени выполнения
команд, образующих данную подпрограмму.
При этом необходимо учитывать, что
команды MOV и RET выполняются однократно,
а число повторений команды DJNZ равно
числу X. Кроме того, обращение к подпрограмме
временной задержки осуществляется по
команде CALL DELAY, время исполнения которой
также необходимо учитывать при подсчете
временной задержки. В описании команд
МК указывается, за сколько машинных
циклов (МЦ) исполняется каждая команда.
На основании этих данных определяется
суммарное число машинных циклов в
программе: CALL – 2 МЦ, MOV – 2 МЦ, DJNZ – 2 МЦ, RET –
2 МЦ.

При тактовой частоте
6 МГц каждый машинный цикл выполняется
за 2,5 мкс. Таким образом, подпрограмма
выполняется за время 5+5+5Х+5=15+5Х мкс. Для
реализации временной задержки 100 мкс
число Х= (100-15)/5= 17.

В данном случае при
загрузке в регистр R2 числа 17 требуемая
временная задержка (100 мкс) реализуется
точно. Если число Х получается дробным,
то временную задержку можно реализовать
лишь приблизительно. Для более точной
подстройки в подпрограмму могут быть
включены команды NOP, время каждой из
которых равно 2,5 мкс.

Минимальная временная
задержка, реализуемая подпрограммой
DELAY, составляет 20 мкс (X = 1). Временную
задержку меньшей длительности программным
путем можно реализовать, включая в
программу цепочки команд NOP.

Максимальная
длительность задержки, реализуемая
подпрограммой DELAY, составляет 1,29 мс (X =
255) .

Для реализации
задержки большей длительности можно
рекомендовать увеличить тело цикла
включением дополнительных команд или
использовать метод вложенных циклов.
Так, например, если в подпрограмму DELAY
перед командой DJNZ вставить дополнительно
две команды NOP, то максимальная задержка
составит 15 + Х(5 + 5) =15+10 х 255 = 2565 мкс (т.е.
почти в 2 раза больше).

Временная задержка
большой длительности. Числа Х и Y
выбираются из соотношения T=5+5+X(5+5Y+5)+5,
где Т — реализуемый временной интервал
в микросекундах. Максимальный временной
интервал, реализуемый таким способом
при Х = Y = 255 составляет 327,69 мс, т.е.
приблизительно 0,3 с.

В качестве примера
рассмотрим подпрограмму, реализующую
временную задержку 100 мс:

:ВЕРСИЯ ДЛЯ МК48

DELAY: M0V Rl,#84
;ЗАГРУЗКА Х
LOOРЕХ: MOV R2,#236 ;ЗАГРУЗКА
Y

LOOPIN: DJNZ R2,LOOPIN ;
ДЕКРЕМЕНТ R2 И ВНУТРЕННИЙ ЦИКЛ,

;ЕСЛИ (R2) НЕ РАВНО
НУЛЮ

DJNZ
Rl,LOOPEX ; ДЕКРЕМЕНТ Rl И ВНЕШНИИ ЦИКЛ,

;ЕСЛИ (Rl) НЕ
РАВНО НУЛЮ

MOV R3,#4
;ТОЧНАЯ ПОДСТРОЙКА
LOOPAD: DJNZ
R3,LOOPAD ;ВРЕМЕННОЙ ЗАДЕРЖКИ

RET

Здесь два вложенных
цикла реализуют временную задержку
длительностью 15+84(10+5х 236) = 99 975 мкс, а
дополнительный цикл LOOPAD реализует
задержку 25 мкс и тем самым обеспечивает
точную подстройку временного интервала.

Временная задержка
длительностью 1 с
.
Из рассмотренного примера видно, что
секунда является очень большим интервалом
времени по сравнению с частотой
тактирования МК. Такие задержки сложно
реализовать методом вложенных циклов,
поэтому их обычно набирают из точно
подстроенных задержек меньшей
длительности. Например, задержку в 1 с
можно реализовать десятикратным вызовом
подпрограммы, реализующей задержку 100
мс:

ONESEC: MOV R3,#10 ;ЗАГРУЗКА
В R3 ЧИСЛА ВЫЗОВОВ

;ПОДПРОГРАММЫ
DELAY
LOOP: CALL DELAY ;ЗАДЕРЖКА 100 МС

DJHZ R3,LOOP
;ДЕКРЕМЕНТ R3 И ЦИКЛ, ЕСЛИ (R3) НЕ PАBHO 0

Погрешность
подпрограммы составляет 55 мкс. Для очень
многих применений это достаточно
высокая точность, хотя реализованные
на основе этой программы часы
астрономического времени за сутки
“убегут” примерно на 5 с.

6.4.2. Формирование
временной задержки на основе таймеров

Задержка малой
длительности
.
Недостатком программного способа
реализации временной задержки является
нерациональное использование ресурсов
МК: во время формирования задержки МК
практически простаивает, так как не
может решать никаких задач управления
объектом. В то же время аппаратурные
средства МК позволяют реализовать
временные задержки на фоне основной
программы работы.

При использовании
таймера в МК48 можно получить временные
задержки длительностью от 80 мкс до 20
мс.

Например, для
реализации временной задержки 240 мкс
необходимо выполнить следующие действия:

MOV A,#NOT(240/80-1)
;ЗАГРУЗКА ТАЙМЕРА

MOV Т,А

STRT Т
;ЗАПУСК ТАЙМЕРА

EN TCNTI
;РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ

Появление сигнала
прерывания от таймера соответствует
истечению временного интервала 240 мкс.
Погрешность будет составлять 7,5 мкс
(время выполнения команды передачи
управления по вектору прерывания и
команды STOP TCNT).

В МК51 на вход
таймера/счетчика (Т/С) могут поступать
сигналя синхронизации с частотой 1 МГц
(Т/С в режиме таймера) или сигналы от
внешнего источника (Т/С в режиме счетчика).
Оба эти режима могут быть использованы
для формирования задержек. Если
использовать Т/С в режиме таймера полного
формата (16 бит), то можно получить задержки
в диапазоне 1 – 65 536 мкс.

В качестве примера
рассмотрим организацию временной
задержки длительностью 50 мс в МК51.
Предполагается, что бит IE.7 установлен.

;OРГАНИЗАНИЯ ПЕРЕХОДА
К МЕТКЕ NEXT ПРИ ПЕРЕПОЛНЕНИИ Т/СО

ORG OBH
;АДРЕС ВЕКТОРА ПРЕРЫВАНИЯ
01 Т/СО

CLR TCON.4
; ОСТАНОВ Т/СО

RET1
;ВЫХОД ИЗ ПОДПРОГРАММЫ

;ОБРАБОТКИ
ПРЕРЫВАНИЯ

ORO 100Н
;НАЧАЛЬНЫЙ АДРЕС ПРОГРАППЫ

MOV TMOD,#O1H ;НАСТРОЙКА Т/СО
MOV
TLO,#LOW(NOT(50000-1)) ;ЗАГРУЗКА ТАЙМЕРА
MOV
THO,#HIGH(NOT(50000-l))
SETB TCON.4
;СТАРТ Т/СО
SETB IE.1
;РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ОТ Т/СО

SETB PCON.O ; ПЕРЕВОД МК51 В
РЕЖИМ ХОЛОСТОГО

;
ХОДА
NEXT:

6.4.3. Измерение
временных интервалов

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

Простейшим способом
измерения длительности импульса является
программный. Для обнаружения событий
(фронт и спад импульсного сигнала) в
этом случае используются типовые
процедуры WAIT, а отсчет времени ведется
программным способом. Для “положительного”
импульсного сигнала, поступающего на
вход ТО, программа измерения его
длительности будет иметь вид

;ВЕРСИЯ ДЛЯ МК48

MSCONT: MOV R7,#0
;CБPOC
СЧЕТЧИКА

WAITO: JNTO WAITO ;ОЖИДАНИЕ
ФРОНТА СИГНАЛА

COUNT: INC R7
;ИНКРЕМЕНТ СЧЕТЧИКА

JTO COUNT
;ОЖИДАНИЕ СПАДА СИГНАЛА
EXIT:
…. ;ВЫХОД ИЗ ПРОЦЕДУРЫ

После выхода из
процедуры содержимое счетчика (R7)
пропорционально длительности импульса.

Для нормальной
работы этой программы необходимо, чтобы
обращение к ней производилось в моменты,
когда на входе ТО присутствует сигнал
нулевого уровня. Верхний предел измеряемой
длительности ‘положительного” импульса
составит 255(1 + 2)2,5 мкс = 8,925 мс. Этот предел
может быть увеличен включением в цикл
COUNT дополнительных команд NOP. Максимальная
погрешность измерений 7,5 мкс.

Для измерения
длительности сигнала может быть
использован таймер. Особенно эффективно
использование для этой цепи таймера в
МК51, имеющего вход разрешения счета
(альтернативная функция входа ЗПР).
Измеряемый сигнал можно, например,
подавать на вход ЗПРО, измерение
длительности при этом будет выполняться
в Т/СО. Программа измерения длительности
“положительного” импульса будет
выглядеть так:

;ВЕРСИЯ ДЛЯ МК51

MOV TMOD,#00001001B ;НАСТРОЙКА
T/C0

MOV TH0,#0 ;СБРОС ТАЙМЕРА

MOV TLO,#0

SETB TCON,4 ;СТАРТ
T/C0

WAITO:
JMB
P3.2,WAITO ;ОЖИДАНИЕ
1

WAITC:
JB P3.2,WAITC ;ОЖИДАНИЕ
0

CLR TCON.4 ;СТОП
T/C0

EXIT: … ;ВЫХОД ИЗ
ПРОЦЕДУРЫ

Управление программе
должно быть передано при условии, что
на входе ЗПРО присутствует низкий
уровень. Прерывания от Т/СО и внешнее
прерывание по входу ЗПРО должны быть
запрещены. По завершению программы в
Т/СО будет находиться число, пропорциональное
длительности “положительного”
импульса на входе ЗПРО. Верхний предел
измерения равен 65 536 мкс, а максимальная
погрешность 1 мкс.

При необходимости
измерения временных интервалов большей
длительности можно программным способом
подсчитывать число переполнений от
таймера, т.е. расширять его разрядность
за счет рабочего регистра или ячейки
РПД.


6.5.
Преобразование кодов

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

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

6.5.1. Простейшие
преобразования

Преобразование
унитарного кода в двоичный позиционный
.
Двоичный эквивалент унитарного кода
равен номеру бита, в котором находится
единственная единица. Поэтому
преобразование унитарного кода в
двоичный позиционный удобно осуществлять
путем сдвига исходного унитарного кода
в сторону младших бит с одновременным
подсчетом
числа сдвигов. При “выдвигании”
из младшего бита значения 1 сдвиги
прекращаются, а в счетчике сдвигов будет
содержаться двоичный эквивалент
унитарного кода (см. 6.1.4).

Преобразования
двоичного позиционного кода в унитарный
.
Необходимость такого преобразования
возникает, например, при выборке одного
из исполнительных устройств,
мультиплексирующих шину BUS его номеру.

Пусть, например,
требуется, преобразовать 3-битный
двоичный код из регистра R4 в 8-битный
унитарный:

;ВЕРСИЯ ДЛЯ
МК48
DECODE: CLR A ;СБРОС АККУМУЛЯТОРА

CLR С
;СБРОС ФЛАГА ПЕРЕНОСА

CPL С
;УСТАНОВКА ФЛАГА ПЕРЕНОСА
ROTАТЕ: RLC А ;СДВИГ УНИТАРНОГО
КОДА

DJNZ
R4,ROTATE ;ДЕКРЕМЕНТ И ЦИКЛ, ПОКА НЕ НУЛЬ

Преобразование
осуществляется путем “вдвигания”
единицы из флага переноса. Результат
формируется в аккумуляторе за N сдвигов
(где N-эквивалент исходного двоичного
кода). Недостатком приведенной программы
является то, что для преобразования N =
0 понадобится 256 шагов. Избежать этого
можно, модифицировав программу DECODE
следующим
образом:

DECODE: INC R4 ;ИНКРЕМЕНТ
ИСХОДНОГО КОДА

МOV
A,#80H ;УСТАНОВКА СТАР1ЕГО БИТА АККУМУЛЯТОРА

ROTATE: RL А
;СДВИГ УНИТАРНОГО КОДА

DJNZ R4,ROTATE ;ДЕКРЕМЕНТ
ПОЗИЦИОННОГО КОДА,
; И
ЦИКЛ, ПОКА НЕ О

Преобразование в
этом случае осуществляется за N + 1
сдвигов.

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

Пусть требуется
выполнить преобразования 8-битного
двоичного числа в двоично-десятичное.
Исходный двоичный код хранится в
аккумуляторе. Результат преобразования
состоит из 12 бит: младшие 4 бита – единицы,
представляют собой остаток от деления
исходного числа на 10; следующее 4 бита
– десятки, представляют собой остаток
от на 10 полученного частного; старите
4 бита – сотни, являются остатки от второго
деления:

;ВЕРСИЯ ДЛЯ МК48

ВВD: CALL DIVIO
;ДЕЛЕНИЕ ИСХОДНОГО КОДА НА 10

MOV R7,A ;СОХРАНЕНИЕ ОСТАТКА В R7

MOV A,R1 ;ЗАГРУЗКА В АККУМУЛЯТОР
ЧАСТНОГО
CALL DIV10 ;ДЕЛЕНИЕ
ЧАСТНОГО НА 10
SWAP А
;ПЕРЕДАЧА ОСТАТКА В СТАРШУЮ

;
ТЕТРАДУ АККУМУЛЯТОРА
ORL A,R7
;ПЕРЕДАЧА R7 В МЛАДШУЮ ТЕТРАДУ

;
АККУМУЛЯТОРА

JMP EXIT
;ВЫХОД ИЗ ПРОЦЕДУРЫ

;ПОДПРОГРАММА
ДЕЛЕНИЯ НА 10
; ИСХОДНЫЙ ДВОИЧНЫЙ КОД
В АККУМУЛЯТОРЕ
; РЕЗУЛЬТАТ: В RI – ЧАСТНОЕ,
В АККУМУЛЯТОРЕ – ОСТАТОК
DIV10: MOV R1,#0
; CБPOC R1

SUBlO: ADD A,#(NOT(10)+l)
;ВЫЧИТАНИЕ 10 ИЗ ДЕЛИМОГО

INC Rl ;ИHKРEMEHT ЧАСТНОГО

JC SUBIO ;ЦИКЛ, ЕСЛИ ОСТАТОК
>=0
DEC Rl
;ВОССТАНОВЛЕНИЕ ЧАСТНОГО

ADD A,#10 ;ВОССТАНОВЛЕНИЕ ОСТАТКА
RET ;ВОЗВРАТ
EXIT:
….

В результате
выполнения процедуры в младшей тетраде
Rl хранятся сотни, в аккумуляторе —
десятки и единицы двоично-десятичного
эквивалента исходного двоичного числа.

Обратное преобразование
(из двоично-десятичного кода в двоичный)
осуществляется делением исходного
числа на 16 по правилам десятичной
арифметики. Программа преобразования
приведена ниже. Исходный двоично-десятичный
код хранится в аккумуляторе. После
окончания работы программы в А находится
двоичный эквивалент исходного
двоично-десятичного числа.

Программа универсальна
и может выполняться в МК48 и в МК51, так
как команда DIV АВ (МК51) не может быть
использована для деления чисел по
правилам десятичной арифметики:

BBD: MOV R2,A ;ДЕЛЕНИЕ
ИСХОДНОГО КОДА НА 16

SMAP А
;ПЕРЕДАЧА ОСТАТКА В СТАРШУЮ ТЕТРАДУ

;АККУМУЛЯТОРА

ORL A,Rl
;ЗАГРУЗКА ЧАСТНОГО В МЛАД1УЮ ТЕТРАДУ

;АККУМУЛЯТОРА

SMAP А
;ФОРМИРОВАНИЕ РЕЗУЛЬТАТА В АККУМУЛЯТОРЕ

JMP ЕХIT.
;ВЫХОД ИЗ ПРОЦЕДУРЫ ПРЕОБРАЗОВАНИЯ

;ПОДПРОГРАММА ДЕСЯТИЧНОГО
ДЕЛЕНИЯ НА 16

; ДЕЛИМОЕ –
В АККУМУЛЯТОРЕ

; РЕЗУЛЬТАТ: ЧАСТНОЕ
– В Rl, ОСТАТОК – В АККУМУЛЯТОРЕ

DIV16: MOV Rl,#t0
;СБРОС ЧАСТНОГО

SUB16: ADD А,#84Н
;ВЫЧИТАНИЕ ИЗ ДЕЛИМОГО ЧИСЛА 16,

; ПРЕДСТАВЛЕННОГО В ДЕСЯТИЧНОЙ
СИСТЕМЕ
DA A
;КОРРЕКЦИЯ
INC Rl ;ИНКРЕМЕНТ
ЧАСТНОГО
JC SUB16 ;ЦИКЛ,
ЕСЛИ ОСТАТОК >=0
DEC Rl
;ВОССТАНОВЛЕНИЕ ЧАСТНОГО
ADD
A,#16H ;ВОССТАНОВЛЕНИЕ ОСТАТКА

DA A ;КОРРЕКЦИЯ

RET ;ВОЗВРАТ
EXIT: …

Кроме рассмотренного
способа преобразования чисел из одной
системы счисления в другую можно
воспользоваться более медленным, но
зато и более простым способом “двух
счетчиков”. При этом способе из
исходного кода вычитается, а к новому
коду прибавляется по единице до обнуления
исходного кода, причем вычитание
осуществляется в “старой”, а прибавление
— в “новой” системе счисления.
Пример программы преобразования
двоичного числа в двоично-десятичное
методом двух счетчиков приводится ниже.
Для упрощения программы принято, что
исходное двоичное число, заданное в А,
не превышает его десятичного эквивалента
99:

;ВЕРСИЯ ДЛЯ МК48

BBD: MOV R2,A
;ПЕРЕДАЧА ИСХОДНОГО КОДА B R2

CLR А
;СБРОС АККУМУЛЯТОРА
CDNV: ADD A,#l
;ИНКРЕМЕНТ “НОВОГО” КОДА

DА А
;КОРРЕКЦИЯ

DJNZ R2,CONV
;ДЕКРЕМЕНТ ИСХОДНОГО КОДА И ЦИКЛ, ЕСЛИ
НЕ НУЛЬ
EXIT: — ;ВЫХОД
ИЗ ПРОЦЕДУРЫ

После выхода из
процедуры в А находится двоично-десятичный
эквивалент исходного двоичного кода.

6.5.2. Преобразования
параллельных и последовательных кодов

Преобразование
данных из параллельного кода в
последовательный
.

Наиболее важным
применением процедур преобразования
формы представления данных
“параллельный/последовательный”
является связь с удаленными датчиками,
исполнительными механизмами и другими
МК по однопроводным линиям передачи
информации. Обычно при передаче байта
данных в прямом последовательном коде
для обеспечения согласования работы
приемника и передатчика используют
старт-стопный
(асинхронный) режим
обмена. Передача последовательного
кода байта предваряется посылкой
старт-бита (1) и завершается выдачей
стоп-бита (1).

Процедура выдачи
одного бита последовательного кода
реализуется выдачей в линию передачи
статического сигнала 0 или 1 и вызовом
подпрограммы временной задержки заданной
длительности.

В МК51 имеются
средства аппаратурного преобразования
параллельного кода в последовательный
с использованисм УАПП. Вся процедура
преобразования параллельного кода в
последовательный сводится при этом к
одной команде передачи байта в буфер
УАПП: MOV SBUF,A.

Преобразование
данных из последовательного кода в
параллельный


Эта процедура является составной
частью процедуры приема информации в
последовательном коде. При обмене
информацией в последовательном коде
необходима предварительная настройка
приемника на начало слова. При асинхронном
обмене процедура настройки сводится к
ожиданию
старт-бита.

После обнаружения
старт-бита на входе приемника начинается
преобразование кода, совмещенное с
процедурой ввода последовательного
кода. МК48 обеспечивает прием бита
последовательного кода и его распознавание
(конкретный вид этого блока зависит от
способа представления бита информации
в последовательном коде).

При длине слова не
более 8 бит для формирования параллельного
кода удобно воспользоваться аккумулятором;
тогда дешифрированный бит “вдвигается”
в аккумулятор через флаг переноса.
Поскольку последовательный код
принимается младшими битами вперед,
сдвиг параллельного кода осуществляется
вправо. Аккумулятор предварительно
сбрасывается, а после N сдвигов (где N —
разрядность слова, передаваемого в
последовательном коде) в нем фиксируется
параллельный код принятого слова данных.

Для обеспечения
временного согласования работы приемника
и передатчика, а также для снижения
вероятности неправильного приема
сигнала при вводе стартовый бит после
его обнаружения необходимо стробировать
в середине интервала его представления.
С этой целью программа повторяет анализ
старт-бита через время, равное половине
периода бита, и если старт-бит не
подтвердился, то процедура ожидания
повторяется.

В МК48 для приема
последовательного кода удобно использовать
тестовый вход ТО. Опрос входа ТО
повторяется через время Т, равное периоду
представления бита и смещенное на
полпериода относительно его начала.
Для синхронизации приема/передачи
подпрограмма DELAYÒ приемника должна
реализовать ту же самую задержку, что
и подпрограмма DELAYT передатчика.

В МК51 прием
последовательного кода в УАПП и его
преобразование в параллельный код
инициируются старт-битом и выполняются
aппаратными средствами без участия
программы. Основная программа МК51
должна только считать содержимое буфера
УАПП после завершения приема очередного
байта.

7.2. Вывод и
отображение информации

1.
Индикаторы.
Многие
МК-устройства требуют наличия только
простей­шей индикации типа ДА/НЕТ,
ВКЛ/ВЫКЛ. Такая индикация реали­зуется
на основе отдельных светодиодов. 1

Семисегментные
индикаторы
(ССИ)
широко используются для отображения
цифровой и буквенной информации. Семь
отображающих элементов позволяют
высвечивать десятичные и шестнадцатеричные
цифры, некоторые буквы русского и
латинского алфавитов, а также некоторые
специальные знаки. Структура ССИ и
способы его подклю­чения к МК показаны
на рис. 7.4. Для засветки одного сегмента
большинства типов ССИ необходимо
обеспечить протекание через сег­мент
тока 10—15 мА при напряжении 2,0—2,5 В.
Низкая нагрузочная способность МК не
допускает прямого соединения с ССИ. В
качестве промежуточных усилителей тока
могут использоваться логические
эле­менты серии К155 или интегральные
схемы преобразователей кодов для
управления ССИ.

Преобразование
двоичных кодов в коды для ССИ может
осуществ­ляться либо программно, либо
аппаратурно с использованием
преоб­разователей К514ИД1, К514ИД2, 133ПП4,
564ИД5.

ПРИМЕРЫ ПОДКЛЮЧЕНИЯ
ВНЕШНИХ УСТРОЙСТВ

Схема расширения
портов ввода-вывода с использованием
микросхемы КР580ВР43

Схема подключения
внешней памяти программ с использованием
ИС К573РФ5

Схема подключения
внешней памяти программ с использованием
ИС К573РФ6

Схема подключения
внешней памяти данных с использованием
ИС КР537РУ8

Схема увеличения
числа источников прерывания ОМЭВМ

ИСПОЛЬЗОВАННАЯ
ЛИТЕРАТУРА

  1. Проектирование
    цифровых устройств на однокристальных
    микроконтроллерах/ В.В. Сташин,
    А.В. Урусов, О.Ф. Мологонцева. – М.:
    Энергоатомиздат, 1990. – 224 с.

  2. Однокристальные
    микроЭВМ/Борыкин А.В., Липовецкий Г.П.,
    и др. – М.: МИКАП, 1994. – 400с.

Добавить комментарий