|
|
Прерывания в 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 идут великолепно
ЧТО ДЕЛАТЬ?
Спасибо за ответы.
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,493
|
Re: Прерывания в DOS
Так на вскидку:
1. Что это за переменная такая IrqN? Ведь в обработчике прерываний используется флажок Irq.
2. Почему в теле цикла прорисовки данных
while(!kbhit()){...}
постоянно сбрасывается флажок Irq, устанавливаемый в обработчике прерываний? И этот сброс осуществляется всегда (без условий), не смотря на то было или нет прерывание от платы.
|
|
|
Re: Прерывания в DOS
IrqN это Irq, я неправильно написал, и состояние этого флага как раз и является условием:
while(!kbhit()){
if(Irq==1)//если БЫЛО прерывание
... //рисовать;
Irq=0; //отрисовано (прерывание обработано)
}
А вообще спасибо за ответ.
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,493
|
Re: Прерывания в DOS
В первоначальном тексте было немного по-другому? а именно:
while(!kbhit()){
if(Irq==1) {
... //если БЫЛО прерывание - рисовать;
}
Irq=0;//данные отрисованы
}
Или это была Ваша опечатка?
|
|
|
Re: Прерывания в DOS
Вообще-то да
Но мне просто интересно, прерывания генерируются при покадровой синхронизации так как надо или нет?
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,493
|
Re: Прерывания в DOS
А у Вас какая плата-то? Случаем не L-761?
|
|
|
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,493
|
Re: Прерывания в DOS
Для платы L-761 переменную IrqStep меньше чем 128 делать нельзя
Если Вам требуется именно такой режим сбора данных (с IrqStep = 0x1), то, в принципе, можно попробовать изменить алгоритм работы DSP путем модификации штатного LBIOS.
|
|
|
Re: Прерывания в DOS
Почему об этом не сказано в документации?
Или это из серии "Недокументированные возможности процессоров INTEL"?:)
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,493
|
Re: Прерывания в DOS
Это из серии "Недокументированные возможности штатного LBIOS платы L-761" ))
|
|
|
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,493
|
Re: Прерывания в DOS
Чой-то я ничегошеньки не получил ((
|
|
|
Re: Прерывания в DOS
Ау!!!
Хотелось бы узнать как всё-таки как быть с прерываниями под Irqstep меньше 128?
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,493
|
Re: Прерывания в DOS
Дык... Я же уже упоминал, что при использовании штатного ПО для платы L-761 не рекомендуется устанавливать переменную Irqstep меньше чем 128. Вроде бы и добавить больше нечего...
|
|
|
Re: Прерывания в DOS
Выше Вы написали о возможности использовать штатное ПО со значением переменной IrqStep <128 через модификацию штатного LBIOS.Будет ли такой LBIOS в "библиотеке файлов" на сайте,если да то когда?
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,493
|
|
|
|
|