После того, как МК перезагрузится из-за проблема, распечатайте этот регистр и приведите содержимое. (Думаю над МК над 8-pins AVR с отладкой - миссия почти невыполнима). --- Если нет другого варианта - "телефрагируйте" его содержимое через один выход со LED .
Код:
MCUSR – MCU Status Register The MCU Status Register provides information on which reset source caused an MCU Reset.
Он НЕ ПЕРЕЗАГРУЖАЕТСЯ, а просыпается и продолжает выполнять код с текущего места (и с текущими значениями переменных), не выполняя обработчик прерывания. Перезагрузка была бы заметна по сбросу в ноль переменной m_index - она остаётся с тем значением, которое было в неё записано. Подозреваю, что дело всё-таки в кнопке с токопроводящей резинкой - при нажатии напряжение на пине поднимается недостаточно быстро.
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Тогда сразу после пробуждения подождите некоторое время, прежде чем принимать какие-либо новые решения. Так динамические вариации состояния кнопок будут игнорироваться.
Вот как "пробуждаю" ATtiny13A одной из двух кнопок, затем через 5 секунд он снова "засыпает".
Код:
#define PIN_TA PB1 #define PIN_TI PB2 ... PORTB |= (1 << PIN_TI) | (1 << PIN_TA); // pull-ups GIMSK |= (1 << PCIE); // sets the Pin change interrupt mask PCMSK |= (1 << PCINT1) | (1 << PCINT2); // wake up from PB1 or PB2 ... если время > 5000 ms { sei(); WDTCR &= ~(1 << WDTIE); // disable Watchdog Timer interrupt set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_cpu(); }
ISR(PCINT0_vect) { // wake up sleep_disable(); cli(); WDTCR |= (1 << WDTIE); // enable Watchdog Timer interrupt }
Потребление равно нулю (почти) - одна батарейка CR2032 с 02.2023 работает до сих пор. Не то чтобы пользовался устройством, но саморазряд определенно выше.
Ещё два вопроса по внешним прерываниям. 1. Безопасно ли на лету менять значения PCMSK и/или GIMSK? Не могу отследить, почему очень редко (два раза за неделю при сотнях запусков в день как от часов, так и с кнопки) контроллер намертво зависает. Есть подозрение на запись в PCMSK (включение внешнего прерывания) непосредственно перед уходом в спящий режим. 2. Можно ли сделать обработчик прерывания полностью пустым, т. е. использовать внешнее прерывание чисто для пробуждения чипа?
_________________ Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Можно ли сделать обработчик прерывания полностью пустым, т. е. использовать внешнее прерывание чисто для пробуждения чипа?
Вроде как изначально все обработчики прерывания пустые, на месте вектора прерывания просто стоит команда RETI.
Насчёт дребезга. Надо сделать нормальную программную защиту от дребезга кнопки, это просто, а не надеяться на авось. В нормальной среде разработки есть готовая команда, чтобы не морочиться.
После того, как МК перезагрузится из-за проблема, распечатайте этот регистр и приведите содержимое. (Думаю над МК над 8-pins AVR с отладкой - миссия почти невыполнима).
Дело не в МК AVR, а в отсутствии или наличии хорошей среды разработки и программатора-отладчика.
адо сделать нормальную программную защиту от дребезга кнопки, это просто, а не надеяться на авось. В нормальной среде разработки есть готовая команда, чтобы не морочиться.
Приведите , пожалуйста, команду языка Си, на котором пишет ТС, что бы защититься от дребезга?
#define BROTHERLY_ANTI-BOUNCE "Не дребезжи по-братски есть же!"
_________________ Платы для HLDI - установки лазерной засветки фоторезиста. ФоторезистыOrdyl Alpha 350 и AM 140. Жидкое олово для лужения плат (видео) - самое лучшее и только у меня. Паяльная маска XV501T-4 и KSM-S6189 (5 цветов). Заказ печатных плат - pcbsmac@gmail.com
smacorp, использование данного дефайна даст ашыбку компиляции... Обернуть строку в какой то printf надо.... И вообще, в нормальных средах разработки такие дефайны не нужны. Там уже все есть встроенное. И одна большая кнопка - сгенерировать код. Даже думать не надо, жми и наслаждайся
src\main.cpp:9:23: warning: ISO C++11 requires whitespace after the macro name #define BROTHERLY_ANTI-BOUNCE "Не дребезжи по-братски есть же!" ^
Вот релиз:
Код:
#define BROTHERLY_ANTIBOUNCE "Не дребезжи по-братски есть же!"
_________________ Платы для HLDI - установки лазерной засветки фоторезиста. ФоторезистыOrdyl Alpha 350 и AM 140. Жидкое олово для лужения плат (видео) - самое лучшее и только у меня. Паяльная маска XV501T-4 и KSM-S6189 (5 цветов). Заказ печатных плат - pcbsmac@gmail.com
...Вроде как изначально все обработчики прерывания пустые, на месте вектора прерывания просто стоит команда RETI...
Зависит от среды разработки. На ассемблере делается вручную и необязательно RETI. Можно, при необходимости, выйти из обработчика по RET, т.е. с запретом прерываний. В вышеприведенном примере именно таким образом разделяются события, вызвавшие прерывание.
Приведите , пожалуйста, команду языка Си, на котором пишет ТС, что бы защититься от дребезга?
На СИ не работаю, на мой взгляд, морочный язык. На котором работаю, есть простая команда чтения кнопок с подавлением дребезга и без всякого «обёртывания». Чтение кнопок очень часто используется, поэтому, на мой взгляд, должна быть в хороших языках, это удобно.
Обычно надо дождаться окончания дребезга, затем отпускания кнопки, потом выполнять программу. Неясно, как сделано у ТС, возможно, тут заморочка.
Зависит от среды разработки. На ассемблере делается вручную и необязательно RETI. Можно, при необходимости, выйти из обработчика по RET, т.е. с запретом прерываний. В вышеприведенном примере именно таким образом разделяются события, вызвавшие прерывание.
Ассемблеры разные бывают. На близком к ассемблеру программе АБ вроде как RETI автоматически прописываются. В моём случае можно включить или выключить эту автоматику. Стандартный выход из прерывания по RETI вроде как предпочтительнее. Насколько обоснован нестандартный выход – вопрос.
AQ29, но ведь топикстартер пишет на си. Зачем вы ему рекламируете АБ и ваш современный ассемблер и среду разработки, имя которой вы так нигде и не назвали?
Пардоньте, но нет. Лио нормальный асм, либо си.... А вот это вот... поделие... хоть и визуальное, и ассемблерно-приближенное... Может, если бы я потрогала АБ до изучения асма - то может и зашло б... Но обычный асм и студия 4й версии - наше всё. А может и не зашло, ибо до микроконтроллеров было много программирования на си, паскале, pl/sql, немного на JS..
Да не халтурки, а уроки информатики... Сначала алгоритм ы тетради, а потом превращение алгоритма в текст программы. И препод правильно сказал - что, имея алгоритм, не важно, какой потом будет язык программирования. А учили нас Бейсику, поскольку он был прописан в школьной программе для школ, которые оборудованы были компьютерными классами.
AQ29, но ведь топикстартер пишет на си. Зачем вы ему рекламируете АБ и ваш современный ассемблер и среду разработки, имя которой вы так нигде и не назвали?
Тут вроде рекламы нет. На чём пишу, пока в разработке, да и имени пока нет, хотя в ваших постах неявно прозвучал интересный вариант названия.
Кстати, в моём варианте поиск такой ошибки был бы скорее всего очень простым. За несколько минут поставил несколько команд по ходу программы – вот и ясен путь программы и значения переменных в этих точках. А вот так на СИ тратить массу времени на простую ошибку - это не моё.
Даёшь неморочный АБ в массы! На ассемблере можно почти всё сделать одной командой. На макроассемблере.)
АБ давно устарела. Запоздали вы с таким лозунгом лет на 20. Сомневаюсь в таких возможностях макроассемблера. Наверно, даже прочитать кнопки без дребезга одной командой не получится.
Сейчас этот форум просматривают: Santa55 и гости: 26
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения