ATtiny45 - странность с внешним прерыванием

Обсуждаем контроллеры компании Atmel.
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

ATtiny45 - странность с внешним прерыванием

Сообщение watchmaker »

Есть МК ATtiny45, тактирование от watchdog осциллятора (128 кГц). Чип стоит в спящем режиме (глубокий сон, осциллятор выключен) и просыпается по нажатию кнопки на PB2 (внешнее прерывание по смене уровня). Кнопка подаёт на вход логическую единицу, сам вход подвязан резистором на ноль. Проверял код в Протеусе - всё идеально.
В реальном железе иногда (порядка 1 из 10 нажатий кнопки) наблюдаю такую ситуацию. Нажимаю кнопку (и держу её достаточно долго, не меньше 0.5 с) - чип просыпается, но ведёт себя так, как будто не выполнил обработчик прерывания и вывалился сразу в основной цикл. При этом в основном цикле он также проверяет состояние порта PB2 и видит на нём единицу. Если чип увидел на входе единицу, проснулся и продолжает видеть единицу, почему он не выполнил обработчик прерывания?
Последний раз редактировалось watchmaker Сб июл 19, 2025 19:21:16, всего редактировалось 1 раз.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Реклама
Krismi70
Сверлит текстолит когтями
Сообщения: 1202
Зарегистрирован: Пт ноя 22, 2024 14:08:43

Re: ATtiny45 - странность с внешним прерыванием

Сообщение Krismi70 »

_______ATtiny45 - странность
Есть МК ATtiny25
--------
твоя программа, себе и задавай вопросы....)))))
watchmaker писал(а):чип просыпается
так, может, он и спать в тот раз не ложился...)))
Реклама
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: ATtiny45 - странность с внешним прерыванием

Сообщение watchmaker »

так, может, он и спать в тот раз не ложился...)))
Ложится спать как раз исправно, это видно по нулевому потреблению (в рабочем режиме потребление 50..100 мкА). Просыпается при нажатии кнопки тоже чётко. Но дальше действует так, как будто в переменных занесены их предыдущие значения, тогда как в обработчике прерывания вызывается функция, которая инициализирует их.
Смущает то, что если на этот же вход сигнал приходит не с кнопки, а из другого источника (с платы электронных часов), таких проблем не бывает.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Krismi70
Сверлит текстолит когтями
Сообщения: 1202
Зарегистрирован: Пт ноя 22, 2024 14:08:43

Re: ATtiny45 - странность с внешним прерыванием

Сообщение Krismi70 »

дребезг не отработал...
Реклама
Эиком - электронные компоненты и радиодетали
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: ATtiny45 - странность с внешним прерыванием

Сообщение watchmaker »

Кнопка не механическая, а на токопроводящей резинке - вряд ли она дребезжит. К тому же с кнопки идёт постоянное напряжение, а с часов - импульсы 4 кГц. При этом сигнал с часов всегда отрабатывается чётко.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Реклама
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: ATtiny45 - странность с внешним прерыванием

Сообщение ILYAUL »

Кнопка не механическая, а на токопроводящей резинке - вряд ли она дребезжит.
Это врядли
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1907
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: ATtiny45 - странность с внешним прерыванием

Сообщение veso74 »

watchmaker, ответь на вопрос о МК без програмного опубликованного кода ... это как размышления гадалки, смотрящей в хрустальный шар ... Предоставьте код или хотя бы фрагмент кода, отвечающий за это. (частично пользуюсь переводчиком)
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: ATtiny45 - странность с внешним прерыванием

Сообщение watchmaker »

В начале мейна так:

Код: Выделить всё

asm("cli");
	TIMSK=BIT(OCIE0A);
	GIMSK=BIT(PCIE);
	PCMSK=BIT(PCINT2);
	asm("sei");
	MCUCR=BIT(SE)|BIT(SM1);
	melody_stop();
Внутри функции melody_stop() проверка нескольких условий, затем playing = 0 (важно!) и asm("sleep").

В обработчике прерывания:

Код: Выделить всё

ISR(PCINT0_vect)
{
		full=0;
		pos=0;
     		melody_start();
}
Здесь важно melody_start(), где выставляется playing = 1, и то, что перед этим выставляется pos = 0. При нажатии кнопки иногда чип ведёт себя так, как будто он проснулся, НО в переменной playing остался ноль, т. е. ни одна из строчек в обработчике прерывания не выполнилась, а вместо этого сразу произошёл переход в основной цикл. Дальше в основном цикле опять выполняется

Код: Выделить всё

if(playing==0) 
	melody_stop();
а там

Код: Выделить всё

if (PINB&BIT(2)) 
		{
			pos=determine_pos(m_index);
			melody_start();
			return;
		}
Этот кусок кода нужен для того, чтобы играть мелодию повторно при постоянно нажатой кнопке (при штатной работе по окончании проигрывания ставится playing = 0).
Важна первая строчка - функция determine_pos(m_index) выполняет поиск определённых значений в массиве и в итоге пишет в pos отличное от нуля значение. Если обработчик прерывания выполнился, playing должно равняться 1, соответственно функция melody_stop() выполняться не должна, и в переменной pos останется ноль.
Если в pos ноль, пищалка на выходе подаст короткий сигнал, если найденное в determine_pos(m_index) значение - мелодию.
Иногда при нажатии на кнопку немедленно начинает проигрываться мелодия (она должна проигрываться только при удержании кнопки больше примерно 0.6 секунды). То есть три строчки в последнем фрагменте однозначно выполняются. Получается, МК видит, что на PB2 единица, но почему тогда он не видит переход с 0 в 1 на этом пине и не выполняет обработчик прерывания?

Возможно ли такое, если напряжение на пине при нажатии на кнопку возрастает слишком медленно? С кнопками на токопроводящей резине такое бывает.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Аватара пользователя
VNS
Говорящий с текстолитом
Сообщения: 1627
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Re: ATtiny45 - странность с внешним прерыванием

Сообщение VNS »

[uquote="watchmaker",url="/forum/viewtopic.php?p=4732481#p4732481"]Есть МК ATtiny45, тактирование от watchdog осциллятора (128 кГц).[/uquote]
Поясните, в каком разделе даташита можно прочитать как настроить тактирование МК от сторожевого таймера?
Чип стоит в спящем режиме (глубокий сон, осциллятор выключен) и просыпается по нажатию кнопки на PB2 (внешнее прерывание по смене уровня). Кнопка подаёт на вход логическую единицу, сам вход подвязан резистором на ноль. Проверял код в Протеусе - всё идеально.
Всё дело в том, что из глубокого сна (Power-down) разбудить внешним прерывание от INT0 можно лишь когда он настроен на контроль низкого уровня. Потому при использовании прерывания по INT0, когда вы переводите МК в выключенное состояние (Power-down), то биты ISC01; ISC00, регистра MCUCR переводятся автоматически в нулевое состояние, которое соответствует прерыванию по низкому уровню. А так как вы подтянули вывод РВ2 через резистор к общей шине (GND), то могу предположить, что ваш МК засыпая вновь просыпается от внешнего прерывания по низкому уровню INT0... таким образом выйдя из прерывания МК отработав одно действие из основного цикла уходит в новь на прерывание и так далее...
чип просыпается,
Предполагаю что ваш чип из вышеописанного практически не спит, а значит он не просыпается а постоянно находится в работе периодически отрабатывая прерывание по INT0. :roll:
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: ATtiny45 - странность с внешним прерыванием

Сообщение watchmaker »

Поясните, в каком разделе даташита можно прочитать как настроить тактирование МК от сторожевого таймера?
6.2 Clock Sources, CKSEL[3:0] = 0100. Это тот же малопотребляющий внутренний генератор, который используется для watchdog.
Всё дело в том, что из глубокого сна (Power-down) разбудить внешним прерывание от INT0 можно лишь когда он настроен на контроль низкого уровня.
У меня вообще-то Pin Change Interrupt (PCINT2), который работает асинхронно независимо от уровня (раздел 9.2).
Pin change interrupts PCI will trigger if any enabled PCINT[5:0] pin toggles. The
PCMSK Register control which pins contribute to the pin change interrupts. Pin change interrupts on PCINT[5:0]
are detected asynchronously. This implies that these interrupts can be used for waking the part also from sleep
modes other than Idle mode.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Аватара пользователя
VNS
Говорящий с текстолитом
Сообщения: 1627
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Re: ATtiny45 - странность с внешним прерыванием

Сообщение VNS »

[uquote="watchmaker",url="/forum/viewtopic.php?p=4732664#p4732664"]6.2 Clock Sources, CKSEL[3:0] = 0100. Это тот же малопотребляющий внутренний генератор, который используется для watchdog.[/uquote]
Это понятно... у вас было написано:
тактирование от watchdog осциллятора
И я понял, что тактируется ваш МК именно от watchdog (сторожевого таймера)... :facepalm: Вот и задал уточняющий вопрос.
У меня вообще-то Pin Change Interrupt (PCINT2)
Теперь понятно... значит и тут я не правильно понял... :dont_know:
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: ATtiny45 - странность с внешним прерыванием

Сообщение codenamehawk »

[uquote="watchmaker",url="/forum/viewtopic.php?p=4732523#p4732523"]Кнопка не механическая, а на токопроводящей резинке[/uquote]
Вы токопроводящею резинку называете не механической?
watchmaker писал(а):в обработчике прерывания вызывается функция, которая инициализирует их.
Может более логично в прерывании установить флаг, а все остальное делать в майн.
Там сразу запретить прерывание и отработать нужный код. Перед сном сбросить флаг прерывания и уйти в сон.
Это отбросит повторные прерывания от дребезга кнопки.

Добавлено after 24 minutes 30 seconds:
Попробуйте подавить дребезг при помощи RC цепочки.
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: ATtiny45 - странность с внешним прерыванием

Сообщение watchmaker »

Там сразу запретить прерывание и отработать нужный код. Перед сном сбросить флаг прерывания и уйти в сон.
Я почти так и делаю - прерывание запрещается, потом разрешается при уходе в сон.
Это отбросит повторные прерывания от дребезга кнопки.
Повторные прерывания (даже если их два-три подряд) не мешают, мешает ОТСУТСТВИЕ прерывания при пробуждении чипа.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: ATtiny45 - странность с внешним прерыванием

Сообщение codenamehawk »

watchmaker писал(а): мешает ОТСУТСТВИЕ прерывания при пробуждении чипа.
Сморели от чего он проснулся?
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: ATtiny45 - странность с внешним прерыванием

Сообщение Starichok51 »

watchmaker писал(а):мешает ОТСУТСТВИЕ прерывания при пробуждении чипа.
без возникновения прерывания не будут и пробуждения.
если же чип проснулся, то прерывание ПРОИЗОШЛО.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: ATtiny45 - странность с внешним прерыванием

Сообщение watchmaker »

Сморели от чего он проснулся?
А от чего он может проснуться, если не от сигнала на PB2?
если же чип проснулся, то прерывание ПРОИЗОШЛО.
А почему тогда в обработчике прерывания не отработала ни одна строка? Глючный экземпляр чипа? Смущает, что на других часах с такой же схемой и с теми же исходниками, но с ATtiny85 этой ситуации никогда не было.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: ATtiny45 - странность с внешним прерыванием

Сообщение codenamehawk »

watchmaker писал(а): мешает ОТСУТСТВИЕ прерывания при пробуждении чипа.
watchmaker писал(а):А от чего он может проснуться, если не от сигнала на PB2?
Чудеса однако.
То что вы не видите то, что ожидаете, не означает, что оно произошло или не произошло.
Не знаю есть ли в аттини, но в других показывает источник ресета.
Меняйте стиль программы.
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: ATtiny45 - странность с внешним прерыванием

Сообщение watchmaker »

Не знаю есть ли в аттини, но в других показывает источник ресета.
Ресета у меня никакого нет, все данные остаются на месте.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: ATtiny45 - странность с внешним прерыванием

Сообщение codenamehawk »

Вы только препологаете, на самом деле надо проверять все возможные варианты, особенно когда не можете обьяснить поведение программы.
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: ATtiny45 - странность с внешним прерыванием

Сообщение watchmaker »

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

Вернуться в «AVR»