Вы не вошли.

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

Торгашев Александр
08.04.2003 07:59:01
#1

Гость

DMA_ALL_DA

Приведите, пожалуйста, пример работы с DMA_ALL_DA на Delphi. В примерах нашел только на C, и не смог переделать так чтобы заработало.

08.04.2003 08:20:01
#2

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

Re: DMA_ALL_DA

см dmatest.dpr disktime.dpr и сишный пример.

Торгашев Александр
08.04.2003 09:12:29
#3

Гость

Re: DMA_ALL_DA

Дело в том, что у меня не получается выделить 2 буфера DMA. А если я выделяю один двойного размера и осуществляю ввод в первую половину и вывод из второй половины буфера, то процедура вообще подвисает и DMA_TEST всегда не равен 1.
Чтоо делать?

Торгашев Александр
08.04.2003 09:43:38
#4

Гость

Re: DMA_ALL_DA

Если я выделяю 2 буфера через ALLOCATEBUFFER(), то происходит то же самое.
вот как я это делаю:
const
    MyX=kvant0*3;
    Nch=1;
type
    TData=array[0..MyX-1] of word;
    PTData=^TData;
var
    Rate     :cardinal;
    Channel  :word;
    Channels   :array[0..Nch-1] of word;
    aSpinEcho    :TaSpinEcho;
    AdData, DaData                     :TData;
    PLinear, PLinear2                     :PTData;
    PPhysical, PPhysical2                 :PTData;
procedure DmaTest;
var
    i        :cardinal;
{*****************************************************************************}
Begin
    test.SpinEcho(aSpinEcho); // это я получил нужный мне массив
    Rate:=St;
    Channel:=Nch-1;
    for i := 0 to Channel do Channels[i]:=i;
//    ALLOCATEBUFFER(MyX*Nch*2*2, PLinear, PPhysical);
    ALLOCATEBUFFER(MyX*Nch*2, PLinear, PPhysical);
    if PLinear=NIL then
      Begin
        MessageDlg(/'Unable To Allocate Physical Memory./', mtError, [mbOk], 0);
        Application.Terminate;
      End;
    ALLOCATEBUFFER(MyX*Nch*2, PLinear2, PPhysical2);
    if PLinear2=NIL then
      Begin
        MessageDlg(/'Unable To Allocate Physical Memory./', mtError, [mbOk], 0);
        Application.Terminate;
      End;

//    PLinear2 := PTData(cardinal(PLinear)+MyX*Nch*2);
    for i:=0 to nmr01.c_aSpinEcho do begin
      DaData[i] := Trunc(aSpinEcho[i]);
//      PTData(cardinal(PLinear)+MyX*Nch*2)^[i] := DaData[i];
      PLinear2^[i] := DaData[i];
    end;
//    DMA_ALL_DA(PPhysical^, MyX, Channels, Channel, Rate, 0, PTData(cardinal(PPhysical)+MyX*Nch*2)^, MyX, 0, 0);
    DMA_ALL_DA(PPhysical^, MyX, Channels, Channel, Rate, 0, PPhysical2^, MyX, 0, 0);
    while DMA_TEST<>1 do begin
      fmMain.Caption := /'DMA Count = /' + IntToStr(DMA_COUNTER_OUT);
// DMA_COUNTER_OUT останавливается на цифре 1067
// DMA_COUNTER_IN останавливается на цифре 65535
    end;
    DMA_OFF;
    for i := 0 to MyX-1 do AdData[i] := PLinear^[i];
    FREEBUFFER(PLinear^);
    FREEBUFFER(PLinear2^);
    for i:=0 to 1 do;
End;

Что я делаю не так?

Торгашев Александр
08.04.2003 09:46:24
#5

Гость

Re: DMA_ALL_DA

Работаю в Windows 98 SE. Использую LCard32.dll

Торгашев Александр
08.04.2003 09:47:03
#6

Гость

Re: DMA_ALL_DA

Плата L-1250

Торгашев Александр
08.04.2003 10:07:16
#7

Гость

Re: DMA_ALL_DA

поправка:
в случае с одним двойным буфером DMA_COUNTER_OUT останавливается на цифре 1067
в случае с 2-мя буферами DMA_COUNTER_OUT останавливается на цифре 1023

Торгашев Александр
08.04.2003 10:11:42
#8

Гость

Re: DMA_ALL_DA

Если кому интересно, то kvant0=1024, т.е. MyX=3072

08.04.2003 11:04:19
#9

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

Re: DMA_ALL_DA

Попробуйте биос из поддиректории LSETUP//1250FIX

Торгашев Александр
11.04.2003 09:51:36
#10

Гость

Re: DMA_ALL_DA

оказалось что число снимаемых каналов было равно 0

Торгашев Александр
11.04.2003 10:09:27
#11

Гость

Re: DMA_ALL_DA

Теперь я могу снимать данные с одного канала АЦП одновременно с выводом на ЦАП (в моем случае на ТТЛ), но мне нужно снимать минимум с двух, а лучше с 4-х каналов. DMA_ALL_DA отказывается это делать, хотя по документации должна. По этому поводу у меня вопрос: как работает эта процедура? Какова очередность ввода-вывода? Если время переключения канала равно 2,4 мкс, а Rate=4мкс, то буду ли я терять данные или нет, при снимании данных с 2-х и более каналов?

11.04.2003 12:39:55
#12

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

Re: DMA_ALL_DA

Ответил письмом.

Торгашев Александр
14.04.2003 10:56:45
#13

Гость

Re: DMA_ALL_DA

Проблема ввода с 2-х каналов АЦП остается в силе.
Я никак не могу понять как заставить процедуру dma_all_da снимать данные с 2-х и более каналов одновременно. Использую плату 1250j с модифицированным биосом, в котором dma_all_da подает сигналы через цифровые выходы, а не через ЦАП.
Помогите!!!
Приведите мне, пожалуйста, любой действующий пример работы этой процедуры с несколькими каналами АЦП на 32х битном Delphi.

Торгашев Александр
14.04.2003 12:05:53
#14

Гость

Re: DMA_ALL_DA

Проблема найдена - она в модифицированном биосе.
С обычным биосом dma_all_da нормально снимает с 2-х каналов АЦП.

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25
Факс: +7 (495) 785-95-14

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск