Есть МК ATtiny45, тактирование от watchdog осциллятора (128 кГц). Чип стоит в спящем режиме (глубокий сон, осциллятор выключен) и просыпается по нажатию кнопки на PB2 (внешнее прерывание по смене уровня). Кнопка подаёт на вход логическую единицу, сам вход подвязан резистором на ноль. Проверял код в Протеусе - всё идеально. В реальном железе иногда (порядка 1 из 10 нажатий кнопки) наблюдаю такую ситуацию. Нажимаю кнопку (и держу её достаточно долго, не меньше 0.5 с) - чип просыпается, но ведёт себя так, как будто не выполнил обработчик прерывания и вывалился сразу в основной цикл. При этом в основном цикле он также проверяет состояние порта PB2 и видит на нём единицу. Если чип увидел на входе единицу, проснулся и продолжает видеть единицу, почему он не выполнил обработчик прерывания?
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Последний раз редактировалось watchmaker Сб июл 19, 2025 19:21:16, всего редактировалось 1 раз.
Ложится спать как раз исправно, это видно по нулевому потреблению (в рабочем режиме потребление 50..100 мкА). Просыпается при нажатии кнопки тоже чётко. Но дальше действует так, как будто в переменных занесены их предыдущие значения, тогда как в обработчике прерывания вызывается функция, которая инициализирует их. Смущает то, что если на этот же вход сигнал приходит не с кнопки, а из другого источника (с платы электронных часов), таких проблем не бывает.
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Кнопка не механическая, а на токопроводящей резинке - вряд ли она дребезжит. К тому же с кнопки идёт постоянное напряжение, а с часов - импульсы 4 кГц. При этом сигнал с часов всегда отрабатывается чётко.
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
watchmaker, ответь на вопрос о МК без програмного опубликованного кода ... это как размышления гадалки, смотрящей в хрустальный шар ... Предоставьте код или хотя бы фрагмент кода, отвечающий за это. (частично пользуюсь переводчиком)
Здесь важно 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 на этом пине и не выполняет обработчик прерывания?
Возможно ли такое, если напряжение на пине при нажатии на кнопку возрастает слишком медленно? С кнопками на токопроводящей резине такое бывает.
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Есть МК ATtiny45, тактирование от watchdog осциллятора (128 кГц).
Поясните, в каком разделе даташита можно прочитать как настроить тактирование МК от сторожевого таймера?
Цитата:
Чип стоит в спящем режиме (глубокий сон, осциллятор выключен) и просыпается по нажатию кнопки на PB2 (внешнее прерывание по смене уровня). Кнопка подаёт на вход логическую единицу, сам вход подвязан резистором на ноль. Проверял код в Протеусе - всё идеально.
Всё дело в том, что из глубокого сна (Power-down) разбудить внешним прерывание от INT0 можно лишь когда он настроен на контроль низкого уровня. Потому при использовании прерывания по INT0, когда вы переводите МК в выключенное состояние (Power-down), то биты ISC01; ISC00, регистра MCUCR переводятся автоматически в нулевое состояние, которое соответствует прерыванию по низкому уровню. А так как вы подтянули вывод РВ2 через резистор к общей шине (GND), то могу предположить, что ваш МК засыпая вновь просыпается от внешнего прерывания по низкому уровню INT0... таким образом выйдя из прерывания МК отработав одно действие из основного цикла уходит в новь на прерывание и так далее...
Цитата:
чип просыпается,
Предполагаю что ваш чип из вышеописанного практически не спит, а значит он не просыпается а постоянно находится в работе периодически отрабатывая прерывание по INT0.
Поясните, в каком разделе даташита можно прочитать как настроить тактирование МК от сторожевого таймера?
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.
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Кнопка не механическая, а на токопроводящей резинке
Вы токопроводящею резинку называете не механической?
watchmaker писал(а):
в обработчике прерывания вызывается функция, которая инициализирует их.
Может более логично в прерывании установить флаг, а все остальное делать в майн. Там сразу запретить прерывание и отработать нужный код. Перед сном сбросить флаг прерывания и уйти в сон. Это отбросит повторные прерывания от дребезга кнопки.
Добавлено after 24 minutes 30 seconds: Попробуйте подавить дребезг при помощи RC цепочки.
А от чего он может проснуться, если не от сигнала на PB2?
Цитата:
если же чип проснулся, то прерывание ПРОИЗОШЛО.
А почему тогда в обработчике прерывания не отработала ни одна строка? Глючный экземпляр чипа? Смущает, что на других часах с такой же схемой и с теми же исходниками, но с ATtiny85 этой ситуации никогда не было.
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
мешает ОТСУТСТВИЕ прерывания при пробуждении чипа.
watchmaker писал(а):
А от чего он может проснуться, если не от сигнала на PB2?
Чудеса однако. То что вы не видите то, что ожидаете, не означает, что оно произошло или не произошло. Не знаю есть ли в аттини, но в других показывает источник ресета. Меняйте стиль программы.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 62
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения