LINUX.ORG.RU

PCI-1713U Linux

 ,


0

1

Добрый день. Помогите пожалуйста разобраться. Имеется PCI-плата 1713U, которая измеряет напряжения. Требуется работать на уровне портов ввода-вывода. (с командами outb,outw и т.д.)

Если кто-то работал, приведите пожалуйста минимальный пример кода, позволяющий получить напряжение в униполярном режиме, single-ended. Например, с контакта 1 относительно общего в 9. Заранее спасибо!



Последнее исправление: kbporgramisto (всего исправлений: 1)

Ответ на: комментарий от I-Love-Microsoft

в том то и дело, что без драйвера, а если и есть, то закрытый.. известен базовый адрес PCI-платы. Работу нужно организовать с помощью портов ввода-вывода.

kbporgramisto
() автор топика

Работал довольно давно с похожей PCL-813B примерно так:
(опрос был медленный - не чаще раз в сек.)

/// регистры управления платы PCL-813
#define PCL813_CTR0		 0
#define PCL813_CTR1		 1
#define PCL813_CTR2		 2
#define PCL813_CTRCTL		 3
#define PCL813_AD_LO		 4
#define PCL813_AD_HI		 5
#define PCL813_DI_LO		 6
#define PCL813_DI_HI		 7
#define PCL813_CLRINT		 8
#define PCL813_GAIN		 9
#define PCL813_MUX		10
#define PCL813_MODE		11
#define PCL813_SOFTTRIG 	12
#define PCL813_DO_LO		13
#define PCL813_DO_HI 		14

/// размер адресного пространства
#define PCL813_SIZE             16

/// признак готовности данных
#define PCL813_DRDY 		0x10	// =0 data ready

/// число каналов АЦП на плате
#define PCL813_CHANALS		32

bool init() {
// разрешить обращение к портам АЦП
if( ioperm( ADR_ACP1, PCL813_SIZE, 1 ) < 0 )
    return 0;
msg( "AIN: init() adr = %X", ADR_ACP1 );
return 1;
}

/// вызываемая по таймеру функция опроса АЦП
static void acp()
{
  int adr_acp = ADR_ACP1; ///< адрес платы АЦП 

  outb( 0, adr_acp + PCL813_GAIN ); // установить делитель 0..10V (+-5V)

  for( int i = 0; i < NUM_ANALOG_IN; i++ )
  {
    // опрос канала АЦП
    outb( i, adr_acp + PCL813_MUX ); // установить канал АЦП
    delaymks( 5 ); // задержка времени на переключение
    outb( 1, adr_acp + PCL813_SOFTTRIG ); // запуск преобразователя
    delaymks( 40 ); // задержка времени на преобразование
    int hi = inb( adr_acp + PCL813_AD_HI ); // старший байт результата

    if( hi & PCL813_DRDY ) // если канал не готов
    {
      ERR_ACP[i]++; // инкремент счетчика сбоев
    }
    else // АЦП готов
    {
      int low = inb( adr_acp + PCL813_AD_LO ); // младший байт результата

      // запись сигналов в рабочую память
      A_IN[i] = ((hi & 0x0f) << 8) | low;
    }
  } // end for()
}

sigurd ★★★★★
()
Ответ на: комментарий от anonymous

Точнее, когда-то делали. Сейчас, похоже, проект полудохлый, если не совсем.

anonymous
()
Ответ на: комментарий от kbporgramisto

ну в цикле же выполняется

outb( i, adr_acp + PCL813_MUX ); // установить канал АЦП
мне нужны были все сигналы, если вам нужен только 1 - то цикл не нужен - задавайте нужный номер канала

sigurd ★★★★★
()
Ответ на: комментарий от kbporgramisto

Единственно - вам нужно будет еще добавить настройку делителей/усилителей на каждый канал - в моей плате она была общей на все каналы

sigurd ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.