В этом МК после сброса бит USBCON.DETACH устанавливается в ноль, в результате чего МК сразу же подключается к шине. Мне же нужно подключаться к шине не сразу же после подачи питания, а после выполнения неких подготовительных действий. Посему в самом начале программы я включаю USB - модуль, устанавливаю бит USBCON.DETACH, отключаясь от шины, далее выполняю подготовительные действия, и в их числе разрешаю прерывания от Т/С1 (IEN0 = 0x88;), и подключаюсь к шине, сбрасывая USBCON.DETACH:
USBCON=USBCON | 0x40; //Запретить использование 48MHz clock
PLLDIV=0x10; //Запустить PLL и
PLLCON=PLLCON | 0x02; //подождать, пока
while ((PLLCON & 0x01)==0){} //тактовая частота стабилизируется
USBCON=USBCON & 0xbf; //Разрешить использование 48MHz clock
USBCON=USBCON | 0x80; //Включение USB
USBINT=USBINT & 0xdf; //Сбросить флаг Wake Up CPU interrupt (см. Errata)
USBINT &= ~0x01; //На всякий случай очистить бит USBINT.SPINT
USBCON=USBCON | 0x10; //Отключиться от USB
...
Подготовительные действия. Здесь же запускается Т/С1 в режиме автоперезагрузки и разрешаются прерывания по его переполнению
...
USBCON=USBCON & 0xef; //Подключиться к USB
Сразу же после отключения от шины настраивается Т/С1 и разрешаются прерывания от него. Обработчик прерывания меняет состояние ножки. Проблема вот в чем. Некоторое время после отключения от шины обработчик вызывается исправно, а затем, после ~24 вызовов, он вызываться перестает, причем почти всегда. Доказано, что МК не зависает, а продолжает работать, просто по какой-то причине бит IEN0.7 сам собой... сбрасывается !!! Проблема решается организацией цикла, который постоянно взводит бит IEN0.7. Чудеса ... Второе решение - подключить щуп осциллографа к линии D+. Тогда все работает нормально (заметьте, МК я программно отключил от шины, посему в это время PULLUP к линии D+ не подключен. Третье решение - подтянуть D+ к земле через большой резистор, что я и сделал.
Резюмирую. Если программно отключить МК от шины (не зря Атмеловцы сразу же после сброса подключают МК к шине), то МК начинает вести себя непредсказуемо. Лечится это подключением резистора м/у D+ и землей. Потрясающе !!!