После того, как МК перезагрузится из-за проблема, распечатайте этот регистр и приведите содержимое.
(Думаю над МК над 8-pins AVR с отладкой - миссия почти невыполнима).
---
Если нет другого варианта - "телефрагируйте" его содержимое через один выход со LED .
Он НЕ ПЕРЕЗАГРУЖАЕТСЯ, а просыпается и продолжает выполнять код с текущего места (и с текущими значениями переменных), не выполняя обработчик прерывания. Перезагрузка была бы заметна по сбросу в ноль переменной 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. Можно ли сделать обработчик прерывания полностью пустым, т. е. использовать внешнее прерывание чисто для пробуждения чипа?
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
[uquote="watchmaker",url="/forum/viewtopic.php?p=4733248#p4733248"]Не могу отследить, почему очень редко (два раза за неделю при сотнях запусков в день как от часов, так и с кнопки) контроллер намертво зависает.[/uquote]
Обычно такие дефекты связаны с плохой методикой написания программы, особенно при работе с прерываниями. От этого надо уходить.
[uquote="watchmaker",url="/forum/viewtopic.php?p=4733248#p4733248"]Можно ли сделать обработчик прерывания полностью пустым, т. е. использовать внешнее прерывание чисто для пробуждения чипа?[/uquote]
Вроде как изначально все обработчики прерывания пустые, на месте вектора прерывания просто стоит команда RETI.
Насчёт дребезга. Надо сделать нормальную программную защиту от дребезга кнопки, это просто, а не надеяться на авось. В нормальной среде разработки есть готовая команда, чтобы не морочиться.
[uquote="veso74",url="/forum/viewtopic.php?p=4733098#p4733098"]После того, как МК перезагрузится из-за проблема, распечатайте этот регистр и приведите содержимое.
(Думаю над МК над 8-pins AVR с отладкой - миссия почти невыполнима).[/uquote]
Дело не в МК AVR, а в отсутствии или наличии хорошей среды разработки и программатора-отладчика.
AQ29 писал(а):адо сделать нормальную программную защиту от дребезга кнопки, это просто, а не надеяться на авось. В нормальной среде разработки есть готовая команда, чтобы не морочиться.
Приведите , пожалуйста, команду языка Си, на котором пишет ТС, что бы защититься от дребезга?
#define BROTHERLY_ANTI-BOUNCE "Не дребезжи по-братски есть же!"
Платы для HLDI - установки лазерной засветки фоторезиста. ФоторезистOrdyl Alpha 350 Жидкое олово для лужения плат (видео) - самое лучшее и только у меня. Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
smacorp, использование данного дефайна даст ашыбку компиляции...
Обернуть строку в какой то printf надо....
И вообще, в нормальных средах разработки такие дефайны не нужны. Там уже все есть встроенное. И одна большая кнопка - сгенерировать код. Даже думать не надо, жми и наслаждайся
#define BROTHERLY_ANTIBOUNCE "Не дребезжи по-братски есть же!"
Платы для HLDI - установки лазерной засветки фоторезиста. ФоторезистOrdyl Alpha 350 Жидкое олово для лужения плат (видео) - самое лучшее и только у меня. Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
[uquote="AQ29",url="/forum/viewtopic.php?p=4736438#p4736438"]...Вроде как изначально все обработчики прерывания пустые, на месте вектора прерывания просто стоит команда RETI...[/uquote]Зависит от среды разработки. На ассемблере делается вручную и необязательно RETI. Можно, при необходимости, выйти из обработчика по RET, т.е. с запретом прерываний. В вышеприведенном примере именно таким образом разделяются события, вызвавшие прерывание.
[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4736446#p4736446"]Приведите , пожалуйста, команду языка Си, на котором пишет ТС, что бы защититься от дребезга?[/uquote]
На СИ не работаю, на мой взгляд, морочный язык. На котором работаю, есть простая команда чтения кнопок с подавлением дребезга и без всякого «обёртывания».
Чтение кнопок очень часто используется, поэтому, на мой взгляд, должна быть в хороших языках, это удобно.
Обычно надо дождаться окончания дребезга, затем отпускания кнопки, потом выполнять программу. Неясно, как сделано у ТС, возможно, тут заморочка.
[uquote="akl",url="/forum/viewtopic.php?p=4736556#p4736556"]Зависит от среды разработки. На ассемблере делается вручную и необязательно RETI. Можно, при необходимости, выйти из обработчика по RET, т.е. с запретом прерываний. В вышеприведенном примере именно таким образом разделяются события, вызвавшие прерывание.[/uquote]
Ассемблеры разные бывают. На близком к ассемблеру программе АБ вроде как RETI автоматически прописываются.
В моём случае можно включить или выключить эту автоматику.
Стандартный выход из прерывания по RETI вроде как предпочтительнее. Насколько обоснован нестандартный выход – вопрос.
AQ29, но ведь топикстартер пишет на си. Зачем вы ему рекламируете АБ и ваш современный ассемблер и среду разработки, имя которой вы так нигде и не назвали?
Пардоньте, но нет.
Лио нормальный асм, либо си.... А вот это вот... поделие... хоть и визуальное, и ассемблерно-приближенное... Может, если бы я потрогала АБ до изучения асма - то может и зашло б... Но обычный асм и студия 4й версии - наше всё.
А может и не зашло, ибо до микроконтроллеров было много программирования на си, паскале, pl/sql, немного на JS..
[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4736766#p4736766"]OKF, не поверишь, но в школе был Бейсик.[/uquote]
Значит кто-то пошел неправильным путём. Бывают исключения. Видать халтурки этому виной.)
Да не халтурки, а уроки информатики... Сначала алгоритм ы тетради, а потом превращение алгоритма в текст программы. И препод правильно сказал - что, имея алгоритм, не важно, какой потом будет язык программирования. А учили нас Бейсику, поскольку он был прописан в школьной программе для школ, которые оборудованы были компьютерными классами.
[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4736624#p4736624"]AQ29, но ведь топикстартер пишет на си. Зачем вы ему рекламируете АБ и ваш современный ассемблер и среду разработки, имя которой вы так нигде и не назвали?[/uquote]
Тут вроде рекламы нет. На чём пишу, пока в разработке, да и имени пока нет, хотя в ваших постах неявно прозвучал интересный вариант названия.
Кстати, в моём варианте поиск такой ошибки был бы скорее всего очень простым. За несколько минут поставил несколько команд по ходу программы – вот и ясен путь программы и значения переменных в этих точках.
А вот так на СИ тратить массу времени на простую ошибку - это не моё.
[uquote="OKF",url="/forum/viewtopic.php?p=4736702#p4736702"]Даёшь неморочный АБ в массы!
На ассемблере можно почти всё сделать одной командой. На макроассемблере.)[/uquote]
АБ давно устарела. Запоздали вы с таким лозунгом лет на 20.
Сомневаюсь в таких возможностях макроассемблера. Наверно, даже прочитать кнопки без дребезга одной командой не получится.
[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4736766#p4736766"]OKF, не поверишь, но в школе был Бейсик. В студенчестве - Паскаль. На халтурке - Борланд Си++[/uquote]
Что вы так на бейсик обрушились. Для компьютера и сейчас бейсик вроде как активно развивается, только название стало Visual Basic.