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


Програмирование E330

Вы не вошли.

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

Василий
23.05.2007 20:10:37
#1

Гость

Програмирование E330

Пишу прогу для работы с E330

POWER_AND_PRINTER_E330(0,0);

MemorySize=MEMORY_STATE();

if(MemorySize) FifoSize=8192; else FifoSize=400;

SET_FIFO_PARAMETERS_E330(FifoSize, 0);

for (int i = 0; i<NChannels; i++) {LogicNumChannels[i]=CREATE_CHANNEL(i, 0, 0);   NumChannels [i] = i;}

SET_SOFT_PARM_E330(CountActiveChannel, LogicNumChannels);

SET_TIME_PARAMETERS_E330(1000);

// запустим ввод
TIMER_INPUT_IRQ_START_E330(E_Interrupt_Fifo);
}

// обработчик прерываний, осуществляющий циклический ввод в массив Data
// половинок FIFO буфера
HANDLER_TYPE E_Interrupt_Fifo(HANDLER_PARM)
{
        Schetchik++;
        frmMain->Label3->Caption = Schetchik;

        READ_FIFO(Data,HalfSize);

        for (int Nchann = 0; Nchann < CountActiveChannel; Nchann++){
                frmMain->Label5->Caption = CountActiveChannel;
//                if (MainDispl->Activated(Nchann)){
//                        for (int i = 0; i < szBuf; i++) TempData[i] = Data[i * NChannels + Nchann];
                        for (int i = 0; i < szBuf; i++) TempData[i] = Data[i * CountActiveChannel + Nchann];

                        MainDispl->SetAllBuffer (NumChannels[Nchann], (const short*)TempData);
                        MainDispl->SendBuffer(NumChannels[Nchann]);
                }

RESET_IRQ();
}
}


Как мне сделать чтоб при нажатии на кнопку останавлиавлись генерация прерываний а затем  опять начинались

Пишу вот так
void __fastcall TfrmMain::Button2Click(TObject *Sender)
{
        STOP_INTR();
        TIMER_INPUT_IRQ_START_E330 (E_Interrupt_Fifo);
}

Что еще нужно для корректной работы???
В таком варианте оно как то через раз работает!!!
Не пойму почему!!!
Подскажите пожалусто диплом горит!

Василий
23.05.2007 23:39:31
#2

Гость

Re: Програмирование E330

Кто нить ответьте пожалусто поскорее!
А то меня расчленят!

24.05.2007 09:35:06
#3

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

Re: Програмирование E330

может не останвливать а игнорироать/неигнорировать по флажку? И еще работа с формами из обработчика это неправильно...

Влад
24.05.2007 10:01:48
#4

Гость

Re: Програмирование E330

1. Попробуйте после STOP_INTR() вызвать ADCHAN()

2. Если внутри обработчика идет вывод на дисплей, то это неправильно. В обработчике лучше перекладывать данные в массив, который обрабатывать уже в основной программе.

Василий
24.05.2007 10:32:23
#5

Гость

Re: Програмирование E330

1. ADCHAN() не помогает.
2. Закоментировал полностью вывод на дисплей осталось только
HANDLER_TYPE E_Interrupt_Fifo(HANDLER_PARM)
{
   READ_FIFO(Data,HalfSize);
   RESET_IRQ();
}

Василий
24.05.2007 10:36:04
#6

Гость

Re: Програмирование E330

При нажатии на кнопочку делаю так
просто изменяю частоту ввода в буфер
void __fastcall TfrmMain::Button2Click(TObject *Sender)
{
STOP_INTR();
SET_TIME_PARAMETERS_E330(100);
TIMER_INPUT_IRQ_START_E330 (E_Interrupt_Fifo);
}

Нажимаю пару раз на кнопочку вроде все нормально работает останавливается запускается но если на нее нажать побыстрее и по больше раз то прога зависает.

Что же делать?

Влад
24.05.2007 10:48:01
#7

Гость

Re: Програмирование E330

А какая у Вас среда разработки?

Василий
24.05.2007 10:54:52
#8

Гость

Re: Програмирование E330

C++ Builder 6

24.05.2007 12:06:16
#9

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

Re: Програмирование E330

попробуйте просто ограничить скорость нажатия задержкой....

Василий
24.05.2007 12:22:41
#10

Гость

Re: Програмирование E330

Вы говорите "И еще работа с формами из обработчика это неправильно..."
а как насчет записи файла на жесткий диск это верно?

А если работа с формами не верно, то как тогда отображать данные? Если я буду их где то в другом месте отображать то пока я их отображаю может так случиться что буфер снова заполнится и произойдет прерывание и данные которые я еще не отобразил или не записал в файл перепишутся уже новыми. А если сделать чтоб данные не считывались какую-нибудь переменную ввести чтоб половинка не считывалась пока идет прорисовка то тогда какая разница где их отображать в обработчике прерывания или нет?

Дело в том что у меня все нормально отображается все 16 каналов прорисовываются в обработчике прерывания и не каких глюков. Пока я не пытаюсь перезапустить процесс.

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

Так что по не останвливать а игнорироать/неигнорировать по флажку получается нельзя так.

Как же быть???

24.05.2007 15:57:13
#11

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

Re: Програмирование E330

так как насчет зажержки при перезапуске?

Василий
24.05.2007 16:31:08
#12

Гость

Re: Програмирование E330

Зачем мне задержка! И так понятно что это тоже самое что медленно нажимать кнопку!
Это я вам сказал чтоб вам было понятнее из-за чего может быть ошибка.
А так конечно я с такой скоростью на кнопку нажимать не буду!

Или вы все таки думаете что это какая то ошибка в Lcard32.dll? Я так думал что это я что то не правильно сделал.

Но если честно после того как не где не было документировано что из буфера надо забирать данные чтоб он не останавливал прерывания и что не начинает писать вторую половинку пока я не заберу первую хотя по идее так оно и должно быть если логически подумать, то после этого уже ничему удивлюсь!

Ну я все таки поробовал!

void __fastcall TfrmMain::Button2Click(TObject *Sender)
   STOP_INTR();

   Sleep(100);

   SET_TIME_PARAMETERS_E330(100);
   TIMER_INPUT_IRQ_START_E330(E_Interrupt_Fifo);
}

Задержка 0.1 секунды вроде как работает даже.
Покрайней мере у меня не получилось сделать так чтоб он завис, но может это какие стечения обстоятельств такие.

Но это без отображения на эране данных.

Как же их тогда отображать? В каком месте? Всмысе где в коде?

Василий
24.05.2007 16:34:33
#13

Гость

Re: Програмирование E330

Раскажите как это умные люди делают?

Василий
24.05.2007 16:45:36
#14

Гость

Re: Програмирование E330

И тогда сразу еще вопрос так что в файл писать то можно или нет в обработчике прерывания?

Василий
24.05.2007 16:53:32
#15

Гость

Re: Програмирование E330

Ну и еще вопросики
1. Можно ли вызывать READ_FIFO(); не в обработчике прерывания???
2. Можно ли вызывать READ_FIFO(); после STOP_INTR(); ??? И если можно то она очистит буфер или нет?

Надеюсь не сильно много вопросов! Просто горит уже а в документации почти ничего нет!
Знаю знаю устройство устаревшее и больше не поддерживается. Но у нас институт бедный и другого у них нет! Это не хотят на дом даже давать!

Влад
24.05.2007 17:05:36
#16

Гость

Re: Програмирование E330

1. Можно
2. Нельзя. Скорее всего все зависнет.

Василий
24.05.2007 17:53:49
#17

Гость

Re: Програмирование E330

А может такое быть что у меня оно и зависает из-за того, что буфер не ститался перед тем как вызвать STOP_INTR() или все таки STOP_INTR() очищает буфер?

Poul
24.05.2007 21:51:23
#18

Гость

Re: Програмирование E330

скажем так....должен быть поток в котором отслеживается прерывание (по флажкам событиям или еще как). В билдере у потока есть спец процедура где можно обновлять компоненты интерфейса...