Teensy 3.2 теряет связь по USB

Тема в разделе "Arduino & Shields", создана пользователем Бармалей, 1 май 2018.

  1. Здравствуйте. Не могу найти в интернете информацию. Помогите, пожалуйста.

    Имеется teensy 3.2. К ней подключена адресуемая лента, которая управляется через библиотеку Adafruit Neopixel. Имеется компьютер, который по serial- соединению посылает по 8 байт. Teensy эти 8 байт читает, выделяет некий индекс, и в зависимости от этого зажигает тот или иной кусок ленты цветом, который также указан в этих 8 байтах.

    Суть проблемы: Неожиданно теряется связь по USB во время работы. Все идёт хорошо, но в интервале от нескольких секунд до получаса вдруг теряется устройство, и комп его тоже не видит.

    В чем может быть проблема?
     
  2. Daniil

    Daniil Гуру

    Что значит "теряется"? В диспетчере устройств что?
    Как происходит обмен данными?
    Тинси отвечает как-нибудь, что пакет принят (я бы делал так, что пк не отправляет данные пока тинси не ответит, что предыдущие данные прошли)?
    Обработка на тинси как проходит?
    Есть вероятность, что тинси обрабатывая данные зависнет (наводка - байт пришел с ошибкой - у тинси не правильно обрабатывается неправильный байт)?
    Я бы сделал, что через n секунд после принятия байта тинси выходила в основной цикл (аналог whatch dog).
    Ещё бы добавил выдачу на ком-порт "метки", которые пк никак не обрабатываются, но для отладки пригодились бы (узнать где зависла тинси, какие шаги она делала перед зависанием), в конце концов для проверки отправлять на пк принятые байты (исключить проблемы со связью).
    Может пк заплевывает бедную тинси до состояния зависания.
     
  3. P.S.
    В лупе идёт ожидание serial.available() == 8. Была мысль, что байт теряется, либо приходит лишний, и тинси идёт вразнос. Верхнюю прогу пишу не я, но гуевину а-ля терминал с красивыми кнопочками я писал. ПК однозначно байтами беспорядочно не бросается, что в одной, что в другой проге.

    Не приходит в голову алгоритм, как периодически чистить буфер без потери полезных данных. Просто непонятно, как он будет отличать полезные от мусора..
     
  4. "Теряется" значит перестаёт определяться виндой как com-порт. Лечится перезагрузкой Тинси и перевтыканием usb-кабеля
     
  5. Daniil

    Daniil Гуру

    Есть запасная тинси? Или попробуйте на этой тинси погонять туда-сюда байты в автоматическом режиме.
    Есть ли вариант, что в каком-то случае тинси нагружается очень сильно? Правильно ли подключена лента? Может когда горит 1 светодиод всё хорошо, а когда загораются все, то источник не справляется -> его напряжение проседает -> всё перезагружается -> комп отправляет байты -> у тинси разрыв шаблона, т.к. она ещё не включилась (сконфигурировалась), а от неё уже что-то хотят?

    Попробуйте вставить в код тинси при заходе в любой цикл, при выходе из него, может даже в ветвлениях (if then else) serial.print('я зашёл/вышел в/из цикл/а №1') и т.п (желательно меньше букв, т.к. они память занимают). И отладить всё это дело для начала в ручном режиме - Вы формируете 8 байт ручками, отправляете и смотрите по полученным ответам как отработала программа, а потом в автоматическом - с программой.
    И отправляйте обратно на ПК то, что получила тинси. (ради отладки)
    Даже в процедуре setup на всякий случай поставьте такие метки (конечно, после инициализации com-порта).

    Может засечёте что на какую-нибудь особенную последовательность тинси будет как-то особенно реагировать или при повышении скорости выработки 8-ми байт что-то не то начнёт проявляться.
    Всё таки проверьте ещё раз, что в программе на ПК не может быть случая, который тинси не может отработать. Отправляется байт с значением, которое выходит за пределы, что-то недоотправляется...всё что угодно может быть.

    Эта тинси только светодиодиками мигает или делает ещё что-то, что Вы не сказали? Это ведь тот ещё зверь, а Вы его светодиодиками нагружаете...
     
    Последнее редактирование: 1 май 2018
  6. Просто у меня 2500 светодиодов, плюс массив, где расписано, к какой группе какой светодиод относится. Памяти расходуется в районе 15 кБ, плюс динамической памяти в районе 10 (для Адафрута). Напряжение не проседает, проверял, источники питания с лихвой мощи дают. Так что сей зверь выбран исключительно из-за большой оперативки. В принципе, в загашнике есть Ардуино Дью, можно с ней проверить. Когда пробовал аналогичную прогу на Ардуино Нано (прога не с такими зубодробительными требованиями к памяти), все было хорошо. Пробовал другую Тинси - один фиг, теряется соединение. Зависимости найти не смог: можно её заваливать байтами, можно вообще их не отсылать: полчаса максимум и привет, перезагрузка.
     
  7. Ещё меня привлёк форм-фактор Тинси. В отличие от той же Дью её легко вставить в макетку и распаять периферию: триггер для повышения сигнала до 5 вольт и кондера с резистором, как рекомендуют Адафрутовцы.
     
  8. Daniil

    Daniil Гуру

    Попробуйте отладить программу. Я думаю, если Вы сразу начнёте менять платформу, то будет слишком много изменений, чтобы отследить где ошибка.
     
  9. То есть, дело скорее в засоренном буфере, полагаете? Я просто на каком-то форуме читал, что Тинси не совсем заточена для управления по usb. Думал, может проблема аппаратная. Ладно, спасибо за ответы, буду дальше ковыряться!
     
  10. Daniil

    Daniil Гуру

    У вас система состоит из 3 основных блоков:
    1. программа на пк
    2. тинси и её обвязка
    3. связь между пк и тинси
    Проверять надо всё. Каждый блок в отдельности, а потом вместе. Я предложил варианты как их проверить.
    На данном этапе я обладаю скудной информацией, поэтому не могу ничего точного посоветовать, а тем более ставить диагнозы.
    Пройдите с тинси за ручку и посмотрете что и как она делает. Мне кажется это оптимальный путь отладки, т.к. по началу исключите проблему программы пк из системы и проверите связь и программу тинси.
     
    Последнее редактирование: 2 май 2018