Перейти к содержанию
    

Пин залипает в нуле после ESD-разряда во время сна на ATtiny44A

Доброго времени суток, уважаемые участники,

Имеется МК 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 в состоянии глубокого сна?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Керамические конденсаторы на ногах питания стоят? Электролит ёмкостью от сотни мкФ есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гуглить "защелкивание КМОП". Случается, если на входе или выходе напряжение оказывается больше питания. Резистор на килоом последовательно со входом. Возможно мелкая ёмкость в районе 1 нФ по входу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, niXto сказал:

Керамические конденсаторы на ногах питания стоят? Электролит ёмкостью от сотни мкФ есть?

Там места очень мало, питается МК от батарейки и керамика 1 мкФ на плате около ноги питания стоит. Сотни мкФ там и близко нет, т.к. ставить некуда.

2 часа назад, cybersonner сказал:

Гуглить "защелкивание КМОП". Случается, если на входе или выходе напряжение оказывается больше питания. Резистор на килоом последовательно со входом. Возможно мелкая ёмкость в районе 1 нФ по входу.

Что это такое я прекрасно знаю, но это явно не оно, т.к. без снятия питания по ресету контроллера эффект пропадает. Можно дать ресет через пин, можно WDT - эффект залипания одинаково пропадает и контроллер начинает работать правильно. Также эффект защёлкивания пина не пропадает при снятии внешнего напряжения с линии, хотя должен был бы пропасть, т.к. ток через паразитный тиристор в этом случае прекращается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, makc сказал:

без снятия питания по ресету контроллера эффект пропадает. Можно дать ресет через пин, можно WDT - эффект залипания одинаково пропадает и контроллер начинает работать правильно.

А что если попробовать после пробуждения выполнить для данного пина примерно те же манипуляции, которые происходят с ним в случае сброса МК по внешнему сбросу или сбросу через WDT?

Сорри - я не ориентируюсь в AVR-ах, но по аналогии с ARM-ами это было бы: перевод пина в режим GPIO, запрет прерывания/пробуждения от него, перевод его в INPUT + pull-up (или какое там дефолтное состояние у пина в AVR после RESET?) и прочие установки для пина - в дефолт; подача кратковременного RESET для данного GPIO-порта через блок тактирования, а затем - отключение тактирование данного GPIO-порта. А затем - инициализация по-новой в обратном порядке.

Т.е. - выполнить полную деинициализацию для данного пина/порта, с последующей инициализацией его по-новой.

 

Раз он приходит в чувство после сброса через WDT, то похоже что сбрасывается что-то залипшее где-то в регистрах/триггерах МК. И нужно попытаться это также сбросить вручную (без сброса всего МК).

 

PS: Также можно тупо взять и сравнить все подряд регистры конфигурации периферии до ESD-события (и до засыпания) и после пробуждения от ESD-события. И поискать различия.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 есть интересный транзистор:

image.thumb.png.86850dbe4a9cadbc9b90e11849d39880.png

Если на самом деле ими управляют разные сигналы (с разных триггеров), то наверное может так получиться, что буфер перед ним при выходе из сна открылся, а сам транзистор при этом не закрывается и просаживает линию изо всех своих сил. Других гипотез у меня пока больше нет. 😞

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А подтяжки часом не включены? Что будет если на залипший вход выходом выдать на несколько микросекунд массу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

46 минут назад, makc сказал:

Если на самом деле ими управляют разные сигналы (с разных триггеров), то наверное может так получиться, что буфер перед ним при выходе из сна открылся, а сам транзистор при этом не закрывается и просаживает линию изо всех своих сил. Других гипотез у меня пока больше нет. 😞

Там на его затвор идёт сигнал управления "SLEEP". Может тогда выключить все функции разрешения сна и заново их включить через некоторую задержку?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

 

Я пробовал включать/отключать режим сна - не помогает. Видимо это связано с вышеуказанными причинами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, makc сказал:

Не понял, на нулевой пин подать ноль? В чём смысл?

Если там есть некий суррогатный тиристор(динистор, TVS), то его может держать в открытом состоянии протекающий через него ток. Смысл -  отправить этот ток через выходной полевик тем самым обнулив ток и закрыв тиристорную цепь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я пробовал отключить эту линию (физически) или вручную замкнуть на землю - не помогает. Не похоже это на тиристорный эффект, см. выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, makc сказал:

Не похоже это на тиристорный эффект, см. выше.

Может и не похоже, но проверить стоит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, artemkad сказал:

Может и не похоже, но проверить стоит.

Перед уходом в сон пин настраивается как вход. При залипании я пробовал отключать линию с подтяжкой от ноги микроконтроллера, пробовал закорачивать её на землю пинцетом - ничего из этого не помогает.

Вчера ещё попробовал при залипании включать/отключать прерывание pin change interrupt, по которому произошло пробуждение с залипанием - никаких видимых эффектов это не дало.

Пока остановился на самоперезагрузке МК с помощью WDT в случае, если после пробуждения попытка выдачи единицы на линию дала при опросе пина ноль. Но это костыль и очень не хочется оставлять всё в таком виде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 часов назад, makc сказал:

Я пробовал включать/отключать режим сна - не помогает.

на диаграмме Alternate Port Functions еще два сигнала

2 часа назад, makc сказал:

Но это костыль

Работает для одного экземпляра или опробован на повторяемость? может и "посильнее" залипнуть

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, vervs сказал:

на диаграмме Alternate Port Functions еще два сигнала

Я этими режимами не управляю, т.е. не использую.

1 минуту назад, vervs сказал:

Работает для одного экземпляра или опробован на повторяемость? может и "посильнее" залипнуть

Второго экземпляра для экспериментов у меня нет. Попробую раздобыть и попробовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...