Низкочастотный частотомер
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
?ри такой организации центральный процессор может считывать информацию словами или отдельными байтами.
4.5 Контроллер клавиатуры и индикации
Контроллер КР580ВВ79 предназначен для ввода данных в микропроцессор с клавиатуры и вывода из микропроцессора на индикаторный дисплей. Микросхема состоит из двух функционально автономных частей: клавиатурной и дисплейной. Индикаторная часть имеет свое ОЗУ 16х8 бит, которое также можно использовать, как два ОЗУ 16х4 бита. Оно хранит воспроизводимые на индикаторе символы, загружается и опрашивается микропроцессором. Индикатор может быть основан как на светодиодах, жидких кристаллах, так и на простых лампочках. Контроллер поддерживает 2 типа вводов: ввод слева, ввод справа со сдвигом (как на калькуляторах).
Программирование
Устройство будет работать в режиме восьмиразрядного восьмисимвольного дисплея, для выбора индикатора будет использоваться внешний дешифратор. Для чего составим управляющие слова, по следующей схеме:
Тогда управляющее слово примет вид: 00000000, где младшие три бита для нас не имеют значения, так как управляют клавиатурой. 3-4 биты задают режим дисплея - 8 символьный 8 разрядный, со вводом слева (00). Старшие биты определяют команду, в данном случае 000 - инициализация.
4.6 Интервальный таймер
Микросхема КР580ВИ54 - трехканальное программируемое устройство (таймер), предназначено для организации работы микропроцессорных систем в режиме реального времени. Микросхема формирует сигналы с различными временными параметрами.
Программируемый таймер (ПТ) реализован в виде трех независимых 16-разрядных каналов с общей схемой управления. Каждый канал может работать в шести режимах.
Управляющее слово определят режим работы канала, тип счета, формат чисел. Обмен информацией с микропроцессором осуществляется по 8-разрядному двунаправленному каналу данных.
Программирование
Все три канала таймера будут работать во втором режиме (импульсный генератор частоты, с автозапуском). Запись и чтение будут производиться попарно, начиная с младшего байта, режим счета - двоичный
Для чего составим управляющие слова, по следующей схеме:
Тогда управляющие слова примут вид: 00110100, 01110100, 10110100 соответственно.
Старшие 2 бита каждого из них определяют канал (00-0, 01-1, 10-2), младший бит определяет 16 разрядный счет (0), 1-3 биты определяют режим канала, для всех каналов режим 2 (010). 4-5 биты определяют, что загрузка и выгрузка информации будет проходить двумя подряд идущими байтами, причем первыми будут младшие разряды.
После загрузки управляющих слов необходимо загрузить константы пересчета (см. код программы). В данном случае первый канал содержит константу пересчета, отвечающую за деление частоты до одного микрогерца:
Что позволит отсчитывать каждую тысячную секунды для обеспечения точности измерений, указанной в задании.
Второй канал таймера будет накапливать отчеты, рассчитанные выше, ориентируясь на выход первого таймера.
Третьим каналом таймера будет приниматься внешний импульс для дальнейшей обработки.
5.Текст программы
Init:
;-------------------------------
;Обнуление
;-------------------------------AX,AXDS,AX;сегмент данных = 0
;-------------------------------
;Инициализация IOP
;-------------------------------[0401h],AL;10 канал адреса=0 (выбор IOP), 0 канал=1(управление)
;AL=0 - нулевой режим дисплея
:
;-------------------------------
;Инициализация таймера
;-------------------------------BX,0400h;11 канал адреса (выбор таймера)[BX+3],34h;0 и 1 каналы = 1 (управление)
;канал 0, запись 2 байт, 2 режим, двоичный счет[BX],18h;1318h константа пересчета для точности[BX],13h[BX+3],74h;канал 1, запись 2 байт, 2 режим, двоичный счет[BX+1],FFh;FFFFh максимальная константа пересчета[BX+1],FFh[BX+3],B4h;канал 2, запись 2 байт, 2 режим, двоичный счет
MOV [BX+2],FFh[BX+2],FFh
ReadSignal:
;-------------------------------
;Считать внешний сигнал
;-------------------------------BX,0400h;Выбор таймера[BX+3],80h;Извещаем таймер о чтении третьего каналаCL,[BX+2];Читаем младший байтCH,[BX+2];Читаем старший байт
SUB CX,FFFFh;Инвертируем результат (таймер обратносчетный)
;-------------------------------
;Считать результат измерений
;-------------------------------[BX+3],40h;Извещаем таймер о чтении второго каналаDL,[BX+2];Читаем младший байтDH,[BX+2];Читаем старший байт
SUB DX,FFFFh;Инвертируем результат (таймер обратносчетный)
;-------------------------------
;Поступил сигнал?
;-------------------------------CX,1CheckFreq;Да
;Нет - далее
;-------------------------------
;Результат выше предела измерений?
;-------------------------------CX,0DisplayErrorDX,7530h;7530h=30 000 (10 Герц при учете кванта в 0,001 сек)ReadSignal;Нет - перейти на чтение сигнала
:
;-------------------------------
;Вывод сообщения об ошибке
;-------------------------------BX,0400h;Выбор IOPAX,AX;Очищаем AX[BX+1],90h;Извещаем IOP о записи в память дисплея[BX],AL;Очищаем дисплей (5 ячеек)
MOV [BX],AL[BX],AL[BX],AL[BX],AL
JMP InitTimer;Перейти к инициализации аймера
:
;-------------------------------
;Результат ниже предела измерений?
;-------------------------------DX,03E8h;03E8h=1 000(1 Герц при учете кванта в 0,001 сек)DisplayError;Да - перейти на отображение ошибки
;-------------------------------
;Расчет частоты
;-------------------------------DX,000Fh;Эти две команды устанавливают DX:AX в 1 000 000AX,4240hCX;Делим 1 000 000 на период в мсек,
;получаем частоту в AX в мГц
;-------------------------------
;Вывод частоты
;-------------------------------BX,0400h;Выбор IOP[BX+1],90h;Извещаем IOP о записи в память дисплеяCX,0Ah;Для вывода на дисплей будем делить на 0Ah, тоесть на
DX, DX;Обнуляем DX для деления, в AX уже нужное число
DI