Страница 1 из 4
ATtiny45 - странность с внешним прерыванием
Добавлено: Сб июл 19, 2025 15:43:17
watchmaker
Есть МК ATtiny45, тактирование от watchdog осциллятора (128 кГц). Чип стоит в спящем режиме (глубокий сон, осциллятор выключен) и просыпается по нажатию кнопки на PB2 (внешнее прерывание по смене уровня). Кнопка подаёт на вход логическую единицу, сам вход подвязан резистором на ноль. Проверял код в Протеусе - всё идеально.
В реальном железе иногда (порядка 1 из 10 нажатий кнопки) наблюдаю такую ситуацию. Нажимаю кнопку (и держу её достаточно долго, не меньше 0.5 с) - чип просыпается, но ведёт себя так, как будто не выполнил обработчик прерывания и вывалился сразу в основной цикл. При этом в основном цикле он также проверяет состояние порта PB2 и видит на нём единицу. Если чип увидел на входе единицу, проснулся и продолжает видеть единицу, почему он не выполнил обработчик прерывания?
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Сб июл 19, 2025 17:13:33
Krismi70
_______ATtiny45 - странность
Есть МК ATtiny25
--------
твоя программа, себе и задавай вопросы....)))))
watchmaker писал(а):чип просыпается
так, может, он и спать в тот раз не ложился...)))
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Сб июл 19, 2025 19:25:54
watchmaker
так, может, он и спать в тот раз не ложился...)))
Ложится спать как раз исправно, это видно по нулевому потреблению (в рабочем режиме потребление 50..100 мкА). Просыпается при нажатии кнопки тоже чётко. Но дальше действует так, как будто в переменных занесены их предыдущие значения, тогда как в обработчике прерывания вызывается функция, которая инициализирует их.
Смущает то, что если на этот же вход сигнал приходит не с кнопки, а из другого источника (с платы электронных часов), таких проблем не бывает.
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Сб июл 19, 2025 19:29:41
Krismi70
дребезг не отработал...
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Сб июл 19, 2025 19:46:04
watchmaker
Кнопка не механическая, а на токопроводящей резинке - вряд ли она дребезжит. К тому же с кнопки идёт постоянное напряжение, а с часов - импульсы 4 кГц. При этом сигнал с часов всегда отрабатывается чётко.
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Сб июл 19, 2025 19:58:34
ILYAUL
Кнопка не механическая, а на токопроводящей резинке - вряд ли она дребезжит.
Это врядли
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Сб июл 19, 2025 21:03:26
veso74
watchmaker, ответь на вопрос о МК без програмного опубликованного кода ... это как размышления гадалки, смотрящей в хрустальный шар ... Предоставьте код или хотя бы фрагмент кода, отвечающий за это. (частично пользуюсь переводчиком)
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Сб июл 19, 2025 22:41:15
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 (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 на этом пине и не выполняет обработчик прерывания?
Возможно ли такое, если напряжение на пине при нажатии на кнопку возрастает слишком медленно? С кнопками на токопроводящей резине такое бывает.
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Вс июл 20, 2025 13:14:20
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.

Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Вс июл 20, 2025 14:21:39
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.
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Вс июл 20, 2025 15:58:52
VNS
[uquote="watchmaker",url="/forum/viewtopic.php?p=4732664#p4732664"]6.2 Clock Sources, CKSEL[3:0] = 0100. Это тот же малопотребляющий внутренний генератор, который используется для watchdog.[/uquote]
Это понятно... у вас было написано:
тактирование от watchdog осциллятора
И я понял, что тактируется ваш МК именно от watchdog (сторожевого таймера)...

Вот и задал уточняющий вопрос.
У меня вообще-то Pin Change Interrupt (PCINT2)
Теперь понятно... значит и тут я не правильно понял...

Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Пн июл 21, 2025 11:02:05
codenamehawk
[uquote="watchmaker",url="/forum/viewtopic.php?p=4732523#p4732523"]Кнопка не механическая, а на токопроводящей резинке[/uquote]
Вы токопроводящею резинку называете не механической?
watchmaker писал(а):в обработчике прерывания вызывается функция, которая инициализирует их.
Может более логично в прерывании установить флаг, а все остальное делать в майн.
Там сразу запретить прерывание и отработать нужный код. Перед сном сбросить флаг прерывания и уйти в сон.
Это отбросит повторные прерывания от дребезга кнопки.
Добавлено after 24 minutes 30 seconds:
Попробуйте подавить дребезг при помощи RC цепочки.
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Пн июл 21, 2025 12:31:06
watchmaker
Там сразу запретить прерывание и отработать нужный код. Перед сном сбросить флаг прерывания и уйти в сон.
Я почти так и делаю - прерывание запрещается, потом разрешается при уходе в сон.
Это отбросит повторные прерывания от дребезга кнопки.
Повторные прерывания (даже если их два-три подряд) не мешают, мешает ОТСУТСТВИЕ прерывания при пробуждении чипа.
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Пн июл 21, 2025 15:15:20
codenamehawk
watchmaker писал(а): мешает ОТСУТСТВИЕ прерывания при пробуждении чипа.
Сморели от чего он проснулся?
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Пн июл 21, 2025 16:42:20
Starichok51
watchmaker писал(а):мешает ОТСУТСТВИЕ прерывания при пробуждении чипа.
без возникновения прерывания не будут и пробуждения.
если же чип проснулся, то прерывание ПРОИЗОШЛО.
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Пн июл 21, 2025 20:51:42
watchmaker
Сморели от чего он проснулся?
А от чего он может проснуться, если не от сигнала на PB2?
если же чип проснулся, то прерывание ПРОИЗОШЛО.
А почему тогда в обработчике прерывания не отработала ни одна строка? Глючный экземпляр чипа? Смущает, что на других часах с такой же схемой и с теми же исходниками, но с ATtiny85 этой ситуации никогда не было.
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Пн июл 21, 2025 21:42:40
codenamehawk
watchmaker писал(а): мешает ОТСУТСТВИЕ прерывания при пробуждении чипа.
watchmaker писал(а):А от чего он может проснуться, если не от сигнала на PB2?
Чудеса однако.
То что вы не видите то, что ожидаете, не означает, что оно произошло или не произошло.
Не знаю есть ли в аттини, но в других показывает источник ресета.
Меняйте стиль программы.
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Вт июл 22, 2025 01:32:44
watchmaker
Не знаю есть ли в аттини, но в других показывает источник ресета.
Ресета у меня никакого нет, все данные остаются на месте.
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Вт июл 22, 2025 10:01:34
codenamehawk
Вы только препологаете, на самом деле надо проверять все возможные варианты, особенно когда не можете обьяснить поведение программы.
Re: ATtiny45 - странность с внешним прерыванием
Добавлено: Вт июл 22, 2025 12:10:52
watchmaker
Если сделать ресет, чип инициализирует ещё несколько переменных, это сразу будет видно по поведению.