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


Ввод в режиме DMA при автоинициализации

Вы не вошли.

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

Сергей
19.01.2004 10:44:01
#1

Гость

Ввод в режиме DMA при автоинициализации

Работаю в Windows98 с платой L-1250 с подключённым модулем LM-201 в крейте. Требуется регистрировать сигнал продолжительнойстью не менее 30 сек. Без автоинициализации контроллера DMA ввод идёт без проблем. При нём программа подвисает. Вопрос:
1. возможен ли ввод с крейтом?
2. можно ли использовать 2-й канал, как это делаю я?
Или проблема в чём-то третьем?
Заранее спасибо.

19.01.2004 13:09:52
#2

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

Re: Ввод в режиме DMA при автоинициализации

1 да.
2 что за второй канал?

При вводе неплохо бы посмотреть как меняется счетчик дма.

Сергей
20.01.2004 11:47:25
#3

Гость

Re: Ввод в режиме DMA при автоинициализации

--- "Второй" - порядковый номер. В техническом описании (пункт 1.4.5 "Конфигурирование работы ПДП") говорится о ПЯТОМ и ШЕСТОМ каналах. Я использую второй.
--- DMA_COUNTER_IN() останавливается то на 16381, то на 16383, если я в DMAALL отправляю NPoint кадров, а не NPoint*2, как, вроде бы, надо. С NPoint*2 в качестве параметра программа зависает.

Может я не правильно с массивами работаю? В описание не всё чётко, к сожалению...

#define MyBuffer   64*1024 // 64 KW = 65536
                           // элементов массива
#define SizeMyBuffer MyBuffer*2 //128 KB=131072 B

int NPoint = 32768;  // размер массива
                     // (половина буфера)
WORD *Data;         // массивы
WORD *PLinear;
WORD *PPhysical;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
// Проинициализируем модуль в крейте
RESET_ALL();

// Второй канал модуля LM_201
PROGRAM_LM_201(Crait, Slot, 1, 128, 0);//фотодиод

Channels[0] = MAKE_CHANNEL(Crait, Slot, 1,
                                  Kadr, 0);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Series1->Clear();
  Edit1->Text=/'0/';

// Выделим память
ALLOCATEBUFFER(SizeMyBuffer,&PLinear,&PPhysical);

if ( PLinear == NULL)
  {
    MessageBox(NULL, "Невозможно выделить
    память","Ошибка", MB_ICONEXCLAMATION |
    MB_TASKMODAL | MB_OK);
    Close();
   }

Data = new WORD [NPoint];

// Считаем
DMAALL(PPhysical, NPoint, Channels, 1, 50, 1);

for (int i = 0; i < 5; i++)
   { // просто тестовая программа...
    GET_BUFFER_HALF(Data);
    Edit1->Text=IntToStr(DMA_COUNTER_IN());
   }

  for (int i = 0; i < NPoint; i++)
    Series1->AddXY(i, Data[i], "", clTeeColor);

  delete[] Data;
  DMA_OFF();
  FREEBUFFER(PLinear);
}

Буду очень признателен...

20.01.2004 13:30:47
#4

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

Re: Ввод в режиме DMA при автоинициализации

При автоинициализации четчик должен циклически бегать - убедитесь что это так.Данные не читайте.
А потом читайте данные просто копированием из соотвтествующей области буфера по адресу PLinear.Читайте каунтер и копируйте.
А так реализация дма режима в этой библиотеке отвратная и если можно ей не пользоваться то лучше не пользоваьтся.

Сергей
20.01.2004 16:50:14
#5

Гость

Re: Ввод в режиме DMA при автоинициализации

Очень приятные новости...(( И какой же библиотекой лучше пользоваться?

Сергей
22.01.2004 09:25:10
#6

Гость

Re: Ввод в режиме DMA при автоинициализации

Павел, не оставляйте, пожалуйста, вопрос без ответа. Какая библиотека лучше? И ещё... Ввод в режиме ПДП единственная возможность регистрации продолжительных сигналов или есть ещё что-то?

22.01.2004 10:13:32
#7

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

Re: Ввод в режиме DMA при автоинициализации

Пользоваться можно DLL//NEW bkb lcomp.exe из библиотеки файлов, но они работают с 1250 и ничего не знают о крейте - это самому дописывать. Есть еще режим ввода по прерываниям - смотрите примеры
fifo2.cpp fifo2tst.cpp. Я так и не понял что Вы проверили из моего предыдущего ответа.

Сергей
23.01.2004 09:30:31
#8

Гость

Re: Ввод в режиме DMA при автоинициализации

Попробовал... Счётчик бегает. Реализовал ввод через каунтер, как Вы и сказали. Вроде бы ПДП работает. Только вот полученную информацию могу записывать лишь в файл. Выводить на TChart в Builder/'e не получается - нет наглядности. Не успевает что ли... Ну это, в принципе, мелочи. Меня больше другое волнует. Нет ли такой вероятности, что пока я записываю полбуфера в файл, каунтер сделает не один цикл? Буду ли я успевать за вводом по ПДП?

Спасибо сердечное за помощь!

23.01.2004 12:34:54
#9

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

Re: Ввод в режиме DMA при автоинициализации

Надо тестить это в своей конкретной задаче- вероятность всегда есть.