Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Плата L-780M. Работа с lcomp.

Вы не вошли.

 Поиск | Регистрация | Вход 

Николай
11.06.2010 14:54:44
#1

Гость

Плата L-780M. Работа с lcomp.

У меня вопросы по работе с lcomp.
1.Если dKadr равен 0.0, то каков интервал получается между кадрами?
2.Почему сделали dRate в кгц, а dKadr в мс?
Зачем такой разнобой?
3.Чем отличается аппаратный буфер FIFO от
кольцевого буфера, т.е. FIFO и Pages ?
Их размеры, расположение. И почему Pages по прерываниям, если я хочу работать только по событиям.
4.Как передаются данные между большим буфером PC
и аппаратным буфером FIFO: точками отсчета отдельно или какими-то кусками или сразу всем
буфером FIFO? Нужно ли для этого прерывание
или по каналу ДМА или как-то по другому?
Когда изменяется переменная sync при этом?
Если я отменю прерывание IrqEna := 0, будет ли все это работать?
5. В SetParametersStream и в RequestBufferStream
используются разные буферы или это один и тот же?
И каковы соотношения их размеров?
6. Как соотносятся между собой одновременные потоки на ЦАП и АЦП? И как при этом осуществляется
пересылка очередного куска буфера из PC на ЦАП?
Нужно ли при этом устанавливать прерывание на ЦАП?


Почему-то нет никакого описания по работе с lcomp.
А ведь прошло уже десяток лет! И у всех возникают
одни и те же вопросы!

11.06.2010 16:15:06
#2

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Плата L-780M. Работа с lcomp.

1 1/dRate те все отсчеты идут непрерывным равномерным потоком.
2 так получилось
3 ну один в плате, а другой PC. один небольшой, а другой большой. События медленные и поэтому исользуются только при однократном заполнении большого буфера как сигнал окончания...

4 передаются пачками IrqStep. В простейшем варианте IrqStep=FIFO те половинке FIFO буфера. Передаются по прерыванию тк BusMaster нету у платы. Как обработчик скопировал данные так прибавил к sync количество... Без прерываний работать ничего не будет
5 Буфер один. Requset выделяет его с запасом, а Set говорит какую его часть использовать.
6 Приходит прерывание и в нем читаются флажки источника. Если это ЦАП то туда кладуться данные и прибавляется счетчик ЦАП. Если АЦП то считываются данные и прибавляется счетчик.
Если ЦАП не разрешить прерывание то при старте в плату будут записаны первые две порции из большого ЦАП-буфера и он оттуда их будет выводить циклически...
Если честно то вопросов очень мало возникает....
Все возможности описывают два примера L7XX.TST и L7XX.OSC

Николай
15.06.2010 10:26:59
#3

Гость

Re: Плата L-780M. Работа с lcomp.

У меня еще вопросы:

1. Прерывания обслуживает драйвер lcomp или надо писать свой обработчик?
2. Можно ли как то эти прерывания обработать
или только по контролю sync?
3. Если IrqStep=1, то будет ли это работать?
И какой при этом делать Pages?
4. Можно ли на время остановить работу платы,
а потом запустить с этой же точки?
5. Нужно ли делать IrqStep * Pages = FIFO или 2*FIFO или какие то другие размеры?
И что делает при этом AutoInit?

В общем разбираться в чужой программе - безнадёга!

15.06.2010 11:20:02
#4

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Плата L-780M. Работа с lcomp.

1 обслуживает драйвер lcomp. Отслеживать по sync. При однократном сборе при AutoInit=0 можно event в конце получить. см L7XX.OSC
2 При IrqStep=1 работать будет только на ооочень низких скоростях иначе все ляжет под напором прерываний. Pages делать какой надо.
3 Остановить плату нельзя. Только если  внешние какие запуски подавать.
4 Лучше делать FIFO=IrqStep. AutoInit=1 это циклический сбор с перезаписью буфера в PC равного IrqStep*Pages.

Николай
15.06.2010 11:56:58
#5

Гость

Re: Плата L-780M. Работа с lcomp.

Еще вопросы:

1. При dRate := 100.0 кгц получается разные:
для АЦП Rate = 100.31 кгц, а для ЦАП
Rate = 98.304 кгц. Это нормально? Хотелось бы одинаковые значения!
2. При FiFo = 1024 Цап выдает почему то быстрее
в 2 раза. Все параметры одинаковые!
3. Для АЦП предел +- 8000 или +-8192 ?
4. После остановки StopLDevice можно запустить через InitStartLDevice и StartLDevice, чтобы повторить работу АЦП и ЦАП или надо снова инициализировать?

15.06.2010 12:43:34
#6

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Плата L-780M. Работа с lcomp.

1 это нормально тк разные источники для запусков.
2 фифо какое? и данные для цап для одного канала или для двух
3 +-8000
4 да можно. см пример L7XX.OSC

Николай
15.06.2010 12:56:07
#7

Гость

Re: Плата L-780M. Работа с lcomp.

2. Фифо = 1024 для АЦП и ЦАП. Кольцевые буферы PC
по 2048. Данные для ЦАП для одного канала.

Николай
15.06.2010 13:23:22
#8

Гость

Re: Плата L-780M. Работа с lcomp.

2. ЦАП выдает нормально, смотрел по осциллографу.
А вот АЦП считывает в 2 раза медленнее.

15.06.2010 13:50:54
#9

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Плата L-780M. Работа с lcomp.

Я код программы не вижу, но для 100кГц буфер АЦП маловат если это неперывный сбор.

Николай
15.06.2010 14:01:43
#10

Гость

Re: Плата L-780M. Работа с lcomp.

Еще при одинаковых параметрах sync от АЦП равен 2048, а sync от ЦАП равен 1024. Везде AutoInit := 0

Программа:

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  Forms, Dialogs, ifc_ldev, ioctl, create, StdCtrls, ExtCtrls;

const
   FIFO = 1024;
   IrqStep = 1024;
   pages = 2;

type
  WA = array [0..2047] of ULONG; //SHORT;
  PWA = ^WA;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Timer1: TTimer;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure InitADC(Sender: TObject);
    procedure InitDAC(Sender: TObject);
    procedure StartADC(Sender: TObject);
    procedure StopADC(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  pLDev: IDaqLDevice;
  pIUnknown:LUnknown;
  hr: Integer;
  dev: THandle;

  sl: SLOT_PAR;
  pd: PLATA_DESCR_U2;
  ap: ADC_PAR;
  dp: DAC_PAR;
  tmAdc: ULONG;
  tmDac: ULONG;
  syncAdc: PULONG;
  syncDac: PULONG;
  inData: PWA;
  outData: PWA;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  s : string;

begin
  Timer1.Enabled := False;

  if(CallCreateInstance(//'lcomp.dll//')=1) then
  begin
    Memo1.Lines.Add(//'Loading library - success.//');
    Memo1.Lines.Add(//'//');
  end;

{Óêàæèòå çäåñü âèðòóàëüíûé ñëîò òîé ïëàòû ñ êîòîðîé õîòèòå ðàáîòàòü}

  pIUnknown:=CreateInstance(0);
  hr := pIUnknown.QueryInterface(IID_ILDEV, pLDev);
  if(not Succeeded(hr))
    then MessageBox(0,//'Get interface failed//',//'Error//',MB_OK);
  pIUnknown.Release;
  dev:= pLDev.OpenLDevice;

  pLDev.GetSlotParam(sl);

  s:=IntToStr(pLDev.ReadPlataDescr(pd));
  s:=IntToStr(pLDev.LoadBios(pd.t1.BrdName));

  s:= IntToStr(pLDev.PlataTest);
  Memo1.Lines.Add(//'PlataTest status //' + s);

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin

  inData := NIL;
  outData := NIL;
  syncAdc := NIL;
  syncDac := NIL;

  pLDev.StopLDevice;
  pLDev.CloseLDevice;
//  pLDev.Release;

  close;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
//   if((data<>NIL) and (sync<>NIL)) then
//      Memo1.Lines.Add(//'Sync: //'+IntToStr(sync^) + //' //' +IntToStr(data[0])+//' //' +IntToStr(data[128])+//' //' +IntToStr(data[1024]));
end;

procedure TForm1.InitDAC(Sender: TObject);
var
  i,n : integer;
begin

  dp.t1.s_Type := L_DAC_PARAM;
  dp.t1.AutoInit := 0;
  dp.t1.dRate := 100.0;        // &#234;&#227;&#246;
  dp.t1.FIFO := FIFO;
  dp.t1.IrqStep := IrqStep;
  dp.t1.Pages := pages;
  dp.t1.IrqEna := 1;
  dp.t1.DacEna := 1;
  dp.t1.DacNumber := 0;

  pLDev.FillDAQparameters(dp.t1);

  tmDac := 20000;
  pLDev.RequestBufferStream(tmDac, L_STREAM_DAC);
  Memo1.Lines.Add(//'Allocated memory size(word) tmDac: //' + IntToStr(tmDac));

  pLDev.SetParametersStream(dp.t1, tmDac, outData, syncDac, L_STREAM_DAC);
  Memo1.Lines.Add(//'data_Dac = //' + IntToStr(length(outData^)));

  n := -512;
  for i := 0 to 1023 do
  begin
    outData[i] := ULONG((n and $fff) or $0000);
    outData[2047 - i] := ULONG((n and $fff) or $0000);
    inc(n);
  end;
end;

procedure TForm1.InitADC(Sender: TObject);
begin
  tmAdc := 20000;
  pLDev.RequestBufferStream(tmAdc, L_STREAM_ADC);

  ap.t1.s_Type := L_ADC_PARAM;
  ap.t1.AutoInit := 0;
  ap.t1.dRate := 100.0;
  ap.t1.dKadr := 0.0;
  ap.t1.dScale := 0;
  ap.t1.SynchroType := 3;
  ap.t1.SynchroSensitivity := 0;
  ap.t1.SynchroMode := 0;
  ap.t1.AdChannel := 0;
  ap.t1.AdPorog := 0;
  ap.t1.NCh := 1;
  ap.t1.Chn[0] := $20;
  ap.t1.Chn[1] := $21;
  ap.t1.FIFO := FIFO;
  ap.t1.IrqStep := IrqStep;
  ap.t1.Pages := pages;
  ap.t1.IrqEna := 1;
  ap.t1.AdcEna := 1;

  pLDev.FillDAQparameters(ap.t1);
  pLDev.SetParametersStream(ap.t1, tmAdc, inData, syncAdc, L_STREAM_ADC);

nd;

procedure TForm1.StartADC(Sender: TObject);
var
  m : smallint;
  r : single;
begin
  Timer1.Enabled := False;

  pLDev.InitStartLDevice;
  pLDev.StartLDevice;

  repeat until syncAdc^ >= 2047;

  m := inData[0];
  r := m * 5.0 / 8000.0;
  Memo1.Lines.Add(//'U[0] = //' + FloatToStr(r));

  m := inData[512];
  r := m * 5.0 / 8000.0;
  Memo1.Lines.Add(//'U[512] = //' + FloatToStr(r));

end;

procedure TForm1.StopADC(Sender: TObject);
begin
  pLDev.StopLDevice;
  Memo1.Lines.Add(//'&#209;&#242;&#238;&#239; //');
  Memo1.Lines.Add(//'//');
end;

end.

15.06.2010 14:25:40
#11

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Плата L-780M. Работа с lcomp.

Непонятно как скорость меряли. У ЦАП есть предиинит когда он данные первых двух половинок себе закладывает. Тогда при старте он выводит из себя половинку а АЦП вводит. По первому прерыванию в ЦАП кладется первая половинка тк их всего 2, а из АЦП забирается... по счетчикам определять скорость неправильно. Надо данные закольцевать и смотреть что с ЦАП один период пришел в АЦП например...

Николай
15.06.2010 14:41:40
#12

Гость

Re: Плата L-780M. Работа с lcomp.

У меня ЦАП выдает пилу. Мерял осциллографом. Все
нормально. А в АЦП я смотрел в MEMO данные кольцевого буфера. И там видно, что АЦП меряет в 2 раза медленнее. Если dRate АЦП поставить 200.0 кгц,
то все нормально. Выдача пилы и считывание с одного
канала однократное. Может как то влияет dKadr? Или же взаимно влияют АЦП и ЦАП?  При разных скоростях тоже самое. Еще я спрашивал насчет sync?

Николай
15.06.2010 14:50:16
#13

Гость

Re: Плата L-780M. Работа с lcomp.

Если Pages сделать 4, а не 2, то sync становятся одинаковыми и равными 2048 ??? Ну и ну.

15.06.2010 14:52:20
#14

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Плата L-780M. Работа с lcomp.

Если Вы MEMO смотрели типом ULONG, то там вообще неправильно. Данные c АЦП short...

Николай
15.06.2010 15:13:17
#15

Гость

Re: Плата L-780M. Работа с lcomp.

Заработало. Действительно для ЦАП нужны данные
ULONG, а для АЦП USHORT. А вот sync ведет себя непонятно.

15.06.2010 15:13:19
#16

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Плата L-780M. Работа с lcomp.

sync сравнивать смысла нету. Это независимые переменные считываются фактически в разные моменты времени и частоты еще чуть разные....

Николай
15.06.2010 15:23:00
#17

Гость

Re: Плата L-780M. Работа с lcomp.

Я считываю их после однократного прохода, при
AutoInit = 0, когда уже все давно закончилось!

15.06.2010 16:22:35
#18

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Плата L-780M. Работа с lcomp.

Ну при 2 это исключительный случай тк все закончилось по АЦП и ЦАП был остановлен до 2048 по его счетчику...

Николай
16.06.2010 08:44:49
#19

Гость

Re: Плата L-780M. Работа с lcomp.

Как это: АЦП останавливает ЦАП? ЦАП не успевает
доработать?

16.06.2010 10:00:39
#20

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Плата L-780M. Работа с lcomp.

StopLDevice общий. Если его вызвать для АЦП котрый работает быстрей то ЦАП тоже остановится. Кроме случая с AutoInit=1 и работой ЦАП из внутреннего буфера платы...

Николай
17.06.2010 08:11:43
#21

Гость

Re: Плата L-780M. Работа с lcomp.

1.Можно ли как то отслеживать прерывания или они
полностью обрабатываются драйвером и следить можно только по sync?
2. Цап по первому прерыванию вторую или первую половину буфера ПС ложит? А то выше написано - первую.

17.06.2010 09:30:51
#22

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Плата L-780M. Работа с lcomp.

1 полностью обрабатываются драйвером.
2 по превому прерыванию ЦАП кладет первую половинку, а продолжает выводить вторую. Преинит ЦАП 2 половинки....

Николай
17.06.2010 10:47:07
#23

Гость

Re: Плата L-780M. Работа с lcomp.

Почему то при выходе:
  pLDev.StopLDevice;
  pLDev.CloseLDevice;
  pLDev.Release;


pLDev.Release вызывает ошибку исполнения?

17.06.2010 11:00:28
#24

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Плата L-780M. Работа с lcomp.

А в примерах тоже вызывает?

Николай
17.06.2010 11:07:22
#25

Гость

Re: Плата L-780M. Работа с lcomp.

В примере l7xx.dpr все нормально!