Когда разрабатывал для себя предыдущий девайс столкнулся с проблемой, что после перезагрузки или после выхода из ждущего режима система не хочет узнавать подсоединенный прибор. если он сделан на основе 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.
Доброго времени суток, собрал сей чудо девайс, все работает чудесно, но…. после перезагрузки ПК — win_xp выдает мне, что одно из подключеных устройств работает не верно… пробовал сделать хард ресет тиньке, эффект такой же… то есть по ходу, просто ресет не помогает тиньке заново засинхриться с USB… (хабов не использую подключаюсь напрямую в USB от материнки).. можете ли вы помочь решить такую проблему? спасибо.
Здравствуйте, Дмитрий.
Это давно известная проблема для устройств без кварца, мне так и не удалось ее окончательно решить.
Вариант описанный в этой статье работает, к сожалению, нестабильно.
Вроде бы решил эту проблему окончательно. Все работает стабильно. Делать как описано в статье.
Здравствуйте, Виталий.
Извините за беспокойство, проблему решил — перекомпилил код от меги16 под мегу8(что было под руками), поменял порт энкодера и все чудесно запустилось и работает. Спасибо большое за статью) И еще такой вопрос, где можно еще почитать о ваших работах, а то 3 статьи тут аж годовалой давности, или вы больше ничего не делали?
С Уважением Дмитрий.
Ничего нового, что можно опубликовать, пока нет. Работаю над этим.