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


Прерывания в DOS

Вы не вошли.

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

Андрущенко
05.09.2003 16:53:47
#1

Гость

Прерывания в DOS

Стоит следующая задача:
Снимать 1 канал в режиме покадровой синхронизации и сразу его отрисовывать.Следовательно необходим обработчик с шагом в один отсчет (т.к. кадр в данном случае равен одному отсчету),который читает данные из АЦП-шного FIFO и выставляет переменную "было прерывание" в 1. А в main цикл проверяет её значение и в случае "1" вызывает функцию копирования пикселя. Соответственно буфер куда пишутся данные должен быть размером в 1 int:
...
int Control_Table[1];
int ChannelQantity=1;
double ADC_Rate=125.0;
double Inter_Kadr_Deley=0.0;
int IrqStep=1;
int *IrqBuffer;
AdcFifoLenght=512
int X=0;/*X-координата пикселя*/
...
main(){
...
for(i=0;i<ChannelQantity;i++)
Control_Table[i]=i;
...
IrqBuffer=new int [1];
/*устанавливаем режим покадровой синронизации*/
SYNCHRO_CONFIG_PLX(&bi[0],1,0,0,0,0,0)
INIT_INTERRUPT_PLX(&bi[0], IRQ_Handler);
ENABLE_IRQ_PLX(&bi[0], 1, IrqStep);

while(!kbhit()){
if(IrqN==1){
/*рисуем по Х пиксель,(режим 1024х768)Y которого
является значением IrqBuffer/масштаб+смещение от Y-нулевого (чтоб "ноль сигнала" был посередине экрана)*/
putPixel(X++,(384+(IrqBuffer[0])/40),1);
if(X==1024)
X=0;
}
Irq=0;//данные отрисованы
}
ENABLE_IRQ_PLX(&bi[0], 0, IrqStep);
STOP_INTERRUPT_PLX(&bi[0]);
CLOSE_ACCESS_TO_PLX();
}/*main*/

/*обработчик прерывания*/
void interrupt IRQ_Handler(PARM){
/*забираем отсчет в IrqBuffer*/
GET_DM_ARRAY_PLX(&bi[0],GET_DM_WORD_PLX(&bi[0],L_IRQ_FIFO_ADDRESS_PLX),IrqStep,IrqBuffer);
Irq=1;/*было прерывание*/
RESET_IRQ_PLX(&bi[0]);
}
Если я правильно понимаю, то на экране график должен отрисовываться со скоростью 100 пикселей в секунду в случае частоты синхросигнала 100 Гц,т.к.одно прерывание вызывает рисование лишь одного пикселя.Но отрисовка идет где-то 1 пиксель в секунду и форма сигнала забавно искажается-как будто теряются отсчёты.Разве ATHLON 650MHz неуспевает? (вся графика на ассемблере без двойной буферизации)
Симптомы проблемы:
Если увеличивать частоту синхросигнала
скорость отрисовки возрастает:200Гц примерно 2 пикселя и т.д.
Если синхросигнал выключить ничего не отрисовывается
Все примеры на прилагаемом диске для DOS идут великолепно

ЧТО ДЕЛАТЬ?

Спасибо за ответы.

06.09.2003 13:40:39
#2

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,493

Re: Прерывания в DOS

Так на вскидку:
1. Что это за переменная такая IrqN? Ведь в обработчике прерываний используется флажок Irq.
2. Почему в теле цикла прорисовки данных
while(!kbhit()){...}
постоянно сбрасывается флажок Irq, устанавливаемый в обработчике прерываний? И этот сброс осуществляется всегда (без условий), не смотря на то было или нет прерывание от платы.

Андрущенко
06.09.2003 19:50:28
#3

Гость

Re: Прерывания в DOS

IrqN это Irq, я неправильно написал, и состояние этого флага как раз и является условием:
while(!kbhit()){
if(Irq==1)//если БЫЛО прерывание
... //рисовать;
Irq=0;  //отрисовано (прерывание обработано)
}
А вообще спасибо за ответ.

08.09.2003 11:17:35
#4

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,493

Re: Прерывания в DOS

В первоначальном тексте было немного по-другому? а именно:
while(!kbhit()){
if(Irq==1) {
... //если БЫЛО прерывание - рисовать;
}
Irq=0;//данные отрисованы
}
Или это была Ваша опечатка?

Андрущенко
08.09.2003 19:01:14
#5

Гость

Re: Прерывания в DOS

Вообще-то да sad
Но мне просто интересно, прерывания генерируются при покадровой синхронизации так как надо или нет?

08.09.2003 21:15:05
#6

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,493

Re: Прерывания в DOS

А у Вас какая плата-то? Случаем не L-761?

Андрущенко
09.09.2003 11:29:39
#7

Гость

Re: Прерывания в DOS

L-761 2185b

09.09.2003 17:51:40
#8

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,493

Re: Прерывания в DOS

Для платы L-761  переменную IrqStep меньше чем 128 делать нельзя sad
Если Вам требуется именно такой режим сбора данных (с  IrqStep = 0x1), то, в принципе, можно попробовать изменить алгоритм работы DSP путем модификации штатного LBIOS.

Андрущенко
09.09.2003 19:44:13
#9

Гость

Re: Прерывания в DOS

Почему об этом не сказано в документации?
Или это из серии "Недокументированные возможности процессоров INTEL"?:)

10.09.2003 09:19:41
#10

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,493

Re: Прерывания в DOS

Это из серии "Недокументированные возможности штатного LBIOS платы L-761" smile))

Андрущенко
10.09.2003 13:22:07
#11

Гость

Re: Прерывания в DOS

Я Вам ответил письмом

11.09.2003 11:02:17
#12

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,493

Re: Прерывания в DOS

Чой-то я ничегошеньки не получил sad((

Андрущено
16.09.2003 12:56:28
#13

Гость

Re: Прерывания в DOS

Ау!!!
Хотелось бы узнать как всё-таки как быть с прерываниями под Irqstep меньше 128?

17.09.2003 13:21:58
#14

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,493

Re: Прерывания в DOS

Дык... Я же уже упоминал, что при использовании штатного ПО для платы L-761 не рекомендуется устанавливать переменную Irqstep меньше чем 128. Вроде бы и добавить больше нечего...

Андрущенко
17.09.2003 15:22:00
#15

Гость

Re: Прерывания в DOS

Выше Вы написали о возможности использовать штатное ПО со значением переменной IrqStep <128 через модификацию штатного LBIOS.Будет ли такой  LBIOS в "библиотеке файлов" на сайте,если да то когда?

17.09.2003 16:49:39
#16

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,493

Re: Прерывания в DOS

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

Андрущенко
17.09.2003 17:16:46
#17

Гость

Re: Прерывания в DOS

OK!