Страница 1 из 1
Mega8+Sleep(RealTime)+TWI=HALT
Добавлено: Чт янв 27, 2011 15:25:40
wzn
Сражаюсь уже месяц. Бесполезно. В отладчике всё пашет. В реалиях - висим на команде Sleep.
Работает либо RTime от внешнего часового (Timer2) либо TWI. Никак не подружу.

До этой процедуры команда Sleep выполняется успешно и процессор после длительного простоя продолжает работать от прерывания с Timer2 как и задумано. Но после активизации TWI и очередного вызова Sleep тут на нём и виснет. Есть идеи?
Если этот Sleep заремить, то всё работает на ура, но вот и ток потребления при этом совсем другой.

Обычно работающее прерывание по INT1 от клавиатуры тут также не спасает. Висит насмерть!
Re: Mega8+Sleep(RealTime)+TWI=HALT
Добавлено: Чт янв 27, 2011 15:43:55
stas00n
А контроллер какой? Надеюсь, TWI в режиме слейва? Иначе как Вы себе представляете пробуждение? При включении TWI "случайно" не модифицируется управляющий регистр энерносбережения (SMCR или MCUCR)? Например в режимах Power down или Standby прерывание от Timer2 будить контроллер не будет. WDT отключен?
Re: Mega8+Sleep(RealTime)+TWI=HALT
Добавлено: Чт янв 27, 2011 15:48:43
stas00n
wzn писал(а):Обычно работающее прерывание по INT1 от клавиатуры тут также не спасает. Висит насмерть!
Ах, да, случайно не забыли ли сделать "SEI" перед "SLEEP"?
Re: Mega8+Sleep(RealTime)+TWI=HALT
Добавлено: Чт янв 27, 2011 16:03:33
wzn
Мега8. Я же его перед сном инициализировал и заставил данные слать. (например передача адреса к LCD) и когда выставлен бит прерваться тогда уже и ожидание этого прерывания. Обидно то, что года три назад всё работало. Что-то улучшил в функции ожидания...

Sleep = ADC Noise Reduction. Раньше как-то работало.
SEI я сделал еще до теста работы RTime. дабы убедиться, что RT пашет. Может ему нужно больше работать после пробуждения?
WDT не пользую и не активировал.
МСUCR меняются биты включающие INT1 и сбрасывается флаг INT1 для перезапуска клавиатуры в момент срабатывания T2.
MCUCR на момент Sleep в отладчике #B10010000 что соответствует задуманному.
Инициализация приведенная ниже идет при блокированном I=0.
Re: Mega8+Sleep(RealTime)+TWI=HALT
Добавлено: Чт янв 27, 2011 16:15:04
wzn
Инициализация:
Первые три команды жестко очищают рабочие переменные.
Далее запуск RT (как в даташите написано). Успешно. Проверка после показанного фрагмента даёт положительный результат.
Далее I=0. На всякий случай и инициализация клавиатуры. Тоже успешная (вставлял коды мигания диодом зацикленный временный кусок).
Дальше - запуск NWI с зависоном на Sleep-e.
Я в ступоре.
Re: Mega8+Sleep(RealTime)+TWI=HALT
Добавлено: Пт янв 28, 2011 09:57:57
wzn
Вчера поставил светодиодные ловушки в программе во всех местах. Выяснил, что на Sleep не виснет, RT и Keyb пррерывание по INT1 обслуживаются, а вот TWI в свой вектор не заходит ни разу! так и крутится вокруг вышеоговоренного Sleep при установленном TWIE=1 и I=1. Какого х...? И почему раньше работало? Вектор (адрес на TWI) тоже прописан. Чего ему еще нужно? И в отладчике всё проходит на ура. А в реалии смертельный цикл ожидания когда TWIE будет "0". Конечно никогда, если он туда не заглядывает! А вот почему?