Спасибо padanser за интересный опыт работы с PCI-1713.
Так каков Ваш вывод: "кривая" плата или неправильная программа?
Если возможно, интересно было бы взглянуть на Ваш вариант работы с PCI-1713 через FIFO. Спасибо.
Мой вывод - "кривая" плата, но если не использовать прерывание, то с ней вполне можно дружить
Мой вариант работы:
1. Настраиваем внутренний таймер на необходимую частоту оцифровки (регистры управления таймером base+30, base+26, base+28)
2. Настраиваем необходимый диапазон каналов измерения (регистр base+2)
3. Очищаем буфер FIFO (запись любого значения в регистр base+9)
3. Запускаем оцифровку от внутреннего таймера платы (запись значения 0x02 в регистр base+6)
4. Усё, плата будет сама с заданной частотой оцифровывать заданный диапазон каналов и складывать результаты в буфер FIFO
5. Нам остается только периодически вычитывать результаты оцифровки из буфера FIFO:
status = inp(base+7);
while( !(status & 0x01) )
{
data = inpw(base);
status = inp(base+7);
}
6. Вот здесь возникает вопрос с каким периодом вычитывать результаты из буфера FIFO...
6.1. Плата может генерить прерывание когда буфер FIFO будет заполнен наполовину.
Сначала я так и делал - запускал оцифровку от внутреннего таймера и разрешал генерить прерывание при заполнении половины буфера FIFO (запись значения 0x32 в регистр base+6).
По получении прерывания вычитывал содержимое буфера FIFO. Но с прерыванием есть проблемы, озвученные ранее в этой теме.
6.2. Собственно, зная частоту оцифровки встроенного таймера, легко вычислить время за которое заполнится половина буфера FIFO.
Далее заводим программный таймер на этот период времени, и по его срабатыванию также и вычитываем буфер FIFO.
Сейчас я так и делаю и никаких проблем с прерываниями