просмотров 25 168

Не определяется USB девайс на Tiny45(85) после перезагрузки

Макетка AVR USB TINY45

Когда разрабатывал для себя предыдущий девайс  столкнулся с проблемой, что после перезагрузки или после выхода из ждущего режима система не хочет узнавать подсоединенный прибор. если он сделан на основе AVR-USB-TINY45 т.е. без кварца.

Результатом раздумий было решение что контроллер не может откалибровать свою частоту, чтобы соответствовать требованиям шины USB,т.к. питание уже подано, программа начала работу, а синхроимпульсов еще нет (если не прав, поправьте).

Почитав комментарии к предыдущей ссылке нашел предложение в коде увеличить ремя дисконнекта USB устройства после подключения до больших величин (>10 секунд). Это работало, но криво, т.к. этого времени не всегда хватало.

Удалось решить эту проблему. Пришлось вносить изменения в библиотеку V-USB. Была добавлена переменная LastRecievedUSBPacket. В эту переменную записывается тип последнего принятого USB пакета. Т.е. если после обнуления в эту переменную попадают данные, значит USB законнектился и все работает нормально. Если данные не меняются значит коннект не произошел. Тогда отправляем устройство на перезагрузку. При этом происходит заново подстройка частоты. И так по циклу, пока не установится коннект.

Пример изменений в коде

#include <avr/wdt.h> //подключаем библиотеку watch dog timer
….
int main(void //Начало программы
{
  MCUSR = 0;
wdt_disable();
……
……
wdt_enable(WDTO_8S); // даем команду перезагрузить контроллер через 8 с если не обнулим время счетчика
LastRecievedUSBPacket = 0;
for(;;){ /* начало основного цикла программы */
if (LastRecievedUSBPacket != 0) //обнуляем счетчик только когда USB соединение установлено
{
LastRecievedUSBPacket = 0;
wdt_reset();
}
}

}

Т.е. после запуска контроллер проверяет значение переменной LastRecievedUSBPacket, если она отлична от нуля, значит подключение произошло и можно обнулить WDT. Если в течение 8 секунд устройство не определилось системой оно уходит в перезагрузку.

Пример реализации, сделано в AVR Studio 5.0.

 

5 thoughts on “Не определяется USB девайс на Tiny45(85) после перезагрузки

  1. Доброго времени суток, собрал сей чудо девайс, все работает чудесно, но…. после перезагрузки ПК — win_xp выдает мне, что одно из подключеных устройств работает не верно… пробовал сделать хард ресет тиньке, эффект такой же… то есть по ходу, просто ресет не помогает тиньке заново засинхриться с USB… (хабов не использую подключаюсь напрямую в USB от материнки).. можете ли вы помочь решить такую проблему? спасибо.

    • Здравствуйте, Дмитрий.
      Это давно известная проблема для устройств без кварца, мне так и не удалось ее окончательно решить.
      Вариант описанный в этой статье работает, к сожалению, нестабильно.

  2. Здравствуйте, Виталий.
    Извините за беспокойство, проблему решил — перекомпилил код от меги16 под мегу8(что было под руками), поменял порт энкодера и все чудесно запустилось и работает. Спасибо большое за статью) И еще такой вопрос, где можно еще почитать о ваших работах, а то 3 статьи тут аж годовалой давности, или вы больше ничего не делали?
    С Уважением Дмитрий.

Добавить комментарий