Не удается включить сторожевой таймер при использовании загрузчика 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 МГц? тогда мне придется иметь в виду, что все задержки будут в два раза меньше скорости?

, 👍1


2 ответа


Лучший ответ:

1

Попробуйте включить питание UNO, когда платы перестанут отвечать. Это должно сбросить настройки сторожевого пса. Насколько я знаю, простое нажатие кнопки сброса не отключает сторожевой пес.

Загрузчик не знает, что вы включили сторожевой таймер, и если это займет более 4 секунд, вы застрянете в бесконечном цикле. Вместо этого вы можете попробовать использовать загрузчик optiboot. Этот сбрасывает сторожевой пес, когда он запускается.

В-третьих, вы можете включить прерывание сторожевого пса. Если вы сделаете это, микроконтроллер все равно проснется через 4 секунды сна, но он возобновит ваш код вместо того, чтобы выполнять сброс. Это приведет к тому, что загрузчик запустится только один раз.

,

1

Ваши задержки, вероятно, и убивают вас. Если у вас есть задержки, превышающие время WDT, это приведет к тайм-ауту WDT. Помните, что функция задержки не делает ничего, кроме времени записи, больше ничего не обрабатывается. Перейдите на сайт Millis или что-то в этом роде, как много раз рекомендовалось на форумах Arduino.

,