Я пытаюсь обернуть голову вокруг сторожевого таймера на серии ATTinyX5. То, что я прочитал, показалось, что вы можете использовать его для того, чтобы программа делала что-то конкретное за N секунд, но никогда не показывало, как. Другие создавали впечатление, будто он будет сбрасывать чип только в том случае, если что-то в коде будет сброшено, пока не будет подсчитано (что, по-видимому, является «нормальным» использованием).
Есть ли способ использовать WDT, как TIMER1_COMPA_vect или аналогичный. Я заметил, что у него есть 1-секундный режим тайм-аута, и я бы очень хотел иметь возможность использовать это для того, чтобы что-то происходило в моем коде каждую 1 секунду (и, желательно, спать между ними).
Мысли?
* Обновление: * Поскольку его спросили, я имею в виду раздел 8.4 таблицы ATTinyX5 . Не то чтобы я полностью это понял, в этом моя проблема ...
Ответы:
Вы наверняка можете. В соответствии с таблицей данных сторожевой таймер может быть настроен на сброс MCU или вызывать прерывание при его срабатывании. Кажется, вас больше интересует возможность прерывания.
WDT на самом деле проще в настройке, чем обычный таймер, по той же причине, по которой он менее полезен: меньше вариантов. Он работает на тактовой частоте 128 кГц, что означает, что его тактовая частота не зависит от основной тактовой частоты MCU. Он также может продолжать работать в самых глубоких режимах сна, чтобы обеспечить источник пробуждения.
Я рассмотрю несколько примеров таблиц, а также некоторый код, который я использовал (на языке C).
Включенные файлы и определения
Для начала, вы, вероятно, захотите включить следующие два заголовочных файла для работы:
Кроме того, я использую макрос <_BV (BIT)>, который определен в одном из стандартных заголовков AVR следующим образом (который может быть более привычным для вас):
Начало кода
Когда MCU запускается впервые, вы обычно инициализируете ввод-вывод, настраиваете таймеры и т. Д. Где-то здесь хорошее время, чтобы убедиться, что WDT не вызвал сброс, потому что он мог сделать это снова, сохраняя вашу программу в нестабильная петля.
Настройка WDT
Затем, после того, как вы настроите остальную часть чипа, переделайте WDT. Настройка WDT требует «временной последовательности», но это действительно легко сделать ...
Конечно, ваши прерывания должны быть отключены во время этого кода. Обязательно включите их позже!
Программа обработки прерываний WDT Следующее, о чем нужно беспокоиться, - это обработка WRT ISR. Это сделано так:
MCU Sleep
Вместо того, чтобы переводить MCU в спящий режим внутри ISD WDT, я рекомендую просто включить спящий режим в конце ISR, а затем заставить MAIN-программу перевести MCU в спящий режим. Таким образом, программа фактически покидает ISR до того, как переходит в спящий режим, и она просыпается и возвращается обратно в WDT ISR.
источник
Согласно спецификации это возможно. Вы даже можете включить как прерывание, так и сброс. Если оба активированы, то первый тайм-аут сторожа вызовет прерывание, что приведет к сбросу бита разрешения прерывания (прерывание отключено). Следующий тайм-аут затем перезагрузит ваш процессор. Если вы включите прерывание непосредственно после его выполнения, следующий тайм-аут (снова) вызовет только прерывание.
Вы также можете просто включить прерывание и вообще не включать сброс. Вам придется устанавливать бит WDIE при каждом срабатывании прерывания.
источник
Это гораздо проще, чем предлагалось выше и в других местах.
Пока
WDTON
предохранитель не запрограммирован (он не запрограммирован по умолчанию), тогда вам нужно только ...Вот пример кода, который будет выполнять ISR один раз в 16 мс ...
Это действительно так. Поскольку мы никогда не включаем сброс сторожевого таймера, нам никогда не придется возиться с синхронизированными последовательностями, чтобы отключить его. Флаг прерывания сторожевого таймера автоматически очищается при вызове ISR.
Если вы хотите, чтобы период отличался от каждой 1 секунды, вы можете использовать эти значения здесь, чтобы установить соответствующие биты в
WDTCR
...Обратите внимание, что вам нужно выполнить синхронизированную последовательность, чтобы изменить время ожидания. Вот код, который устанавливает время ожидания в 1 секунду ...
источник