Низкочастотный частотомер

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

?ри такой организации центральный процессор может считывать информацию словами или отдельными байтами.

 

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