ATtiny45 - странность с внешним прерыванием
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
ATtiny45 - странность с внешним прерыванием
Есть МК ATtiny45, тактирование от watchdog осциллятора (128 кГц). Чип стоит в спящем режиме (глубокий сон, осциллятор выключен) и просыпается по нажатию кнопки на PB2 (внешнее прерывание по смене уровня). Кнопка подаёт на вход логическую единицу, сам вход подвязан резистором на ноль. Проверял код в Протеусе - всё идеально.
В реальном железе иногда (порядка 1 из 10 нажатий кнопки) наблюдаю такую ситуацию. Нажимаю кнопку (и держу её достаточно долго, не меньше 0.5 с) - чип просыпается, но ведёт себя так, как будто не выполнил обработчик прерывания и вывалился сразу в основной цикл. При этом в основном цикле он также проверяет состояние порта PB2 и видит на нём единицу. Если чип увидел на входе единицу, проснулся и продолжает видеть единицу, почему он не выполнил обработчик прерывания?
В реальном железе иногда (порядка 1 из 10 нажатий кнопки) наблюдаю такую ситуацию. Нажимаю кнопку (и держу её достаточно долго, не меньше 0.5 с) - чип просыпается, но ведёт себя так, как будто не выполнил обработчик прерывания и вывалился сразу в основной цикл. При этом в основном цикле он также проверяет состояние порта PB2 и видит на нём единицу. Если чип увидел на входе единицу, проснулся и продолжает видеть единицу, почему он не выполнил обработчик прерывания?
Последний раз редактировалось watchmaker Сб июл 19, 2025 19:21:16, всего редактировалось 1 раз.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
- Реклама
Re: ATtiny45 - странность с внешним прерыванием
_______ATtiny45 - странность
Есть МК ATtiny25
--------
твоя программа, себе и задавай вопросы....)))))
Есть МК ATtiny25
--------
твоя программа, себе и задавай вопросы....)))))
так, может, он и спать в тот раз не ложился...)))watchmaker писал(а):чип просыпается
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: ATtiny45 - странность с внешним прерыванием
Ложится спать как раз исправно, это видно по нулевому потреблению (в рабочем режиме потребление 50..100 мкА). Просыпается при нажатии кнопки тоже чётко. Но дальше действует так, как будто в переменных занесены их предыдущие значения, тогда как в обработчике прерывания вызывается функция, которая инициализирует их.так, может, он и спать в тот раз не ложился...)))
Смущает то, что если на этот же вход сигнал приходит не с кнопки, а из другого источника (с платы электронных часов), таких проблем не бывает.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Re: ATtiny45 - странность с внешним прерыванием
дребезг не отработал...
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: ATtiny45 - странность с внешним прерыванием
Кнопка не механическая, а на токопроводящей резинке - вряд ли она дребезжит. К тому же с кнопки идёт постоянное напряжение, а с часов - импульсы 4 кГц. При этом сигнал с часов всегда отрабатывается чётко.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
- Реклама
Re: ATtiny45 - странность с внешним прерыванием
Это врядлиКнопка не механическая, а на токопроводящей резинке - вряд ли она дребезжит.
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1907
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: ATtiny45 - странность с внешним прерыванием
watchmaker, ответь на вопрос о МК без програмного опубликованного кода ... это как размышления гадалки, смотрящей в хрустальный шар ... Предоставьте код или хотя бы фрагмент кода, отвечающий за это. (частично пользуюсь переводчиком)
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: ATtiny45 - странность с внешним прерыванием
В начале мейна так:
Внутри функции melody_stop() проверка нескольких условий, затем playing = 0 (важно!) и asm("sleep").
В обработчике прерывания:
Здесь важно melody_start(), где выставляется playing = 1, и то, что перед этим выставляется pos = 0. При нажатии кнопки иногда чип ведёт себя так, как будто он проснулся, НО в переменной playing остался ноль, т. е. ни одна из строчек в обработчике прерывания не выполнилась, а вместо этого сразу произошёл переход в основной цикл. Дальше в основном цикле опять выполняется
а там
Этот кусок кода нужен для того, чтобы играть мелодию повторно при постоянно нажатой кнопке (при штатной работе по окончании проигрывания ставится playing = 0).
Важна первая строчка - функция determine_pos(m_index) выполняет поиск определённых значений в массиве и в итоге пишет в pos отличное от нуля значение. Если обработчик прерывания выполнился, playing должно равняться 1, соответственно функция melody_stop() выполняться не должна, и в переменной pos останется ноль.
Если в pos ноль, пищалка на выходе подаст короткий сигнал, если найденное в determine_pos(m_index) значение - мелодию.
Иногда при нажатии на кнопку немедленно начинает проигрываться мелодия (она должна проигрываться только при удержании кнопки больше примерно 0.6 секунды). То есть три строчки в последнем фрагменте однозначно выполняются. Получается, МК видит, что на PB2 единица, но почему тогда он не видит переход с 0 в 1 на этом пине и не выполняет обработчик прерывания?
Возможно ли такое, если напряжение на пине при нажатии на кнопку возрастает слишком медленно? С кнопками на токопроводящей резине такое бывает.
Код: Выделить всё
asm("cli");
TIMSK=BIT(OCIE0A);
GIMSK=BIT(PCIE);
PCMSK=BIT(PCINT2);
asm("sei");
MCUCR=BIT(SE)|BIT(SM1);
melody_stop();
В обработчике прерывания:
Код: Выделить всё
ISR(PCINT0_vect)
{
full=0;
pos=0;
melody_start();
}Код: Выделить всё
if(playing==0)
melody_stop();
Код: Выделить всё
if (PINB&BIT(2))
{
pos=determine_pos(m_index);
melody_start();
return;
}
Важна первая строчка - функция 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 - странность с внешним прерыванием
[uquote="watchmaker",url="/forum/viewtopic.php?p=4732481#p4732481"]Есть МК ATtiny45, тактирование от watchdog осциллятора (128 кГц).[/uquote]
Поясните, в каком разделе даташита можно прочитать как настроить тактирование МК от сторожевого таймера?
Поясните, в каком разделе даташита можно прочитать как настроить тактирование МК от сторожевого таймера?
Всё дело в том, что из глубокого сна (Power-down) разбудить внешним прерывание от INT0 можно лишь когда он настроен на контроль низкого уровня. Потому при использовании прерывания по INT0, когда вы переводите МК в выключенное состояние (Power-down), то биты ISC01; ISC00, регистра MCUCR переводятся автоматически в нулевое состояние, которое соответствует прерыванию по низкому уровню. А так как вы подтянули вывод РВ2 через резистор к общей шине (GND), то могу предположить, что ваш МК засыпая вновь просыпается от внешнего прерывания по низкому уровню INT0... таким образом выйдя из прерывания МК отработав одно действие из основного цикла уходит в новь на прерывание и так далее...Чип стоит в спящем режиме (глубокий сон, осциллятор выключен) и просыпается по нажатию кнопки на PB2 (внешнее прерывание по смене уровня). Кнопка подаёт на вход логическую единицу, сам вход подвязан резистором на ноль. Проверял код в Протеусе - всё идеально.
Предполагаю что ваш чип из вышеописанного практически не спит, а значит он не просыпается а постоянно находится в работе периодически отрабатывая прерывание по INT0.чип просыпается,
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: ATtiny45 - странность с внешним прерыванием
6.2 Clock Sources, CKSEL[3:0] = 0100. Это тот же малопотребляющий внутренний генератор, который используется для watchdog.Поясните, в каком разделе даташита можно прочитать как настроить тактирование МК от сторожевого таймера?
У меня вообще-то Pin Change Interrupt (PCINT2), который работает асинхронно независимо от уровня (раздел 9.2).Всё дело в том, что из глубокого сна (Power-down) разбудить внешним прерывание от INT0 можно лишь когда он настроен на контроль низкого уровня.
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 - странность с внешним прерыванием
[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)
-
codenamehawk
- Вымогатель припоя
- Сообщения: 528
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Re: ATtiny45 - странность с внешним прерыванием
[uquote="watchmaker",url="/forum/viewtopic.php?p=4732523#p4732523"]Кнопка не механическая, а на токопроводящей резинке[/uquote]
Вы токопроводящею резинку называете не механической?
Там сразу запретить прерывание и отработать нужный код. Перед сном сбросить флаг прерывания и уйти в сон.
Это отбросит повторные прерывания от дребезга кнопки.
Добавлено after 24 minutes 30 seconds:
Попробуйте подавить дребезг при помощи RC цепочки.
Вы токопроводящею резинку называете не механической?
Может более логично в прерывании установить флаг, а все остальное делать в майн.watchmaker писал(а):в обработчике прерывания вызывается функция, которая инициализирует их.
Там сразу запретить прерывание и отработать нужный код. Перед сном сбросить флаг прерывания и уйти в сон.
Это отбросит повторные прерывания от дребезга кнопки.
Добавлено after 24 minutes 30 seconds:
Попробуйте подавить дребезг при помощи RC цепочки.
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: ATtiny45 - странность с внешним прерыванием
Я почти так и делаю - прерывание запрещается, потом разрешается при уходе в сон.Там сразу запретить прерывание и отработать нужный код. Перед сном сбросить флаг прерывания и уйти в сон.
Повторные прерывания (даже если их два-три подряд) не мешают, мешает ОТСУТСТВИЕ прерывания при пробуждении чипа.Это отбросит повторные прерывания от дребезга кнопки.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
-
codenamehawk
- Вымогатель припоя
- Сообщения: 528
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Re: ATtiny45 - странность с внешним прерыванием
Сморели от чего он проснулся?watchmaker писал(а): мешает ОТСУТСТВИЕ прерывания при пробуждении чипа.
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: ATtiny45 - странность с внешним прерыванием
без возникновения прерывания не будут и пробуждения.watchmaker писал(а):мешает ОТСУТСТВИЕ прерывания при пробуждении чипа.
если же чип проснулся, то прерывание ПРОИЗОШЛО.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: ATtiny45 - странность с внешним прерыванием
А от чего он может проснуться, если не от сигнала на PB2?Сморели от чего он проснулся?
А почему тогда в обработчике прерывания не отработала ни одна строка? Глючный экземпляр чипа? Смущает, что на других часах с такой же схемой и с теми же исходниками, но с ATtiny85 этой ситуации никогда не было.если же чип проснулся, то прерывание ПРОИЗОШЛО.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
-
codenamehawk
- Вымогатель припоя
- Сообщения: 528
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Re: ATtiny45 - странность с внешним прерыванием
watchmaker писал(а): мешает ОТСУТСТВИЕ прерывания при пробуждении чипа.
Чудеса однако.watchmaker писал(а):А от чего он может проснуться, если не от сигнала на PB2?
То что вы не видите то, что ожидаете, не означает, что оно произошло или не произошло.
Не знаю есть ли в аттини, но в других показывает источник ресета.
Меняйте стиль программы.
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: ATtiny45 - странность с внешним прерыванием
Ресета у меня никакого нет, все данные остаются на месте.Не знаю есть ли в аттини, но в других показывает источник ресета.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
-
codenamehawk
- Вымогатель припоя
- Сообщения: 528
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Re: ATtiny45 - странность с внешним прерыванием
Вы только препологаете, на самом деле надо проверять все возможные варианты, особенно когда не можете обьяснить поведение программы.
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: ATtiny45 - странность с внешним прерыванием
Если сделать ресет, чип инициализирует ещё несколько переменных, это сразу будет видно по поведению.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...


