|  | 
    | 
       
      
        
        УчастникЗдесь с 24.01.2018Сообщений: 9 | 
        L-502 Получение данных с цифровых входов
          Здравствуйте! Имеется карта L-502. Требуется снимать данные цифровых входов с частотой 1МГц и обрабатывать их 500 раз в секундуПровожу инициализацию (в компьютерной программе никаких инициализаций, кроме загрузки прошивки, не происходит):
 
 params_set_din_freq_div( 2'000'000 / 1'000'000 );
 sport_in_set_step_size( 1'000'000 / 500 );
 configure();
 stream_enable( L502_STREAM_DIN );
 streams_start()
 Есть счетчик прерываний uint64_t COUNTER. При каждом вызове функции usr_in_proc_data делаю COUNTER++ Во внешней программе запущен цикл со Sleep(100) и происходит вывод size и COUNTER (через X502_BfExecCmd):...
 size=2000 counter=205
 size=2000 counter=369
 size=2000 counter=533
 size=2000 counter=697
 size=2000 counter=861
 ...
 Т.е. за 100мс компьютера происходит ~164 прерывания. Что соответствует потоку данных 164*2000*10=3'280'000 слов в секунду.
 Что я делаю не так? Есть еще странность: если в stream_enable разрешить только поток АЦП, то прерывания все равно происходят.
 | 
  
    |  | 
    | 
       
      
        
        Сотрудник "Л Кард"Здесь с 17.04.2014Сообщений: 1,357 | 
        Re: L-502 Получение данных с цифровых входов
          Здравствуйте.А поток с АЦП при этом у Вас разрешен?
 Дело в том, что данные от DIN и АЦП передаются общим потоком и у них общий шаг прерывания (который устанавливается sport_in_set_step_size, поэтому в названии _in, а не _din). При этом частоты задаются свои, и с этой частотой данные с АЦП и DIN сливаются в общий поток и передаются в BF (т.е. если частота АЦП в 2 раза больше DIN, то у Вас будет поток, где слова АЦП в 2 раза чаще слов DIN). Соответственно в usr_in_proc_data передаются данные как АЦП, так и din (отличить их можно по формату слов), соответственно Вы можете разобрать данные в этой функции и обработать только DIN, если Вам это нужно.
 Поэтому и при разрешении только АЦП у Вас прерывания остаются (но частота их скорее всего будет немного меньше). Если частота АЦП у Вас 2Мгц и этот поток разрешено, то как раз получается 3000000 слов в секунду, что близко к Вашему замеру. | 
  
    |  | 
    | 
       
      
        
        УчастникЗдесь с 24.01.2018Сообщений: 9 | 
        Re: L-502 Получение данных с цифровых входов
          Спасибо за ответ!А разве вызов stream_enable( L502_STREAM_DIN ); не запрещает все, кроме потока DIN?
 | 
  
    |  | 
    | 
       
      
        
        Сотрудник "Л Кард"Здесь с 17.04.2014Сообщений: 1,357 | 
        Re: L-502 Получение данных с цифровых входов
          Нет, он добавляет DIN к разрешенным потокам, т.е. те что были разрешены до вызова останутся разрешенными, если их явно не запретить. | 
  
    |  | 
    | 
       | 
        Re: L-502 Получение данных с цифровых входов
          Купили вашу карту L502 для сбора цифровых данных. Проект очень ответственный и не дешевый.В процессе отладки обнаружились странности по настройке синхронного  ввода данных.
 Особенно, когда работа с картой вырубает "операционку" (Windows 7).
 Судя по тому что прочитал выше, могу выразить сожаления из-за  потерянного времени.
 Сопоставляя с написанным, а именно то, что нужно обязательно отключить ненужные потоки, чтобы они не мешали используемым,
 вижу , что у вас этого в описании нет! Также там не упоминается никак, какие из потоков включены по умолчанию!
 Чтобы все сразу вразнобой работало..... Извините, но обычно так не делают!
 Пожалуйста доработайте хотя бы документацию!
 | 
  
    |  | 
    | 
       | 
        Re: L-502 Получение данных с цифровых входов
          Следующая проблема:Делитель частоты для синхронного ввода (din_freq_div) установлен величиной 20.
 Считывание данных происходит по таймеру 0,1 сек.
 Количество накопленных данных (под отладчиком)  в счетчике rdy_cnt оказывается  всегда большим: порядка  400 000 - размер буфера в DMA.
 Хотя за 0,1 сек их должно быть в 40 раз меньше!
 После разборки L502_ProcessData из них записывается в буфер данных цифрового ввода 1408 слов, примерно соответствует количеству слов за 2 прерывание  64 раза/сек, а не 10 раз/сек.
 Где остальные данные?
 Установка делителя частоты для синхронного ввода (din_freq_div) величиной 200 и более приводит к прекращению ввода данных.
 Хуже того, ввод используемого на данный момент времени значения 20 не возвращает L502  к исходному и требуется перезагрузка компьютера.
 В чем причина?
 | 
  
    |  | 
    | 
       
      
        
        Сотрудник "Л Кард"Здесь с 17.04.2014Сообщений: 1,357 | 
        Re: L-502 Получение данных с цифровых входов
          Честно говоря, что-либо понять из Ваших сообщений достаточно сложно. Если предположить, что Вы используете модуль в режиме с сигнальным процессором и как-то изменяете штатную прошивку, то в ней действительно по умолчанию разрешен сбор данных с АЦП и если Вам он не требуется, то его нужно запретить (либо вызовом stream_disable(L502_STREAM_ADC) на уровне BlackFin (или изменение начального состояния g_streams в l502_streams.c, либо через X502_StreamsDisable() на верхнем уровне), как это уже обсуждалось в данной теме.
 Если ввод с АЦП не разрешен, то точек на ввод понятно будет значительно больше, а ProcessData из всех введенных данных сохранит в din_data только данные, относящиеся к цифровому вводу, а данные АЦП в adc_data (или отбросит, если нулевой указатель), что может объяснять уменьшение данных на выходе. В режиме с сигнальным процессором (в отличие от работы без него) открытие модуля само по себе не приводит к переводу модуля в начальное состояние или останову сбора данных, т.к. в общем случае это может быть неприемлемо, т.к. для своей прошивки части клиентов может быть необходимо, чтобы модуль выполнял специальные функции и при отключении ПО верхнего уровня и последующего подключение модуль бы не сбивало, но при необходимости на верхнем уровне можно узнать, запущен ли сбор данных и остановить его и перезаписать прошивки сигнального процессора, если это необходимо.В общем случае написание встроенного ПО внутри модуля дает больше возможностей пользователю, но и более сложное и дает пользователю больше возможностей ввести модуль в некорректно работающий режим.
 | 
  
    |  | 
    | 
       | 
        Re: L-502 Получение данных с цифровых входов
          Спасибо за ответ! Действительно забыл указать подробности. BlackFin_а нет, АЦП нет ))
 Плата работает чисто на цифровой ввод.
 Пришлось потратить целый день чтобы выяснить простую вещь: либо у вас не работает L502_SetDinFreq(), либо его описание не соответствует тому как
 оно понимается обычным пользователем.
 Я (и не только я) ) понимаем из описания так, что это должен быть делитель, который делит тактовую  частоту 2Мгц (или 1,5) и уже на пониженной тактовой снимаются состояния цифровых входов и с этой пониженной частотой они накапливаются в L502 и затем уже поступают в DMA со своими интервалами и прочими особенностями. Похоже, что  это не так. Если нет, то отлаживать систему на максимальных скоростях очень неудобно!
 Вначале я пытался именно это и проверить стандартными под отладчиком методами.
 К сожалению, отладка "в лоб" под QT внесла немало непонятного и пришлось замерить в длительных циклах время и количество считываемых слов в секунду. Стало понятно что при всех раскладах  это 2*106 отсчетов с точностью таймера.
 Попытка переставлять L502_SetDinFreq()  до или после других настроек и команд результата не дала. Кроме "зависаний" ))
 | 
  
    |  | 
    | 
       
      
        
        Сотрудник "Л Кард"Здесь с 17.04.2014Сообщений: 1,357 | 
        Re: L-502 Получение данных с цифровых входов
          Ок, просто Вы писали в теме по BlackFin, и чем-то описание схоже вашей проблемы.Правда пока не совсем понятно, с чем связана Ваша проблема, деление частоты должно работать как Вы изначально его описали.
 Попробуйте следующее:
 - убедитесь, что установлена последняя версия lpcie_sdk с сайта (https://www.lcard.ru/download/lpcie_setup.exe)
 - проверьте версию прошивки ПЛИС модуля (либо в своей программе, либо через X502Studio (https://www.lcard.ru/download/x502studio.zip)), а также корректность читаемого серийного номера платы L-502. Версия должна быть 0.9 или 0.10, если ниже нужно обновить (с помощью утилиты в lxfw-update в директории tools из sdk). Если версия и серийный номер отображаются некорректно, то возможно у Вас версия прошивки ПЛИС ниже 0.9 и есть проблемы совместимостью с Вашей мат. платой, которые были устранены в версии 0.9. По хорошему нужно обновить прошивку платы тогда на другом ПК.
 - попробуйте взять код один в один из консольного примера https://www.lcard.ru/download/examples/ … m_read.zip, заменить строку X502_StreamsEnable(hnd, X502_STREAM_ADC | X502_STREAM_DIN) на X502_StreamsEnable(hnd, X502_STREAM_DIN), чтобы не разрешать прием данных АЦП, и поменять определение DIN_FREQ на нужную частоту, а READ_BLOCK_SIZE  на нужный размер чтения. Проверьте, приводит изменение частоты к понижению скорости приема данных.
 - если все работает корректно, то можно подстроить шаг прерывания (т.к. если Вы вручную настраиваете малый шаг прерывания, а частота по какой-то причине осталась старая или все же разрешен сбор с АЦП, то в предельном случае это может привести к частоте прерываний слишком частой для Windows).
 | 
  
    |  | 
    | 
       | 
        Re: L-502 Получение данных с цифровых входов
          Было:board_rev      0
 fpga_ver        4
 plda_ver        1
 serial              "4T366281"
 После обновления прошивки программой Д502-fpga-update-all
 стало
 fpga_ver        10
 Перезапуск  ничего не дал,  ввод идет по прежнему с 2М отсчетов/с
 Еще раз прошу прощения!Плата действительно оказалась с  BlackFin и  АЦП.
 Но поскольку они не используются, мне и в голову не пришло проверять их наличие...
 Работа идет через ПЛИС, т.е. BlackFin не задействован.Установки параметров при запуске для L502  следующие:
 L502_SetRefFreq(L502_0, L502_REF_FREQ_2000KHZ);
 L502_SetSynMode(L502_0, L502_SYNC_INTERNAL);
 L502_SetDinFreqDivider(L502_0, din_freq_div);    // перед этим  делается присвоение uint32_t  din_freq_div =5;
 L502_StreamsDisable(L502_0, L502_STREAM_ALL_IN | L502_STREAM_ALL_OUT);
 L502_StreamsEnable(L502_0, L502_STREAM_DIN);
 L502_StreamsStart(L502_0);
 | 
  
    |  | 
    | 
       
      
        
        Сотрудник "Л Кард"Здесь с 17.04.2014Сообщений: 1,357 | 
        Re: L-502 Получение данных с цифровых входов
          У Вас отсутствует вызов L502_Configure(), по которому все установленные настройки собственно записываются в модуль. Должен быть после вызова всех функций L502_SetXXX до L502_StreamsStart() (положение L502_StreamsEnable()/L502_StreamsDisable() относительно Configure() не принципиально). | 
  
    |  | 
    | 
       | 
        Re: L-502 Получение данных с цифровых входов
          Спасибо за ответ!Делитель заработал.
 |