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

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

Сообщение watchmaker »

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

Сообщение Krismi70 »

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

Сообщение watchmaker »

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

Сообщение Krismi70 »

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

Сообщение watchmaker »

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

Сообщение ILYAUL »

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

Сообщение veso74 »

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

Сообщение 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
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1633
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Сообщение 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:
Поставщик валерьянки для Кота
Сообщения: 2200
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков

Сообщение 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
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1633
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Сообщение 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:
Вымогатель припоя
Сообщения: 541
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

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

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

Сообщение watchmaker »

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

Сообщение codenamehawk »

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

Сообщение Starichok51 »

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

Сообщение watchmaker »

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

Сообщение codenamehawk »

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

Сообщение watchmaker »

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

Сообщение codenamehawk »

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

Сообщение watchmaker »

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

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