Семенов Ю. Б., Жучко В. Е.
Разработанная в стандарте PCI карта обеспечивает возможность работы с
Крейт-контроллерами КАМАК КК009, КК012 и К106.
Карта имеет встроенный процессор,
разработанный специально для работы с крейтом КАМАК, и встроенную
память FIFO (первый пришел первый ушел ) объемом 1024 32 битных слов
для считываемых с КАМАК данных. При работе встроенного процессора
компьютер освобожден от рутинной работы по обслуживанию крейтов.
Тактовая частота встроенного процессора – 33 мГц, поэтому время
обслуживания крейтов определяется только скоростью КАМАК. Программа
самого компьютера берет данные с буферной памяти FIFO, поэтому возможна
работа под операционной системой Windows.
Также карта может работать в режиме
аналогичном работе карте прототипа при минимальной переделке старого
программного обеспечения. Необходимость переделки связана с тем что
стандарт PCI не позволяет пользователю задать ”базовый адрес”
устройства – его устанавливает BIOS, поэтому программа должна
использовать именно это значение.
Что касается прерывания то программа должна использовать считанный из
конфигурационного пространства номер прерывания (адрес 3СH
конфигурационного пространства -
IntLine) – при этом некоторые BIOS позволяют пользователю задать в
SETUP номер прерывания для конкретного слота PCI. Следует отметить, что
при использовании Win32 драйвера TvicPci необходимость в знании номера
прерывания отпадает, так как детали обслуживания прерываний драйвер
берет на себя.
Конфигурационное пространство карты
Первые 64 строки (3Сh..00h) конфигурационного пространства имеют жестко
заданный формат.
|
31……………………………………....16
|
15……………………………………………0
|
00H |
U N I T (1270 H) |
Manufactured ID(1093 H) |
04H |
Status |
Command |
08h |
Class (05H)
Code(80H) |
Revision(01H |
0CH |
BIST |
Header |
Latency |
CLS |
10H |
Базовый адрес контроллера КАМАК |
... |
Base Address Register |
24H |
Reserved |
28H |
Reserved |
2CH |
Expansion ROM Base Address |
30H |
Reserved |
34H |
Reserved |
3CH |
MaxLat |
MinGNT |
IntPin |
IntLine |
Оставшиеся строки могут быть использованы пользователем по собственному
усмотрению.
40H |
31……………………………………….…………1 |
0 |
|
Enable card |
бит разрешения работы - Пока он ноль карта реагирует только на команды
чтения/записи конфигурационного пространства, поэтому первое действие
программы должно быть - установка этого бита в 1. |
Пространство памяти занимаемое в компьютере
Со стороны компьютера карта представляет область памяти обьемом FFFFh.
Base_adr + 0000
---------------
Base_adr + 7FFF
|
Пространство памяти контроллера К106 --- 0000….1FFF
Или
Пространство памяти контроллера КК009 --- 0000….7FFF
Работа в данном пространстве аналогично
работе с
Контроллером – прототипом
Данное пространство всегда
доступно, однако при работе
встроенного процессора программист должен предусмотреть
невозможность
одновременного заказа цикла КАМАК из 2-х программ. |
Base_adr + 8000
--------------------
Base_adr + 82FF |
Память программы встроенного процессора, 768 слов, RW
Перед работой необходимо установить Reset встроенного процессора |
------------- |
|
Base_adr + A000 |
Данные с FIFO, RO |
Base_adr + A004 |
31…………………………………12 |
11……………………0 |
|
Кол-во слов хранящихся в FIFO |
|
Base_adr + A008 |
31…………………………………12 |
11……………………0 |
|
Граница FIFO |
Количество
слов в FIFO превышение которого вызывает прерывание 0
– хотя-бы 1 слово вызывает прерывание, 1024 – прерывания нет никогда |
Base_adr + A00C |
Регистр прерываний
31……3 |
2 |
1 |
0 |
|
INT от встроенного процессора |
INT FIFO |
INT LAM |
|
Base_adr + A010 |
Регистр масок прерываний
31……3 |
2 |
1 |
0 |
|
Маска прер от встр. Процессора |
Маска FIFO |
Маска LAM |
|
Base_adr + A014 |
31…………………………………1 |
0 |
|
Bit Enable встроенного процессора |
0 – Reset
встроенного
процессора, 1 –
Reset снят, Работа
|
Base_adr + A018 |
31………………………………16 |
15…………………………………0 |
|
Регистр совместного доступа |
16 разрядный регистр доступный для записи со стороны компьютера и для
чтения со стороны внутреннего процессора |
Base_adr + A01C |
31………………………………16 |
15…………………………………0 |
Адрес предпоследней команды |
Адрес последней команды |
2 12 разрядных регистра содержащих адреса команд встроенного
процессора, выполняемых в данный момент, полезно для отладки. |
Base_adr + A100+RxN*4 |
31………………………………16 |
15…………………………………0 |
|
Содержимое регистра RxN |
По этим адресам можно прочитать текущее значение внутреннего 16
битового регистра с номером N, где N в диапазоне 0..15 |
Встроенный процессор
Встроенный процессор разработан специально для обслуживания крейтов
КАМАК. Он содержит программную память объемом 768 строк, шестнадцать
16-разрядных регистров общего назначения (номера 0 - 15). Считанные с
крейтов данные записываются процессором в буферную память FIFO для
последующего чтения программой компьютера.
Тактовая частота процессора 33 мГц, поэтому все его действия
практически мгновенны в сравнении с циклом КАМАК. Все команды
(естественно за исключением цикла КАМАК) выполняются за один такт.
Список и формат ассемблерных команд процессора
31..24 |
Мнемоника команды и её краткое описание |
23..20 |
19..16 |
15 |
14..0 |
00
|
NOP - Нет операции, процессор перейдёт к следующей
команде
через 33 нсек |
Команды работы с КАМАКом
01 |
w_ CNAF Rx, admov Rx, [ad] |
Запись в КАМАК адрес из регистра Rx |
|
Номер регистра |
Адрес команды КАМАК |
02 |
r_ CNAF Rx, admov [ad], Rx |
Чтение из КАМАК адреса в регистр Rx |
|
Номер регистра |
Адрес команды КАМАК |
03 |
out_CNAF lv, adfifo lv, [ad] |
Чтение из КАМАК адреса в память FIFO, Метка будет
записана в
старшие 16 бит |
Метка, 8 бит |
Адрес команды КАМАК |
04 |
rout_CNAF Rx, adfifo Rx, [ad] |
Чтение из КАМАК адреса в память FIFO, Содержимое
регистра
будет записано в старшие 16 бит |
|
Номер регистра |
Адрес команды КАМАК |
Команды переходов
10 |
Jmp adr |
Безусловный переход по адресу/смещению |
|
|
Адрес/Смещение |
12 |
jnr Rx, Rx, adrjz Rx, Rx, adr |
Переход по адресу/смещению если логическое
произведение
регистров равно 0 |
Номер регистра |
Номер регистра |
Адрес/Смещение |
13 |
jr Rx, Rx, adrjnz Rx, Rx, adr |
Переход по адресу/смещению если логическое произведение
регистров не равно 0 |
Номер регистра |
Номер регистра |
Адрес/Смещение |
14 |
jnb nb, Rx, adr |
Переход по адресу/смещению если бит nb в
регистре
равен 0 |
Номер регистра |
Номер регистра |
Адрес/Смещение |
15 |
jb nb,Rx,adr |
Переход по адресу/смещению если бит nb в
регистре не
равен 0 |
Номер регистра |
Номер регистра |
Адрес/Смещение |
16 |
jnd adr |
Переход по адресу/смещению если таймер задержки равен 0
|
|
|
Адрес/Смещение |
17 |
jd adr |
Переход по адресу/смещению если таймер задержки не
равен 0 |
|
|
Адрес/Смещение |
18 |
jnl adr |
Переход по адресу/смещению если нет LAM в крейте |
|
|
Адрес/Смещение |
19 |
jL adr |
Переход по адресу/смещению если есть LAM в крейте |
|
|
Адрес/Смещение |
Команды вызова подпрограмм
20 |
сall adr |
Безусловный переход по адресу/смещению |
|
|
Адрес/Смещение |
22 |
call _nr Rx, Rx, adrcz Rx, Rx, adr |
Вызов по адресу/смещению если логическое произведение
регистров равно 0 |
Номер регистра |
Номер регистра |
Адрес/Смещение |
23 |
call _r Rx, Rx, adrcnz Rx, Rx, adr |
Вызов по адресу/смещению если логическое произведение
регистров не равно 0 |
Номер регистра |
Номер регистра |
Адрес/Смещение |
24 |
call _nb nb, Rx, adrcb Rx, Rx, adr |
Вызов по адресу/смещению если бит в регистре равен 0 |
Номер бита |
Номер регистра |
Адрес/Смещение |
25 |
call _b nb, Rx, adrcnb Rx, Rx, adr |
Вызов по адресу/смещению если бит в регистре не равен 0 |
Номер бита |
Номер регистра |
Адрес/Смещение |
26 |
call _nd adrcnd adr |
Вызов по адресу/смещению если таймер задержки равен 0 |
|
|
Адрес/Смещение |
27 |
call _d adrcd adr |
Вызов по адресу/смещению если таймер задержки не равен
0 |
|
|
Адрес/Смещение |
28 |
call _ nl adrcnl adr |
Вызов по адресу/смещению если нет LAM в крейте |
|
|
Адрес/Смещение |
29 |
call _ l adrcl adr |
Вызов по адресу/смещению если есть LAM в крейте |
|
|
Адрес/Смещение |
Команды работы с регистрами
30 |
set_reg Rx, lvmov lv, Rx |
Ввести данные lv в регистр Rx |
|
Номер регистра
|
Данные |
31 |
Incr Rx Rx++ |
Увеличить значение регистра на 1 |
|
Номер регистра |
|
32 |
Decr Rx Rx-- |
Уменьшить значение регистра на 1 |
|
Номер регистра |
|
33 |
Andr Rx, lv |
Логическое произведение регистра с данными lv,
результат в регистре |
|
Номер регистра |
Данные |
34 |
Or Rx, lv |
Логическое или регистра с данными, результат в регистре |
|
Номер регистра |
Данные |
35 |
ex_reg Rx |
Записать в регистр содержимое регистра совместного
доступа |
|
Номер регистра
|
|
Команды для работы с памятью FIFO
40 |
out_metka fifo Rx, lv |
Записать в FIFO метки и регистра |
|
Номер регистра
|
Метка, 8 разрядов |
41 |
out_regs fifo rx, rx |
Записать в FIFO содержимое регистров |
Номер регистра
|
Номер регистра |
|
42 |
out_time fifo_t |
Записать в FIFO значение внутреннего таймера |
43 |
out_stime fifo_st |
Записать в FIFO значение внутреннего таймера,
сохранённое
командой save_time |
44 |
out_adr fifo_pc |
Записать в FIFO текущее значение программного счётчика |
60 |
RET |
Команда возврата из подпрограммы |
70 |
save_time |
Сохранить во внутреннем регистре текущее значение
таймера |
80 |
Delay Val |
Установить значение таймера задержки для
соответствующих
команд перехода/вызова |
Val - 24 разряда данных для задержки, мксек. |
90 |
set_INT Intr |
Установить флаг прерывания от внутреннего процессора |
|
KK009(n, a, f) |
Макрокоманда для формирования КАМАК адреса, n –
номер
станции, a – субадрес команды, f – функция. Параметры
могут быть заданы как в виде hex или dec чисел так и
ранее описанными символьными константами. |
End. |
Обозначение конца компилируемого кода, начиная с этой
строки
текст программы будет игнорироваться. |
Stop |
Остановить выполнение программы на данной команде,
эквивалентно команде jmp $, полезно при отладке программ |
Все команды записи в память FIFO будут работать, если FIFO не заполнено
полностью, в противном случае процессор остановится и будет ждать
освобождения хотя бы одной ячейки.
КОМПИЛЯТОР ДЛЯ ВНУТРЕННЕГО ПРОЦЕССОРА
Вышеописанные команды имеют более удобную мнемонику при работе с
компилятором.
Каждая строка программы может содержать только один оператор и
комментарий к программе. Комментарий может начинаться с символов ; или
//, всё что написано в строке после этих знаков будет игнорироваться.
Если требуется закомментировать несколько строк, можно использовать
пару скобок /*… */, аналогично языку СИ. Операторы программы могут быть
записаны заглавными или прописными символами, значение это не имеет.
Синтаксис компилятора позволяет использовать символьные константы для
обозначения данных и относительные или абсолютные адреса/метки в
командах перехода или вызова подпрограмм. Присвоение значения константе
аналогично СИ. Константы могут быть заданы в десятичном или
шестнадцатеричном виде 0x234. Символьная переменная – по обычным
правилам для любого языка программирования, состоит из букв английского
алфавита и цифр, должна начинаться с буквы: Пример:
A12=5 //
Это комментарий
ABC45=98 ; Это комментарий
N=0x4004 /* Это комментарий
на две строки */
Внутренние регистры процессора имеют обозначения Rn, Rx, где n или x –
номер регистра в диапазоне от 0 до 15.
- Метки для команд перехода записываются аналогично
символьным
константам и должны содержать в конце символ : (двоеточие), после метки
может стоять оператор языка, комментарий или пустая строка:
-
Metka1: set_reg r1,15
-
Jmp metka1
- Команды перехода могут содержать абсолютные адреса в виде
констант, меток, описанных до или после команды перехода или в виде
относительного адреса, содержащего символ $
- Пример:
- Jmp $-5 // перейти на команду с адресом PC-5, где
PC –
адрес этой команды
- Jmp $+2 // перейти на команду с адресом PC+2, где
PC –
адрес этой команды
- Присвоение значений регистрам возможно разными операторами,
lvalue
- константа:
- set_reg r2, lvalue // r2 - lvalue
- R2=lvalue // r2 - lvalue
- mov lvalue, r2 // r2 - lvalue
Для удобства работы с КАМАК адресами можно использовать макрокоманду КК009(n,
a, f), где параметры n, a и f – символьные
константы для номера станции, субадреса и функции соответственно.
Параметры могут быть заданы непосредственно в макрокоманде или быть
заданы ранее в виде символьных констант: N=6
F=26
Naf26=KK009(N, 0, F) // команда F26 для станции номер N (9 в
данном
примере)
R_cnaf r0, Naf26 // выполнение КАМАК цикла
- Команда Mov. Эта команда возможна в следующих
вариантах:
- mov lvalue, r2 // запись значения в регистр
- mov r1, [address] // запись содержимого регистра
R1 в
КАМАК по адресу address, где address может быть в виде
константы или макрокоманды, например: mov r1, [KK009(1,0,16)]
- Команда Fifo для работы с памятью FIFO, в правой
колонке
- синоним:
- fifo lv, [adr] out_cnaf
lv, adr
- fifo R1, [adr] rout_cnaf R1, adr
- fifo R1, R2 out_regs
R1, R2
- fifo R1, Data out_metka R1, Data
- fifo_t
out_time
- fifo_st
out_stime
- fifo_pc
out_adr
- Команды для работы с регистрами
- R1++
incr r1
- R1--
decr r1
- R1=data
mov data, r1 или set_reg r1, data
- r1=KK009(4, 0,
0) mov [KK009(4, 0,
0)],r1 или r_cnaf r1,KK009(4, 0, 0)
- Для использования в командах символьных констант, они
должны быть
описаны до этого момента, после этого в любом месте программы допустимы
некоторые операции над ними, data=67 – предварительно задано:
- data++ // data=68
- data— // data=66
- data+=5 // data=72
- data-=4 // data=63
- Команда Stop – синоним команды jmp $
- Команда end. – служит для обозначения конца
транслируемого текста, текст программы после этой строки игнорируется и
не транслируется.
Пример программы проверки блока АЦП стоящего в станции №6:
N=6
A=0
F=0
Call
Init
Loop: |
Mov |
[KK009(N, A, 8)], R0 |
// проверка наличия Q от АЦП |
|
Jnb |
1, r0, Loop |
// если нет бита 1 то переход на метку Loop |
|
Mov |
[KK009(N, A, F)], r1 |
// читаем в регистр r1 данные из АЦП |
|
Fifo |
0, R1 |
// посылаем прочитанное в FIFO |
|
Jmp |
Loop |
// продолжаем опрос |
Init: |
r0=1 |
|
|
mov r0, [4] |
// init crate |
|
delay 10 |
|
|
jd $ |
// wait 10 mksec |
|
mov r0, [9] |
// Z |
|
mov r0, [11] |
// C |
|
mov r0, [0] |
// Choice |
|
delay 10 |
|
|
jd $ |
// wait 10 mksec |
|
mov r0, [15] |
// inhibit off |
|
ret |
|
Программа PciTest
Программа PciTest предназначена для работы с вышеописанным
интеллектуальным PCI КАМАК-контроллером, состоящим из интерфейсной PCI
платы и КАМАК модуля КК009 или КК012, соединённых соответствующим
кабелем.
На снимке показана первая страница программы:

На этой странице находятся органы управления для режима полной
совместимости с контроллерами КК009-КК012. Используя функциональные
кнопки, находящиеся слева, можно послать в крейт команды управления Z,
C, Init, Choice и снять Inhibit с крейта №1. Описание и
назначение этих команд смотри в [1]. Две кнопки с надписями CNAF
и CNAF2 позволяют исполнить любые КАМАК команды, параметры
которых необходимо предварительно занести при помощи управляющих
элементов, находящихся под соответствующей кнопкой. Результат
выполнения команд чтения будет показан в окне Рез. для
соответствующей кнопки. Справа будут представлены Q и X
ответы для выполненных команд. Если модуль КАМАК может выставить LAM на
магистраль (например АЦП), то имеется возможность проверить работу
системы в режиме прерываний от этого блока, для этого необходимо
выставить
параметры команды для считывания информации из этого блока, если
необходима вторая команда для сброса LAM после команды чтения, то её
параметры заносятся в CNAF2, после этого необходимо нажать
переключатель Прерывания, считываемые данные будут представлены
на графике в нижней части программы. Для очистки графика служит кнопка Erase
Plot.
Для работы с внутренним процессором контроллера необходимо перейти на
страницу Внутренний процессор программы.

Нижняя часть страницы поделена на две половины: слева находится окно
редактора, служащее для написания текста программы внутреннего
процессора, справа – результат транслирования этой программы после
нажатия кнопки Compile. Кнопки Load и Save To
служат для загрузки/спасения программы из/в текстового файла. Клавиша Start
Processor запускает в работу созданную программу. Элемент FIFO
Length позволяет установить длину буфера FIFO контроллера, по
достижению которой будет выставлено прерывание. Для его использования
необходимо выставить маску на INT_FIFO, как показано на снимке,
а также в тексте программы должны быть команды записи в данных в буфер.
Программа PciTest будет обрабатывать прерывания и записывать в
текстовой файл считываемые из буфера данные. Затем эти данные можно
будет обработать любой другой программой.
Естественно, представленная программа предназначена для проверки
режимов работы контроллера и обучению программирования внутреннего
процессора.
Программа PciTest написана и отлажена с использованием Борланд
С++ билдера, версии 6.0. Для этой цели также создана компонента KK009Pci,
содержащая в себе всё необходимое для работы с контроллером
(компилятор, редактор, функции для работы с контроллером). По всем
вопросам, связанным с приобретением контроллеров и программного
обеспечения обращайтесь к авторам. |