Поиск
Показаны результаты для тегов 'constant zero'.
-
Доброго времени суток, уважаемые участники, Имеется МК ATtiny44A, который на определённо этапе работы его алгоритма уходит в режим глубокого сна (Power Down) и если в этот момент (во время сна) по земле прилетает ESD-разряд, то МК просыпается, работает нормально, но сигнал на линии пина PB2, которая должна была его разбудить по событию pin change interrupt (PCINT10), как будто залипает в состоянии выхода и держит эту линию её в нуле. При этом управлять состоянием линии не получается. МК не реагирует на изменение соответствующего бита в регистрах PORTB/DDRB/PINB. При этом значения в эти регистры записываются и читаются правильно. Код перехода в сон выглядит следующим образом: // Disable INT0 interrupt, enable only pin change interrupt GIMSK = (1 << PCIE1); // Clear pin change interrupt flag GIFR = (1 << PCIF1); // Change sleep mode to deepest possible set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); // Sleep sei(); sleep_bod_disable(); sleep_cpu(); cli(); // Reset sleep mode settings set_sleep_mode(SLEEP_MODE_IDLE); // Disable pin change interrupt for 1W bus GIMSK = 0; // Clear pin change interrupt flag GIFR = (1 << PCIF1); При этом если заменить SLEEP_MODE_PWR_DOWN на SLEEP_MODE_IDLE, то никаких подобных проблем не наблюдается. Судя по проведённым экспериментам (выдача тестовых импульсов на отладочный пин), в регистре DDRB бит 3 (DDB2) находится в нуле, т.е. PB2 настроен как вход. Как уже было сказано выше, все попытки выдать через этот пин любое значение не дают никакого эффекта. Если будить МК не импульсом ESD по земле, а фронтом или спадом сигнала на PB2, то МК просыпается штатно и работает правильно. Проблема именно в приходе разряда в состоянии глубокого сна. Управление пином восстанавливается после внешнего ресета МК или перепрошивки. Кто-нибудь сталкивался с подобным поведением пинов у AVR в состоянии глубокого сна?
- 60 ответов