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


ЦАП L780M

Вы не вошли.

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

Денис
09.08.2005 10:54:43
#1

Гость

ЦАП L780M

Проблема с выделением памяти.
Вот кусок кода.

PLATA_DESCR         pd;
    DAC_PAR             DAC;


    m_dFrameFreq = 1;
    m_iChannelCount = 1;
    m_iFrameCount = 1000;
    m_dwLargeBuffer = m_dFrameFreq*m_iChannelCount*1000;

    if ( L_ERROR == pDevice->ReadPlataDescr( &pd ) )
    {       
        return;
    }   

    if(pd.IsDacPresent)   
        m_iDacDevice=true;   
    else
        return;
    DAC.t1.AutoInit = 1;
    DAC.t1.dRate = m_dFrameFreq;
    DAC.t1.IrqEna = 1;
    DAC.t1.DacEna = 1;
    DAC.t1.DacNumber = 0;
    DAC.t1.s_Type = L_DAC_PARAM;
    DAC.t1.FIFO = m_dwLargeBuffer;
    DAC.t1.IrqStep = m_dwLargeBuffer;
    DAC.t1.Pages = 2;

    m_dwLargeBuffer *=2;
    if(L_ERROR == pDevice->FillDAQparameters(&DAC.t1))       
        return;   
        if(L_ERROR == pDevice->RequestBufferStream(&m_dwLargeBuffer, L_STREAM_DAC))       
        return;   
       if(L_ERROR == pDevice->SetParametersStream(&DAC.t1,&m_dwLargeBuffer, (void**)&m_Buffer,(void**)&m_Sync, L_STREAM_DAC))
        return;
   
    m_siBufferPart0 = (short int*)m_Buffer;
    m_siBufferPart1 = m_siBufferPart0 + m_dwLargeBuffer;
    for(int i=0;i<1000;i++)
    {
        m_siBufferPart0[i] = 700&0xFFF|0x0000;
        //m_siBufferPart1[i] = 1400&0xFFF|0x0000;
    }
    DACViewSync =  m_Sync;   
    m_bDACStart = true;
   
    if ( L_ERROR == pDevice->InitStartLDevice()) 
        return;
    if(L_ERROR == pDevice->InitStartLDevice())
         return;
   
    if(L_ERROR == pDevice->StartLDevice())
           return;

dwLargeBuffer - это размер большого кольцевого буфера. Так вот, после вызова RequestBufferStream
dwLargeBuffer = 2048 вместо 2000, Pages=2. А после вызова SetParametersStream - dwLargeBuffer=1000, а Pages = 1; Соотвестственно sync - переменная синхронизации  у меня доходит до  1000 и замерает.
Чем это вызвано и что я сделал не так?
ДА, параллельно ЦАП работает и АЦП с теми же параметрами (частота, размер буфера...) И АЦП работатет корректно. Т.е. переменная синхронизации меняется (1000, 2000 потом опять 1000).
   

09.08.2005 12:21:17
#2

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

Re: ЦАП L780M

Все дело наверное в формате буфера ЦАП. Это упущение в документации и примеры не очень удачно подобрал. Если ЦАП на 780просто или без прерываний, то там формат short у буфера. А если 780M то формат как в примере L780.OSC те dword. Отсюда и разница в расчетах. Буфер всегда выделяется в short, те запросили 2000 шортов, а отсчеты в dword те 1000.

Денис
09.08.2005 12:40:27
#3

Гость

Re: ЦАП L780M

Тогда непонятно, почему выделяя 512 я получаю в итоге нормальный буфер.
Т.е. dwLargeBufer = 512 - это половинка FIFO.
Следовательно, при вызове  RequestBufferStream со значением dwLargeBuffer = 1024 мне возвращается 2048, а при последующем вызове SetParametersStream - мне возвращается правильное значение  = 1024. Но при работе ЦАП sync всё равно застывает на 512.
Мерил тестером то, что выдаёт ЦАП  - сначала значение из первой половинки, а потом из второй. И всё. Далее ничего. Т.е. кольцевой выдачи нет.

09.08.2005 13:28:20
#4

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

Re: ЦАП L780M

Request всегда все округляет до страницы в 4096 Байт, те 2048 short минимум... Работать надо так- - выделить памяти ну например 30000. потом структуру заполнить с размером фифо и шагом прерывания и количеством страниц. Причем шаг*страницы должно быть меньше 30000/2. Все это заслать и смотреть. Убедиться что биос от 780M а не просто 780...

Денис
09.08.2005 17:26:31
#5

Гость

Re: ЦАП L780M

С размером буфера более менее разобрался. Получается так, что для того, чтобы получить требуемый размер буфера значение Pages  должно быть равно 2.

Не ясно с кольцевой выдачей. Она как-то работает через раз. Поясняю: параметры такие частота 1024, размер буфера 2048, FIFO = 1024 соответственно Pages=2. Проверяю значение sync раз в 60 мс. Бывает что заводиться выдача нормально, т.е. показания тестера меняются и sync прыгает (1024 и 2048), а бывает, что sync =1024 и всё. Больше не меняется  и тестер говорит что нет ничего - 0. lcomp брал с сайта. Bios из папки
L-Card/LIBRARY/BIOS/

10.08.2005 09:03:35
#6

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

Re: ЦАП L780M

А если Pages побольше поставить всегда работать будет?

Денис
10.08.2005 09:43:23
#7

Гость

Re: ЦАП L780M

Я могу Вам  выслать исходники примера. Там код небольшой.

Денис
10.08.2005 10:24:48
#8

Гость

Re: ЦАП L780M

Только что попробывал сделать так чтоб Pages был побольше. Параметрв такие: частота 1024, размер кольцевого буфера - 2048, FIFO=256, Pages=4. С такими параметрами заводиться также, раз из 10. Ещё ретуальные танцы есть??? Или Pages надо ставить ещё больше? Мне бы хотелось чтобы размер кольцевого буфера был в районе 2048.

10.08.2005 11:09:39
#9

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

Re: ЦАП L780M

Засылайте исходники - посмотрим...

10.08.2005 11:10:16
#10

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

Re: ЦАП L780M

А если буфер побольше сделать?

Денис
10.08.2005 17:29:20
#11

Гость

Re: ЦАП L780M

Плата до этого была в PCI1. Работало всё через раз. Поставил её в PCI0 запустил прогу 5 раз всё оки. Исходники не менял. Переставил обратно в PCI1 ЦАП не работает. Потом обратно в PCI0 и всё равно не работает. Может где контакт плохой??? Исходники завтра вышлю. Посмотрите, может Вы что-нибудь найдёте.

11.08.2005 08:55:50
#12

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

Re: ЦАП L780M

Спиртом контакты протереть у PCI и еще посмотреть кто прерывание пользует кроме этой платы... возможно эксклюзивное выделить отключив ACPI...

Денис
11.08.2005 09:25:54
#13

Гость

Re: ЦАП L780M

Конфликтов по прерываниям вроде нет. По крайней мере в диспетчере устройств смотрел, там винда говорит, что всё гуд. Контакты протирал.