Меню

+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
|
||||
|
e502: синхронный ввод/выводПомогите пожалуйста разобраться с синхронным вводом выводом. Вот такой код
ОС - Линукс, частота АЦП (на канал) 2 МГц, сбора кадра - 4 кГц, число каналов АЦП - 11. А вот и не получается. Такое ощущение, что синхронная запись не выполняется, для всех значений в out_buff[0] читается одно и тоже значение в inp_buff[0]. Да, кстати, еще замечание: при асинхронной записи функция Если необходимо могу выложить код асинхронного варианта. |
|||
|
||||
|
Re: e502: синхронный ввод/выводПо поводу ошибки при асинхронном выводе, то такая проблема была, но она должна была быть исправлена в последней версии FPGA (0.11) - на Linux можете взять пакет Не до конца пока понял, как при таком выводе синхронизируются моменты вывода и входные данные, т.к. все же есть некая задержка между тем как данные будут сняты с входов и тем как их успеет принять программа на верхнем уровне. Если нужно перебирать значения на выходах всегда в одном порядке, то я бы воспользовался бы циклическим выводом, записав перед стартом последовательность всех адресов на вывод и модуль бы уже аппаратно бы их выводил с заданной частотой (только нужно учесть, что частота вывода из определенного набора и ровно 4 КГц там вроде не получится -- я бы выводил на 1МГц но уменьшил бы частоту изменения за счет повтора данных - тогда можно вообще сделать, чтобы изменения выходов были посередине кадра, чтобы было время на установление данных -- у вас же наверняка есть электрическая задержка сигналов между установкой адреса и появлением данных). |
|||
|
||||
|
Re: e502: синхронный ввод/выводВот спасибо, обновление прошивки помогло для случая асинхронного вывода/ввода - эта странная ошибка исчезла.
т.е. только на 20-й раз считаю данные действительными при неизменном значении адреса.. но похоже это мало чем будет отличаться по скорости с асинхронным вариантом |
|||
|
||||
|
Re: e502: синхронный ввод/выводПравильно ли я понял, что Вам нужно просто с заданной частотой читать значения входов при определенных значениях выходов, при этом значения выходов по сути должны перебираться последовательно по кругу из заданного набора кодов (у Вас в примере от 0 до 6)? |
|||
|
||||
|
Re: e502: синхронный ввод/выводда, примерно так.. только есть еще один вариант - в адрес может асинхронно по времени добавляться 4 бит, а в а старшие биты - некоторая управляющая информация для внешнего оборудования.. Тогда при чтении должен читаться регистр состояний. Т.е. все несколько сложнее простого перебора чтения внешних данных по адресам от 0 до 5. |
|||
|
||||
|
Re: e502: синхронный ввод/выводасинхронные биты и старшие с управляющей информацией - они влияют на то что вводится, т.е. нужно сопоставлять введенное слово цифровых линий только с адресом или еще и с этой информацией? Если эти доп. данные влияют на вход, то с асинхронными данными и этой дополнительной информацией есть требования ко времени считывания реакции и если есть, то какое? |
|||
|
||||
|
Re: e502: синхронный ввод/выводименно так - то что вводится зависит от 4-го бита. Если он 0, то читаются статусы с регистров одного типа, если 1 - то на железке выполняются некоторые действия и читаются уже другая статусная информация. Причем в этом случае установка 4-го бита, адреса (3 мл.бита) и содержимое старших битов происходит асинхронно из другого потока и время чтения вообще говоря имеет вторичное значение, поскольку статусная информация появится только через несколько миллисекунд, тогда как в случае нулевого 4-го бита чем быстрее тем лучше. |
|||
|
||||
|
Re: e502: синхронный ввод/выводПроблема в том, что как я и раньше писал, хотя E502 вводит и выводит синхронно, но от реального ввода данных модулем до того как прочитаете данные в программе проходит некая задержка. Как и при выводе. Соответственно она у Вас и получается видимо порядка 20 циклов. Т.е. вы когда выводите значение у Вас уже есть несколько кадров которые введены модулем, но еще не прочитаны + еще добавиться к тому времени как выведенные данные дойдут до модуля. Соответственно для асинхронного вывода эта задержка всегда будет (Вы в примере по сути и сводите синхронный вывод к асинхронному, т.к. по сути формируете данные асинхронно). Я бы в Вашем случае, насколько я понимаю задачу, для обычного опроса с нулевым битом, который должен был бы выполняться как можно быстрее, использовал бы циклический вывод, сразу записав весь цикл опроса на все адреса, как писал раньше - на максимальной частоте и с переключением адреса посередине периода ввода. Т.е. перед стартом можно выполнить один раз что-то вроде:
Соответственно при чтении в первом кадре значение цифровых линий можно отбросить, а дальше они будут уже соответствовать последовательно адресам. При таком подходе обычный опрос по адресам можно сделать и с частотой до 500 КГц, если время установления сигналов того устройства откуда считываются данные позволяет. Асинхронный вывод можно сделать путем смены циклических страниц. Загрузить вторую страницу размером, соответствующим времени чтения этой доп. информации. Далее на вводе нужно будет только еще определить, каким принятым кадрам соответствует асинхронная информация. Я бы один бит с выхода завел на вход, который всегда устанавливается в 1 при асинхронном выводе и в 0 при обычном опросе, тогда на входе можно понять, какие данные чему соответствуют. |
|||
|
||||
|
Re: e502: синхронный ввод/выводВсе это интересно конечно, но пока я отвлекся на аналоговые входы.
Теперь изменяю амплитуду или относительную фазу любого напряжения... в данных с АЦП ничего не меняется. Перезапускаю программу - все ок, пошли правильные данные.
Все встает на свои места, изменения входных напряжений сразу видны в данных с АЦП. |
|||
|
||||
|
Re: e502: синхронный ввод/выводЭто может быть, если Вы не успеваете в своей программа вычитывать данные синхронного ввода. Т.е. из АЦП данные передаются быстрее чем Вы их реально вычитываете через Recv(), в результате Вы откачиваете более старые данные из начала очереди. Если Вы принимаете за один Recv всего по одному кадру, а кадр на 4 КГц, то соответственно Вам и нужно вызывать Recv() так, чтобы в среднем он вызывался не меньше 4000 раз в секунду. У Вас же в цикле Recv идет последовательно с асинхронными операциями, которые в общем не быстрые и могут занимать время больше чем 250 мкс (управляющие запросы вполне могут выполнятся и за несколько мс), соответственно получается, что Recv() вызывается с меньшей скоростью. Соответственно нужно либо вызывать асинхронный ввод-вывод не на каждый кадр, либо асинхронные функции вызывать из другого потока, либо использовать синхронный ввод/вывод для цифровых линий. |
|||
|
||||
|
Re: e502: синхронный ввод/выводВернулся к синхронному варианту: чисто синхронный ввод и прием данных с АЦП... что-то вообще начался бардак с АЦП-шными данными.Код примерно такой:
т.е. я хочу принять только слово с цифровых входов.
если это это убрать и убрать добавление 1 к числу каналов АЦП (т.е. вернуться к приему только данных с АЦП), то все работает нормально. |
|||
|
||||
|
Re: e502: синхронный ввод/выводЧто подразумеваете под словом "бардак"? ProcessData возвращает те резмеры, которые ожидаете? завершается без ошибок? |
|||
|
||||
|
Re: e502: синхронный ввод/выводвот здесь два снимка экрана: https://cloud.mail.ru/public/GexC/rRb8ANWSN |
|||
|
||||
|
Re: e502: синхронный ввод/выводвынес асинхронный ввод/вывод цифровых данных в отдельный поток. Данные с АЦП принимаются нормально, но с цифровых входов ничего не читается. Прямо заколдованный круг какой-то. Если в АЦП-шном цикле заменяю чтение с АЦП на чтение цифровых данных - все ок.. |
|||
|
||||
|
Re: e502: синхронный ввод/выводВ каком смысле не читается? Функция возвращает ошибку или читаются все время нули или что именно? Все же стоит описывать через поведение вызовов функций.... |
|||
|
||||
|
Re: e502: синхронный ввод/выводразобрался немного и поправил свои ошибки в варианте раздельных потоков: запускаю последовательно два потока: 1. В первом потоке - синхронное чтение данных с АЦП
2. второй поток - асинхронное чтение/запись цифровых данных
Сразу после старта поток 1 (чтение АЦП) выдает ошибку: "error stream enable (-15)" (Истекло время ожидания освобождения мьютекса). Если я запускаю или 1=й поток или 2-й, то по отдельности все работает. А на счет картинок (если я правильно понял тут возникло непонимание?) - то на первой - это нормальный результат: амплитуды стабильны, относительные фазы тоже. Пока оставим это и если можно попытаемся разобраться почему поток с синхронным вводом с АЦП не хочет совмещаться с потоком асинхронного ввода с цифровых входов. |
|||
|
||||
|
Re: e502: синхронный ввод/выводДа, так понятнее. Просто у Вас ошибку возвращает функция X502_StreamsEnable(), но если я правильно понимаю, на этот момент m_bRun должен быть false и действия из второго потока не выполняться (хотя не очень понятно из куска, что делает второй поток, если m_bRun == false?). Так что просьба проверить, что действия из второго потока начинают выполняться после X502_StreamsStart(m_dev) в первом (я бы прям после этого вызова из первого потока бы из запустил второй) |
|||
|
||||
|
Re: e502: синхронный ввод/выводвот спасибо! Этот вариант заработал. Сразу после
я вставил
и все пошло.. До этого варианта я не додумался, наверное при последовательно старте потоков поток с цифровыми данными стартовал почему-то первым.. Если вы от меня не устали |
|||
|
||||
|
Re: e502: синхронный ввод/выводОк. Отлично) |
|||
|
||||
|
Re: e502: синхронный ввод/выводсейчас приведу все в порядок (это замет немного времени) и сделаю... |
|||
|
||||
|
Re: e502: синхронный ввод/выводсделал упрощенный вариант: только чтение 11 аналоговых каналов и 1 цифровой. Получил следующее 12 7 1 здесь первая цифра - то что возвращает Recv, вторая - adc_size и последняя - inp_size... |
|||
|
||||
|
Re: e502: синхронный ввод/выводпокрутил частоту X502_SetDinFreq.. чем меньше частота, тем ситуация меняется в сторону данных с АЦП. При 500 Гц получаю 12 11 1 |
|||
|
||||
|
Re: e502: синхронный ввод/выводХм.... исчезнуть они по идее могут только если соотношение цифровых линий к количеству отсчетов АЦП не соответствует 1 к 11. Соответственно если цифровых линий больше 1, то их не сможет ProcessData положить в буфер... Можете тогда для проверки сделать adc_size и din_size на входе равными 12 (и массивы тоже на соответствующий размер) и также указать, что вернули функции X502_SetAdcFreq в качестве f_frame и X502_SetDinFreq в качестве f_din. и вывести новые цифры количеств |
|||
|
||||
|
Re: e502: синхронный ввод/выводВ первом случае точно одинаковая частота f_frame и f_din? |
|||
|
||||
|
Re: e502: синхронный ввод/выводнет конечно.. а что нужно точное соответствие? |