Не удается включить сторожевой таймер при использовании загрузчика Arduino 8 МГц
Я запускаю свои проекты Arduino вот так:
Моя цель-запустить этот проект на частоте 8 МГц, чтобы (1) батарея работала дольше и (2) чтобы я следовал спецификациям. Я смог записать загрузчик с частотой 8 МГц на свой чип Atmega328 благодаря этому видео: https://www.youtube.com/watch?v=fzZ2TR_mwgs
После просмотра видео я могу запускать скетчи на частоте 8 МГц, и они потребляют меньше тока. Но мой первоначальный проект выходит из строя до такой степени, что мне снова приходится записывать загрузчик. Даже если я нажму кнопку сброса, она не станет отзывчивой. Я обнаружил, что именно эта строка кода делает мой чип atmega328 невосприимчивым:
wdt_enable(WDTO_4S); // #include <avr/wdt.h>
Я узнаю об этом, потому что удаление этой строки заставило мой проект работать. Эта линия позволяет проснуться через 4 секунды. Поэтому я в основном выполняю некоторую работу и засыпаю на 4 секунды. Затем я повторяю те же шаги навсегда, чтобы сэкономить батарею. Поэтому перед сном я выполняю следующее:
// выход из сна через 4 секунды
wdt_enable(WDTO_4S);
// погрузить в глубокий сон
if (true)
{
// БОЛЬШАЯ разница во сне
// Откючить АЦП (аналого - цифровой преобразователь)
ADCSRA &= ~(1 << 7);
SMCR |= (1 << 2); // выключить
SMCR |= 1; // включить режим сна;
// BOD ОТКЛЮЧЕН (большая разница только во сне)
MCUCR |= (3 << 5); // set both BODS and BODSE at the same time
MCUCR = (MCUCR & ~(1 << 5)) | (1 << 6); // then set the BODS bit and clear the BOSE bit at the same time
__asm__ __volatile__("sleep");
}
// эта строка не будет выполняться....
В любом случае, как я мог бы решить эту проблему? Должен ли я сохранить первоначальный проект и просто заменить кристалл на 8 МГц? тогда мне придется иметь в виду, что все задержки будут в два раза меньше скорости?
@Tono Nam, 👍1
2 ответа
Лучший ответ:
Попробуйте включить питание UNO, когда платы перестанут отвечать. Это должно сбросить настройки сторожевого пса. Насколько я знаю, простое нажатие кнопки сброса не отключает сторожевой пес.
Загрузчик не знает, что вы включили сторожевой таймер, и если это займет более 4 секунд, вы застрянете в бесконечном цикле. Вместо этого вы можете попробовать использовать загрузчик optiboot. Этот сбрасывает сторожевой пес, когда он запускается.
В-третьих, вы можете включить прерывание сторожевого пса. Если вы сделаете это, микроконтроллер все равно проснется через 4 секунды сна, но он возобновит ваш код вместо того, чтобы выполнять сброс. Это приведет к тому, что загрузчик запустится только один раз.
Ваши задержки, вероятно, и убивают вас. Если у вас есть задержки, превышающие время WDT, это приведет к тайм-ауту WDT. Помните, что функция задержки не делает ничего, кроме времени записи, больше ничего не обрабатывается. Перейдите на сайт Millis или что-то в этом роде, как много раз рекомендовалось на форумах Arduino.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату