makc 214 4 марта Опубликовано 4 марта · Жалоба Доброго времени суток, уважаемые участники, Имеется МК 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 в состоянии глубокого сна? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niXto 0 5 марта Опубликовано 5 марта · Жалоба Керамические конденсаторы на ногах питания стоят? Электролит ёмкостью от сотни мкФ есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cybersonner 1 5 марта Опубликовано 5 марта · Жалоба Гуглить "защелкивание КМОП". Случается, если на входе или выходе напряжение оказывается больше питания. Резистор на килоом последовательно со входом. Возможно мелкая ёмкость в районе 1 нФ по входу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 214 5 марта Опубликовано 5 марта · Жалоба 2 часа назад, niXto сказал: Керамические конденсаторы на ногах питания стоят? Электролит ёмкостью от сотни мкФ есть? Там места очень мало, питается МК от батарейки и керамика 1 мкФ на плате около ноги питания стоит. Сотни мкФ там и близко нет, т.к. ставить некуда. 2 часа назад, cybersonner сказал: Гуглить "защелкивание КМОП". Случается, если на входе или выходе напряжение оказывается больше питания. Резистор на килоом последовательно со входом. Возможно мелкая ёмкость в районе 1 нФ по входу. Что это такое я прекрасно знаю, но это явно не оно, т.к. без снятия питания по ресету контроллера эффект пропадает. Можно дать ресет через пин, можно WDT - эффект залипания одинаково пропадает и контроллер начинает работать правильно. Также эффект защёлкивания пина не пропадает при снятии внешнего напряжения с линии, хотя должен был бы пропасть, т.к. ток через паразитный тиристор в этом случае прекращается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 228 5 марта Опубликовано 5 марта · Жалоба 1 час назад, makc сказал: без снятия питания по ресету контроллера эффект пропадает. Можно дать ресет через пин, можно WDT - эффект залипания одинаково пропадает и контроллер начинает работать правильно. А что если попробовать после пробуждения выполнить для данного пина примерно те же манипуляции, которые происходят с ним в случае сброса МК по внешнему сбросу или сбросу через WDT? Сорри - я не ориентируюсь в AVR-ах, но по аналогии с ARM-ами это было бы: перевод пина в режим GPIO, запрет прерывания/пробуждения от него, перевод его в INPUT + pull-up (или какое там дефолтное состояние у пина в AVR после RESET?) и прочие установки для пина - в дефолт; подача кратковременного RESET для данного GPIO-порта через блок тактирования, а затем - отключение тактирование данного GPIO-порта. А затем - инициализация по-новой в обратном порядке. Т.е. - выполнить полную деинициализацию для данного пина/порта, с последующей инициализацией его по-новой. Раз он приходит в чувство после сброса через WDT, то похоже что сбрасывается что-то залипшее где-то в регистрах/триггерах МК. И нужно попытаться это также сбросить вручную (без сброса всего МК). PS: Также можно тупо взять и сравнить все подряд регистры конфигурации периферии до ESD-события (и до засыпания) и после пробуждения от ESD-события. И поискать различия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 214 5 марта Опубликовано 5 марта · Жалоба 17 минут назад, jcxz сказал: А что если попробовать после пробуждения выполнить для данного пина примерно те же манипуляции, которые происходят с ним в случае сброса МК по внешнему сбросу или сбросу через WDT? Пробовал. Сами регистры управления состоянием портов пишутся, читаются и показывают правильные значения. Но только состояние внешнего пина всё время остаётся нулевым. При этом другие пины, например из порта А, вполне нормально управляются, генерируют импульсы и ведут себя как живые. Похоже, что это как-то связано с асинхронной логикой этого пина, которая продолжает работать даже в состоянии power down sleep и нужна для пробуждения контроллера из состояния глубокого сна. Никаких отдельных ресетов для этой логики я не нашёл. 19 минут назад, jcxz сказал: Сорри - я не ориентируюсь в AVR-ах, но по аналогии с ARM-ами это было бы: перевод пина в режим GPIO, запрет прерывания/пробуждения от него, перевод его в INPUT + pull-up (или какое там дефолтное состояние у пина в AVR после RESET?) Он всегда в состоянии GPIO если не разрешить в периферийных регистрах управление им, как альтернативной функцией. Но у меня ничего такого нет. Этот пин используется как вход прерывания + GPIO. Запрет прерываний у меня происходит дальше после выхода из состояния сна, но это не помогает. В итоге микроконтроллер через таймаут переходит снова в состояние сна уже навсегда, т.к. на линии фронт сигнала уже никогда не может появиться (без ресета МК). 21 минуту назад, jcxz сказал: и прочие установки для пина - в дефолт; подача кратковременного RESET для данного GPIO-порта через блок тактирования, а затем - отключение тактирование данного GPIO-порта. А затем - инициализация по-новой в обратном порядке. К сожалению AVR настолько прост, что там нет никакого отдельного управления тактированием GPIO, как нет и ресета для GPIO. 22 минуты назад, jcxz сказал: Раз он приходит в чувство после сброса через WDT, то похоже что сбрасывается что-то залипшее где-то в регистрах/триггерах МК. И нужно попытаться это также сбросить вручную (без сброса всего МК). Да, у меня тоже такое впечатление. Только, как я уже сказал, никакого отдельного управления ресетами в этом МК нет. 23 минуты назад, jcxz сказал: PS: Также можно тупо взять и сравнить все подряд регистры конфигурации периферии до ESD-события (и до засыпания) и после пробуждения от ESD-события. И поискать различия. Можно, конечно, попробовать, но только кажется что дело где-то в более далёкой от ядра периферии, связанной с асинхронной обработкой прерываний и т.п. логикой. На схеме ячейки ввода-вывода GPIO есть интересный транзистор: Если на самом деле ими управляют разные сигналы (с разных триггеров), то наверное может так получиться, что буфер перед ним при выходе из сна открылся, а сам транзистор при этом не закрывается и просаживает линию изо всех своих сил. Других гипотез у меня пока больше нет. 😞 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 69 5 марта Опубликовано 5 марта · Жалоба А подтяжки часом не включены? Что будет если на залипший вход выходом выдать на несколько микросекунд массу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 228 5 марта Опубликовано 5 марта · Жалоба 46 минут назад, makc сказал: Если на самом деле ими управляют разные сигналы (с разных триггеров), то наверное может так получиться, что буфер перед ним при выходе из сна открылся, а сам транзистор при этом не закрывается и просаживает линию изо всех своих сил. Других гипотез у меня пока больше нет. 😞 Там на его затвор идёт сигнал управления "SLEEP". Может тогда выключить все функции разрешения сна и заново их включить через некоторую задержку? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 214 5 марта Опубликовано 5 марта · Жалоба 27 минут назад, artemkad сказал: А подтяжки часом не включены? Подтяжки (глобально) выключены. 27 минут назад, artemkad сказал: Что будет если на залипший вход выходом выдать на несколько микросекунд массу. Не понял, на нулевой пин подать ноль? В чём смысл? 9 минут назад, jcxz сказал: Там на его затвор идёт сигнал управления "SLEEP". Может тогда выключить все функции разрешения сна и заново их включить через некоторую задержку? Да, затвор управляется этим сигналом, чтобы снизить потребление в режиме глубокого сна: Цитата 10.1.5 Digital Input Enable and Sleep Modes As shown in Figure 10-2 on page 60, the digital input signal can be clamped to ground at the input of the schmitt-trigger. The signal denoted SLEEP in the figure, is set by the MCU Sleep Controller in Power-down and Standby modes to avoid high power consumption if some input signals are left floating, or have an analog signal level close to VCC/2. SLEEP is overridden for port pins enabled as external interrupt pins. If the external interrupt request is not enabled, SLEEP is active also for these pins. SLEEP is also overridden by various other alternate functions as described in “Alternate Port Functions” on page 64. If a logic high level (“one”) is present on an asynchronous external interrupt pin configured as “Interrupt on Rising Edge, Falling Edge, or Any Logic Change on Pin” while the external interrupt is not enabled, the corresponding External Interrupt Flag will be set when resuming from the above mentioned Sleep mode, as the clamping in these sleep mode produces the requested logic change. Я пробовал включать/отключать режим сна - не помогает. Видимо это связано с вышеуказанными причинами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 69 5 марта Опубликовано 5 марта · Жалоба 2 часа назад, makc сказал: Не понял, на нулевой пин подать ноль? В чём смысл? Если там есть некий суррогатный тиристор(динистор, TVS), то его может держать в открытом состоянии протекающий через него ток. Смысл - отправить этот ток через выходной полевик тем самым обнулив ток и закрыв тиристорную цепь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 214 5 марта Опубликовано 5 марта · Жалоба Я пробовал отключить эту линию (физически) или вручную замкнуть на землю - не помогает. Не похоже это на тиристорный эффект, см. выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 69 5 марта Опубликовано 5 марта · Жалоба 12 минут назад, makc сказал: Не похоже это на тиристорный эффект, см. выше. Может и не похоже, но проверить стоит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 214 6 марта Опубликовано 6 марта · Жалоба 7 часов назад, artemkad сказал: Может и не похоже, но проверить стоит. Перед уходом в сон пин настраивается как вход. При залипании я пробовал отключать линию с подтяжкой от ноги микроконтроллера, пробовал закорачивать её на землю пинцетом - ничего из этого не помогает. Вчера ещё попробовал при залипании включать/отключать прерывание pin change interrupt, по которому произошло пробуждение с залипанием - никаких видимых эффектов это не дало. Пока остановился на самоперезагрузке МК с помощью WDT в случае, если после пробуждения попытка выдачи единицы на линию дала при опросе пина ноль. Но это костыль и очень не хочется оставлять всё в таком виде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vervs 29 6 марта Опубликовано 6 марта · Жалоба 13 часов назад, makc сказал: Я пробовал включать/отключать режим сна - не помогает. на диаграмме Alternate Port Functions еще два сигнала 2 часа назад, makc сказал: Но это костыль Работает для одного экземпляра или опробован на повторяемость? может и "посильнее" залипнуть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 214 6 марта Опубликовано 6 марта · Жалоба Только что, vervs сказал: на диаграмме Alternate Port Functions еще два сигнала Я этими режимами не управляю, т.е. не использую. 1 минуту назад, vervs сказал: Работает для одного экземпляра или опробован на повторяемость? может и "посильнее" залипнуть Второго экземпляра для экспериментов у меня нет. Попробую раздобыть и попробовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться