Ну почему вы не пользуетесь готовыми либами, которые стандартно имеются в вашем компиляторе?! Почему вы постоянно изобретаете свой велосипед?! Ну изучите стандартные возможности вашего инструмента, в конце-то концов! Настройка, запуск и сброс WDT делается красиво в 1 строку, и никаких ручных манипуляций с битами!
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Господа, та же история: не могу увеличить время предделителя собаки, контроллер правда Мега8А-pu(фьюзы по дефолту 1МГц и тд), пробую только в железе. В практике были и другие контроллеры: меги тини на них как то такой проблемы не возникало, ставил 2 сек и без проблем, с мегой8 ну не в какую. При чтении WDP2, WDP1, WDP0 всегда 0 0 0 хотя в даташите написано что вроде читать эти биты можно, тем не менее время срабатывания тоже не меняется. Бит WDE читается и пишется без проблем. Спойлер
Код:
пытался так
void main() { asm wdr;
WDCE_bit = 1;// снятие блокировки на изменение битов регистра WDTCR
Я вам так скажу, бился я с этим таймером 4 ночи подряд, и ничего не получилось. Когда открыл дизасемблерный листинг, выяснилось что компилятор ходит огородами, и нужный бит записывает вовсе не за 4 такта, как положено в датащите.(уже не помню какой точно) . Таймер заработал как положено только после использования библиотеки. А вам скорее всего придется делать асемблерные вставки.
С удивлением для себя обнаружил, что в attinyx4 инструкция wdt_reset() не работает. Но по порядку. Читаем даташит:
Цитата:
If the reset period expires without another Watchdog Reset, the ATtiny24A/44A/84A resets and executes from the Reset Vector.
Ну то бишь когда поднят бит WDIE, по срабатыванию wdt мы уйдем на вектор WATCHDOG_vect. Если не сделать сброс, то при повторном срабатывании wdt мы уже уходим на вектор reset. Это хорошо, если код зациклился, а специально взводить wdt (если он уже используется) не надо - при грамотно написанном коде МК перезагрузится. ОК. Есть у меня такой код:
Во сне я ожидаю реакцию от устройства, а чтобы не уснуть навсегда, я это дело контролирую wdt. Первый сон я прохожу нормально - код исполняется. Ухожу во второй сон, а просыпаюсь по ресету wdt (контролирую MCUSR). Что за дела? Переписываю код так:
ДОбрый день котаны! позвольте прояснить для себя пару вопросов про собаку (камень 328P)
1) правильно я понял что максимальное время на которое можно настроить собаку это пробуждение через 8с ?
2) т.е. получается не реально настроить на пробуждение раз в сутки или неделю ?
3) правильно я понял что перед выключение собаки надо делать wdt_reset ? если да то - а зачем нужно делать ресет ?
4) правильно я понял что начальное значение WDTON,WDE,WDIE = 100 ?
5) правильно я понял что режим 110 (ресет) - это ресет камня каждые (например 8с) даже если в это время выполняется какойот другой код ?
6) а режим 101 (прерывания) как работает ? если камень например спит как этот режим его разбудит? обычное прерывание срабатывает по 1 или 0 на входе а тут?
7) если я отклучю собаку кодом из даташита в целях power save на что это повлияет (ну кроме самой собаки) ?
2 - с помощью watchdog - нет. С помощью других таймеров - вполне, надо считать. Вообще, Watchdog нужен не для этого.
3 - чтобы гарантированно дать время выключить таймер.
4 - наизусть не помню, в даташит.
5 - да, для этого watchdog и нужен, чтобы, если выполнение кода заняло больше времени, чем ожидалось (или контроллер вообще завис), перезагрузить систему.
6 - обычное прерывание срабатывает по любому событию; "1 или 0 на входе" - это конкретно прерывания GPIO.
7 - по-умолчанию watchdog-таймер и так выключен.
_________________ Разница между теорией и практикой на практике гораздо больше, чем в теории.
1) правильно я понял что максимальное время на которое можно настроить собаку это пробуждение через 8с ?
2) т.е. получается не реально настроить на пробуждение раз в сутки или неделю ?
Здрасти, идея не нова, я для этой цели хотел использовать ds3231(купил но руки так пока и не дошли), а именно это микросхема часов с будильником т.е. заводим будильник который сработает (максимально возможный период срабатывания 1 раз в месяц) сработает он через месяц, разбудит контроллер, контроллер перезаводит будильник на новую дату и спит ещё месяц. Так за год можно просыпаться не более 12 раз
1 - ну других значений нет в ДШ если вы про это. ага значит максимальное время ресета камня 8 с. понял.
4 - WDTON WDE WDIE Mode Action on Time-out 1 0 0 Stopped None 1 0 1 Interrupt mode Interrupt 1 1 0 System reset mode Reset 1 1 1 Interrupt and system reset mode Interrupt, then go to system resetmode 0 x x System reset mode Reset какие начальные значения ?
5 - если он нужен чтоб просто его ресетить то почему такие маленькие таймеры много не успеешь за 16 или 32 мс ?
6 - прочитал еще раз ДШ. получается после таймера (например 8с) будет вызвано ISR без ресета ?т.е. мы должны предусметреть чтобы после выхода из ISR указатель ушёл обратно в loop, и ресета не будет ,да ? 6 - что значит обычное прерывание? у собаки же нет тригера low/change/rising ? - какие кроме таймеров ресета есть тригеры у собаки для WDT_interrupts ?
7 - он выключен (disable) или просто stopped mode 100 (смотрите пункт 4) ?
1- прерывание собаки может будить из глубокого сна и просыпаться из него раз в 8 сек, инкрементировать переменную перезаводить прерывание собаки и снова засыпать может оказаться экономичней, чем месяц мелко дремать с включенным таймером ... 5- если завел собаку, то кормить (сбрасывать) не забывай и всё будет норм (только надо правильно сбрасывалки расставить, например внутри цикла, который может повиснуть - неправильно). 6- насколько я помню, режим прерывания сбрасывается при сработке собаки и его надо снова устанавливать, если не установить - в следующий раз будет ресет. (это ещё одна защита от зависания кода) 6- такое же прерывание, как например переполнение любого другого таймера, только будит и из глубокого сна (в котором остальные таймеры тоже спят)...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
5 - если он нужен чтоб просто его ресетить то почему такие маленькие таймеры много не успеешь за 16 или 32 мс ?
16 мс при частоте 8 МГц это 128 тысяч тактов. За этот промежуток, при условии линейного выполнения, можно исполнить все содержимое FLASH-памяти какой-нибудь ATmega48. Успеть можно много.
Есть задачи, где промедление в пару десятков миллисекунд уже критично и грозит выходом из режима.
Цитата:
6 - что значит обычное прерывание? у собаки же нет тригера low/change/rising ? - какие кроме таймеров ресета есть тригеры у собаки для WDT_interrupts ?
Прерывание - это аппаратный переход к выполнению конкретного участка кода. Условия срабатывания по фронтам относятся только к конкретным блокам, для которых это актуально (портам и компаратору, например), и не имеют отношения к собственно механизму прерываний.
_________________ Разница между теорией и практикой на практике гораздо больше, чем в теории.
YS - 1 такт это 4мкс ? то 128 тыщ и не так много на один только блинк уходит 5000 мкс
Ivanoff-iv - иногда так экономичнее но если внешний таймер просто подаёт единицу раз в сутки то мыможем не дремать а глубоко спать
спасибо ребята, почти в голове нарисовалась картина про собаку и зачем оно может пригодиться. хотя для меня только вижу один проект где оно может понадобиться
1) правильно я понял что максимальное время на которое можно настроить собаку это пробуждение через 8с ? если из глубукого сна то да максимум 8с, если из работающей программы то с помощью сброса собаки мы обнуляем счетчик собаки, столько сколько нужно, и ресета не будет пока счетчик не досчитает до 8с(или другой интервал)
4) правильно я понял что начальное значение WDTON,WDE,WDIE = 100 ? начальное значение я так пока и не понял какое. я смогу прочитать эти регистры из тела программы ?
6) а режим 101 (прерывания) как работает ? а тут не по 1 или 0 как для портоа а как раз по таймеру дошли до 8с. вызов ISR. опять продолжаем loop() с точки откуда ушли в ISR и опять чере 8с ISR. так по кругу
7) если я отклучю собаку кодом из даташита в целях power save на что это повлияет (ну кроме самой собаки) ? 7 ) disable or enable WDTON я посматрю во фьюзах HIGH BITS. так и не понял на что может повлиять отключеная собака / на какие сценари/ на функционирование встроенных блоков или компораторов в МК/ на работу самого МК. например на время (длительность) пробуждения МК из глубокого сна может повлиять?
YS - 1 такт это 4мкс ? то 128 тыщ и не так много на один только блинк уходит 5000 мкс
При частоте 8 МГц один системный такт, как не трудно посчитать, это 125 наносекунд.
Я смотрю, вы не понимаете, зачем нужен сторожевой таймер.
Дело в том, что в профессиональной разработке микроконтроллеры как правило применяются не для того, чтобы исключительно мигать светодиодом, а для каких-то более продвинутых задач; например, для управления двигателями.
Возьмем управление асинхронным двигателем, к примеру. В этом применении требуется каждые несколько десятков миллисекунд выполнять достаточно нетривиальные расчеты. Сложность этих расчетов зависит от крутизны системы, но в базовом варианте может хватить той самой сотни тысяч операций.
Если контроллер по какой-то причине задержится с выполнением расчетов, то управляющий сигнал может залипнуть на одном уровне, когда уже давно нужен другой, и случится фейерверк. Для исключения этого можно сделать, например, так: перед входом в блок, выполняющий расчет, обнулять сторожевой таймер, настроенный на предельный безопасный интервал. После выхода тоже обнулять его. В этом случае, если расчеты завершатся за нормальное время, все будет функционировать штатно, а если по какой-то причине контроллер зависнет в процессе (неверные входные данные из-за помехи в сигнале датчика, какая-то плавающая ошибка в алгоритме, глюк самого контроллера из-за помех - такое тоже бывает), то сторожевой таймер перезагрузит контроллер, и последний с большой вероятностью успеет подхватить управление процессом до того, как случится непоправимое.
Именно поэтому сторожевой таймер имеет отдельное тактирование - работа кварцевого генератора может быть сорвана действием внешней помехи, особенно в индустриальных условиях. В этом случае сторожевой таймер также перезагрузит контроллер, что приведет к повторному старту генератора.
Так что назначение сторожевого таймера - обеспечить сброс контроллера в аварийных условиях, а не помогать мигать светодиодом. Для мигания светодиодом и прочих подобных вещей есть штатные таймеры.
_________________ Разница между теорией и практикой на практике гораздо больше, чем в теории.
... если внешний таймер просто подаёт единицу раз в сутки то мыможем не дремать а глубоко спать...
По мне, использование WDT вкупе с внешним таймером слишком надумано. ATmega328P поддерживает режим POWER SAVE и асинхронный таймер Т2. Последний DS утверждает, что потребление в этом режиме порядка 0,6мкА. Спойлер Касательно DS3231. Не такая она и малопотребляющая, если учесть, что раз в 64 секунды аппаратно запускается преобразование температуры на 125мс с потреблением порядка 500мкА. Интерфейс IIC тоже дает о себе знать в плане потребления порядка 100мкА, не считая 2-х лап для его обслуживания.
Касательно DS3231. Не такая она и малопотребляющая
Речь шла при условии питания(только часов) от установленной батарейки в DS3231. Будильник при этом тоже срабатывает, после чего будим контроллер и подаём общее питание на DS3231 для возможности пообщаться по IIC. Сам не пробовал но читал на одном форуме что уже такое проделывали
подскажите пожалуйста. нету под рукой НАНО не могу проверить. но на леонардо (встроенный usb) wdt_reset() неправильно сбрасывает, usb не подымается ну или я неправильно делаю. что я хотел спросить
вот этот макрос
Код:
void soft_reset(){ wdt_enable(0); while (1); }
для НАНО абсолютно правильный /верный и программно и железно ? все регистры /порты буду правильно сброшенны , проинициализированны в начальное состояние. usb/serial работает. или этого кода мало для коректного И БЕЗ ПРОБЛЕМНОГО ресета ?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 60
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения