Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

AT89C5131. USB - модуль непостижимым образом отключает прерывания (+)

Отправлено Igor_Koval 08 октября 2009, г. 12:24


В этом МК после сброса бит 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+ и землей. Потрясающе !!!


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 34:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru