47Модели памяти
Все функции библиотеки предполагают использование дальних указателей типа FAR, как для вызова процедур, так и для передачи адресов данных, поэтому компиляцию программы в языке Си желательно проводить в модели памяти LARGE, в которой по умолчанию используются дальние вызовы процедур и дальние указатели на данные. В директории \EXAMPLE.C\ находится драйвер, адаптированный под язык Си. В директории \EXAMPLE.PAS\ находится драйвер, адаптированный под язык Паскаль.
48Техническое сопровождение
Любые вопросы и замечания по библиотеке функций для платы АЦП Вы можете задать с 10.00 до 18.00 по будним дням по телефону: (095) 257-17-10, e-mail: SUPPORT@LCARD.RU или на нашем сайте: WWW.LCARD.RU.
ЗАО “Л-КАРД” гарантирует консультации по всем возникшим у Вас вопросам.
49Описание библиотеки функций
50Функции конфигурации
51Назначение
Функции общего назначения предназначены для уведомления драйвера (в дальнейшем под драйвером подразумевается библиотека функций для платы АЦП L-154) об установленной конфигурации платы с помощью перемычек. При помощи перемычек Вы можете изменить базовый адрес платы в пространстве ввода-вывода компьютера для работы с более, чем одной платой, и изменить номер линии прерывания, которое может генерироваться платой. По умолчанию драйвер настроен на базовый адрес 0x300 и на линию прерывания IRQ 3, при изменении этих параметров Вам следует сообщить о них драйверу, вызвав описываемые ниже функции с соответствующими параметрами. Функции общего назначения позволяют также проводить тест наличия платы в компьютере.
52Установка базового адреса (SETBASEADDRESS())
Формат вызова
void SETBASEADDRESS(int address);
Назначение
Устанавливает новый базовый адрес в пространстве PC для функций драйвера, переменная address должна быть равна одному из значений 0x300, 0x310, 0x330, 0x340 в соответствии с установленными перемычками на плате
Параметры
address -> значение базового адреса платы в компьютере
53Установка номера прерывания (INTR_SETUP())
Формат вызова
void INTR_SETUP(int irq_number);
Назначение
Сообщает драйверу о выбранном номере прерывания (IRQ3 - IRQ6) на плате. По умолчанию на плате установлен номер прерывания IRQ3 и драйвер изначально предполагает, что номер прерывания равен IRQ3.
Параметры
irq_number
irq_number = 0 -> IRQ3
irq_number = 1 -> IRQ4
irq_number = 2 -> IRQ5
irq_number = 3 -> IRQ6.
54Проверка наличия платы в компьютере (PLATA_TEST())
Формат вызова
int PLATA_TEST();
Назначение
Проводит диагностику наличия платы АЦП в компьютере. Возвращает нулевое значение в случае успешного тестирования присутствия платы и ненулевое значение в противном случае. Ненулевое значение означает, что либо плата отсутствует в компьютере, либо значение базового адреса платы не соответствует установленному через функцию SETBASEADDRESS().
Параметры отсутствуют
Возвращаемое значение
0 плата обнаружена
1 плата не обнаружена.
55Работа с аналоговыми каналами
56Назначение
Функции данного раздела служат для обеспечения ввода аналоговых сигналов в компьютер в различных программных режимах: в асинхронном режиме и в режиме синхронизации от установленного на плате таймера .
57Установка номера канала АЦП (SETCHANNEL())
Формат вызова
void SETCHANNEL(int Channel);
Назначение
Устанавливает канал АЦП Channel для последующего ввода функцией однократного асинхронного ввода SAMPLE().
Параметры
Channel -> номер канала АЦП (см, формат номера канала)
Пример
main()
{
int i;
SETCHANNEL(0xC0); // установим первый канал
i=SAMPLE(); // введем значение с канала
cprintf("Код АЦП = %d", i); // выведем его на экран
}
58Однократный асинхронный ввод с АЦП (SAMPLE())
Назначение
Осуществляет аналого-цифровое преобразование с канала АЦП, предварительно установленного при помощи функции SETCHANNEL(). Данной функцией удобно пользоваться для асинхронного одноканального ввода, когда не требуется переустанавливать номер канала.
Параметры отсутствуют.
Пример
main()
{
int i;
SETCHANNEL(0xC0); // установим первый канал
i=SAMPLE(); // введем значение с канала
cprintf("Код АЦП = %d", i); // выведем его на экран
}
59Однократный ввод с переустановкой канала АЦП (ADCHAN())
Формат
int ADCHAN(int Channel);
Назначение
Устанавливает заданный канал АЦП и осуществляет аналого-цифровое преобразование. Данная функция удобна для осуществления асинхронного ввода с разных каналов АЦП. Возвращает результат преобразования по каналу 'Channel'.
Параметры номер канала АЦП
Пример
main()
{
// введем значение с первого канала и выведем преобразованное
// значение кода в вольты
cprintf("\n\r Напряжение на канале %d = %f", 1, ADCHAN(0xC0)*5.12/2048);
}
60Однократный ввод последовательности каналов АЦП (KADR())
Формат
void KADR (int *Data, int *Channels, int Nch);
Назначение
Вводит Nch отсчетов с каналов АЦП, указанных в массиве Channels в массив Data. Т. е. если Вам, например, требуется ввести по одному значению с трех каналов АЦП, то Вы можете сформировать целочисленный массив Channels из 3 элементов, при этом первый будет равен коду для первого канала, второй для следующего и т. д.
Параметры
Data целочисленный массив, в который будут помещены результаты ввода с Nch каналов
Channels целочисленный массив с номерами каналов
Nch число каналов
Пример
main()
{
int i, Nch=3, Channels[16]={0xC0, 0xC1, 0xC2}, Data[16];
// введем первые три канала
KADR(Data, Channels, Nch);
// нарисуем на экране их значения в кодах АЦП (-2048 .. 2047)
for(i=0; i < 3; i++) cprintf("\n\r Канал N%d = %d", i+1, Data[i]);
}
61Одноканальный ввод с синхронизацией от таймера (STREAM())
Формат вызова
void STREAM (int *Data, int Npoint, int Channel, int Rate);
Назначение
Данная функция осуществляет считывание последовательности отсчетов с заданного канала АЦП с интервалом Rate между отсчетами.
Параметры
Data Целочисленный массив, в который будут помещены вводимые отсчеты
Npoint Число вводимых отсчетов (1 <= Npoint <= 32768)
Channel Номер канала АЦП, по которому будут вводится данные
Rate Интервал ввода в микросекундах
Пример
main()
{
int i, Data[100], Npoint=100, Channel=0xC0, Rate=20;
// введем 100 значений по первому каналу АЦП с интервалом ввода 20 мкс
STREAM(Data, Npoint, Channel, Rate);
// выведем на экран первые 10 введенных значений
for(i=0; i < 10; i++) cprintf("\n\rValue[%2d]=%5d", i+1, Data[i]);
}
62Многоканальный ввод с синхронизацией от таймера (SOFT())
Формат вызова
void SOFT(int *Data, int NPoint, int *Channels, int Nch, int Rate);
Назначение
Функция SOFT() осуществляет ввод NPoint кадров с Nch аналоговых каналов, номера которых передаются в целочисленном массиве Channels с интервалом Rate мкс между кадрами.
Под кадром подразумевается ряд отсчетов, состоящий из результатов последовательного опроса первых Nch каналов, указанных в массиве 'Channels'.
Параметры
Data Целочисленный массив, в который будут помещены вводимые отсчеты
Npoint Число вводимых кадров (1 <= Npoint*Nch <= 32768)
Channels Целочисленный массив с номерами каналов АЦП, по которым будут вводится данные
Nch Число каналов
Rate Интервал ввода
Пример
main()
{
int i, j, Data[100], Npoint=20, Channels[16]={0xC0,0xC1,0xC2,0xC3};
int Nch=4, Rate=100;
// ввод 20 кадров (20*4=80 отсчетов) по первым четырем
// каналам c интервалом 100 мкс между кадрами
SOFT(Data, Npoint, Channels, Nch, Rate);
// выведем первые два кадра
for(i=0; i < 2; i++) for(j=0, cprintf("\n\rКадр=%2d", i+1); j < Nch; j++)
cprintf("Канал #%2d=%5d, ", j+1, Data[i*Nch+j]);
}
63Цифро-аналоговые каналы
64Назначение
На плате АЦП установлен один Цифро - Аналоговый Преобразователь (в дальнейшем ЦАП), при помощи которого можно управлять внешними устройствами, генерировать сигналы произвольной формы и т. п.
65Асинхронный вывод на ЦАП (OUTDA())
Формат вызова
void OUTDA(int Code);
Назначение
Устанавливает выходное напряжение на ЦАПе в соответствии с кодом Code.
Параметры
Code - выводимый код на ЦАП (см. описание форматов данных).
Пример
main()
{
// выведем на ЦАП минимальное напряжение
OUTDA (0);
// выведем на ЦАП максимальное напряжение
OUTDA(4095);
}
66Синхронный одноканальный вывод на ЦАП (OUTDAARRAY())
Формат вызова
void OUTDAARRAY(int *Data, int Rate, int NPoint);
Назначение
Выводит NPoint отсчетов из массива Data на ЦАП с интервалом Rate
Параметры
Rate Интервал ввода в микросекундах
Npoint Число выводимых отсчетов
Data Массив с выводимыми отсчетами
Пример
#include
main()
{
int i, Data[1000], Rate=20, NPoint=1000;
// сгенерируем синус
for(i=0; i < NPoint; i++) Data[i]=2000.*sin(i*M_PI/80.)+2048;
// выведем его на ЦАП
DASTREAM(Data, Rate, NPoint);
}
67Цифровые ТТЛ линии
68Чтение восьми цифровых линий (INPBYTE())
Формат вызова
int INPBYTE();
Назначение
Возвращает состояние 8-ми внешних цифровых ТТЛ линий. При считывании ТТЛ линий автоматически генерируется цифровой строб на линии "Строб чтения цифрового порта" на внешнем разъёме.
Параметры
Отсутствуют
Пример
main()
{
int i;
// введем восемь ТТЛ линий
i=INPBYTE();
cprintf("\n\r Первая линия = %d", i & 1);
cprintf("\n\r Вторая линия = %d", (i >> 1) & 1);
cprintf("\n\r Третья линия = %d", (i >> 2) & 1);
cprintf("\n\r Четвёртая линия = %d", (i >> 3) & 1);
cprintf("\n\r Пятая линия = %d", (i >> 4) & 1);
cprintf("\n\r Шестая линия = %d", (i >> 5) & 1);
cprintf("\n\r Седьмая линия = %d", (i >> 6) & 1);
cprintf("\n\r Восьмая линия = %d", (i >> 7) & 1);
}
69Вывод на восемь цифровых линий (OUTBYTE())
Формат вызова
void OUTBYTE(int Code);
Назначение
Функция установки 8-ми цифровых ТТЛ линий в соответствии с битами младшего байта параметра 'Code'.
Параметры
Code - устанавливаемый код
Пример
main()
{
// выведем все нули
OUTBYTE(0);
// выведем все единицы
OUTBYTE(0xff);
}
70Работа с прерываниями
71Назначение
Ввод по прерываниям используется, как правило, при анализе процессов на медленных частотах ввода (до 10 кГц). Общая идеология ввода обычно сводится к следующему: плата генерирует прерывание в компьютер, в котором предварительно должен быть загружен драйвер-обработчик используемого платой прерывания, который после каждого вызова выполняет какую либо функцию (вводит с АЦП, выводит на ЦАП и т. п.).
72Генерирование прерываний (INITINTR())
Формат вызова
void INITINTR(int Rate1, int Rate2, interrupt *Vector);
Назначение
Программирует контроллер прерываний и плату для работы в режиме генерации установленного прерывания. После вызова процедуры INITINTR() плата генерирует прерывания с интервалом, равным произведению: Rate1*Rate2 мкс. которое обрабатывается драйвером-обработчиком, адрес которого передается в параметре Vector. Драйвер - обработчик должен позаботится о сбросе как контроллера прерываний компьютера, так и контроллера прерываний платы АЦП (см. Пример)
Параметры
Rate1, Rate2 Интервал генерирования прерываний (Rate1*Rate2 мкс)
Vector Адрес обработчика прерываний
Пример
Драйвер - обработчик прерывания IRQ от платы АЦП при каждом вызове вводит отсчет с первого канала АЦП и выводит его на экран.
// обработчик прерывания
void interrupt E_Interrupt(PARM)
{
int i;
// введем отсчет с АЦП
i=ADCHAN(0xC0);
// отобразим его на экране
cprintf("\n\rКод с АЦП = %5d", i);
// сбросим флаг прерывания на плате АЦП и в компьютере
RESET_IRQ();
}
// основная функция
main()
{
int Channel=0xC0;
// установим интервал между прерываниями 10000 мкс и
// адрес обработчика E_Interrupt
INITINTR (1000, 10, E_Interrupt);
// ждем пока не нажата клавиша
while(!kbhit());
// запретим прерывания от платы и восстановим
// контроллер прерываний
STOP_INTR();
}
73Сброс флага прерываний (RESET_IRQ)
Формат вызова
void RESET_IRQ(void);
Назначение
Драйвер-обработчик прерывания IRQ должен перед выходом из обработки прерывания сбросить регистр прерывания на плате и в компьютере. Для этого достаточно вызвать функцию RESET_IRQ().
Параметры Отсутствуют.
Пример См. Пример к SOFT_INTR.
74Выключение прерываний (STOP_INTR())
Формат вызова
void STOP_INTR(void);
Назначение
Выключает режим генерации прерываний на плате и восстанавливает контроллер прерываний PC. Данную функцию необходимо вызывать после завершения использования платы в режиме генерирования прерываний.
Параметры
Отсутствуют.
Пример См. Пример к SOFT_INTR.
75Функции работы с таймерами
На плате установлен трёх - канальный таймер, который может использоваться для генерирования прерываний и для синхронизации процессов ввода и вывода.
76Программирование таймера (TIMER())
Формат вызова
void TIMER(int Timer, int Mode, int Rate);
Назначение
Устанавливает один из трёх каналов таймера в режим Mode и записывает в счётчик данного канала таймера интервал Rate.
Параметры
Timer номер канала таймера (от 0 до 2). Третий канал таймера используется для внешней синхронизации (его счётный вход выведен на внешний разъём).
Mode устанавливаемый режим таймера (более подробное описание режимов см. в главе низкоуровневое описание платы).
Rate устанавливаемый интервал в микросекундах.
77Ожидание перехода на таймере (WAIT_TIMER())
Формат вызова
void WAIT_TIMER(int Timer);
Назначение
В том случае, если канал Timer запрограммирован в режим генерации меандра, то при помощи функции WAIT_TIMER() можно синхронизировать процессы ввода/вывода по таймеру.
Параметры
Timer номер канала таймера (от 0 до 2).
Пример
main()
{
int Channel=0xC0, Rate=200, i, Data[25];
// установим режим генерирования прерываний на первом канале таймера
TIMER(0, 3, Rate);
// установим номер канала АЦП
SETCHANNEL(Channel);
// введем 25 отсчётов с интервалом 200 мкс
for(i=0; i < 25; i++)
{
// ждём перехода на первом канале таймера
WAIT_TIMER(0);
// введём канал АЦП
Data[i]=SAMPLE();
}
// отобразим введённые значения
for(i=0; i < 25; i++) cprintf(“\n\rОтсчёт %2d = %6d”, i+1, Data[i]);
}
78Чтение регистра состояния таймера (GET_TIMER())
Формат вызова
int GET_TIMER(void);
Назначение
Данная функция возвращает регистр таймера, в котором содержатся биты состояния всех трёх каналов таймера. При этом младший бит содержит состояние линии первого канала таймера, второй бит соответственно второго канала и третий третьего канала таймера.
Параметры
Отсутствуют.
Пример
main()
{
int Channel=0xC0, Rate=200, i, Data[25];
// установим режим генерирования прерываний на первом канале таймера
TIMER(0, 3, Rate);
// установим номер канал АЦП
SETCHANNEL(Channel);
// введем 25 отсчётов с интервалом 200 мкс
for(i=0; i < 25; i++)
{
// ждём перехода на первом канале таймера
while (GET_TIMER() & 1);
while(!(GET_TIMER() & 1));
// введём канал АЦП
Data[i]=SAMPLE();
}
// отобразим введённые значения
for(i=0; i < 25; i++) cprintf(“\n\rОтсчёт %2d = %6d”, i+1, Data[i]);
}
|