Реклама:

// (биты 3...5) #define POLAR 0x40 // Маска бита полярности

// синхроперехода (бит 6)

#define LENGTH 4096 // Глубина регистрации —

// 4096 кадров

// Глобальные переменные

unsigned CW_ADDR; //Адрес регистра

// управляющего слова unsigned PRE_REG_ADDR; // Адрес регистра глубины

// предпусковой регистрации unsigned R0.R1 ,R2,R3; // Адреса чтения байтов 0...3 данных

unsigned READY_ADDRr // Адрес флага готовности

И Структура параметров регистрации typedef struct l_A_Param {

unsigned char freq; // Код частоты (0...7)

unsigned char sync; // Номер синхролинии (0...7)

unsigned char polar; // Код полярности синхроперехода

// 0 — положительный, // 1 — отрицательный, unsigned pre_reg; // Глубина предпусковой

// регистрации //(О - (LENGTH-1))

};

// Прототипы функций int lnit_l_A (LA_PARAM *la); unsigned Check_Ready (void); void Read_Data (unsigned long *data);

// Функция установки параметров и запуска регистрации

int lnit_LA (LA_PARAM *la)

// Возвращает: 0 — запуск произведен,

// -1 — ошибка параметров регистрации

{

unsigned char cw. pr;

// Проверка правильности входных параметров if (la->freq > 7 11 la->sync > 7 11 la->polar > 1 11 la->pre_reg >= LENGTH)

return (-1); // Выход no ошибке

// Формирование управляющего слова

// и кода предпусковой регистрации

cw = (la->freq & FREQ) + ((la->sync « 3) & SYNC)

+ ((la->polar « 6) & POLAR);

Pw = la->pre_reg » 4; // Точность — 16 кадров

outportb (CW_ADDR, cw); // Запись управляющего слова

outportb (PRE_REG_ADDR, pr); // Запись кода предпусковой

// регистрации и запуск анализатора

return (0); }

// Выход no нормальному запуску

// функция проверки окончания регистрации

unsigned Check_Ready (void)

// Опрашивает флаг готовности и возвращает:

// 0 — готов, иначе — не готов

{

return (inportb (READY_ADDR) & READY); }

// Функция чтения данных из буферного ОЗУ логического // анализатора в память компьютера

void Read_Data (unsigned long *data)

// data — указатель на массив, в который

// будут переписаны

// данные из буферного ОЗУ.

{

unsigned i;

for (i=0;i<LENGTH;i++) // Повторяем чтение 4096 раз

data[i] = (unsigned long) inportb (R0) + (unsigned long) inportb (R1) << 8 +

(unsigned long) inportb (R2) << 16 + (unsigned long) inportb (R3) « 24;

}

//*** Конец драйверов

С использованием этих драйверов в качестве примера напишем простейшую программу для подсчета соотношения длительности единицы и нуля по всем из подключенных ко входам логического анализатора линий за время 100 мкс после прихода первой единицы по линии 3. Для получения максимальной точности будем проводить регистрацию на предельной частоте 10 МГц.

// Программа для подсчета соотношения единиц и нулей #include <STDIO.H> void main (void)

{

struct LA_Param la; unsigned long data[LENGTHJ; unsigned num0[32], num1[32]; float ratio[32J; unsigned i, j;

// Инициализация параметров регистрации

la.freq = 0; // Код частоты 10 МГц (период 100 не)

la.sync = 3; // Номер синхролинии


⇐ Предыдущая страница| |Следующая страница ⇒