Как использовать сторожевой таймер в ATmega128

Я работаю с ATmega128, и мне нужно сбросить микроконтроллер через 10 секунд, а пользователь не взаимодействовал с микроконтроллером. Например, когда пользователь не нажимал ни одной клавиши на клавиатуре в течение 10 секунд, контроллер должен сбросить настройки.

Сторожевой таймер доступен в ATmega128, но я могу получить максимальную задержку в 2 секунды перед его сбросом. Но мне нужно 10 секунд.

Может быть, я могу сделать это с помощью таймеров, но я не знаю, как действовать дальше?

Даже я пробовал с файлом заголовка #include<avr/wdt.h> и использовал как: wdt_enable(WDTO_8S); wdt_reset(); Но не получил никакого ответа от этих функций. Я работаю в Linux AVR-GCC.
Вам действительно нужен сброс системы или вы можете просто перезапустить программу сверху?
Для таймеров - вот хороший туториал: avrfreaks.net/…
@JohnU: Спасибо за ваш ответ, и на самом деле в моем проекте я прошу пользователя ввести пароль, если он введет неправильный пароль, он будет в этом цикле только до тех пор, пока он не даст правильный пароль. Итак, что мне нужно, так это то, что если пользователь не ввел никаких данных в контроллер, он должен начинаться с верхней части программы.
Так почему бы просто не написать программу так, чтобы она это делала?
@JohnU: Да, я использовал метку и использовал «перейти» к этой конкретной метке. Но что мне нужно, так это то, что когда пользователь ничего не вводит, моя программа должна подождать от 5 до 10 секунд, а затем вернуться к началу программы. Если возможно, помогите с примером кода.
Проще всего использовать команду wait()... если ее нет (почти во всех языках она есть), ее легко создать, выполнив что-то вроде этого, который просто ведет обратный отсчет for(i=99999;i>0;){i--;}от большого числа. Обычно это считается плохим способом добавления задержек, поскольку он останавливает ЦП, делая что-либо еще, но это самый простой способ.
@JohnU: Я понял вашу точку зрения, но когда я добавляю эту задержку в основную программу, но во время этой задержки ожидания я не могу правильно читать клавиатуру.
Другая идея: запустите таймер, прежде чем принимать входные данные от пользователя, сбрасывать этот таймер каждый раз, когда пользователь что-то вводит... Если пользователь неактивен в течение заданного времени, таймер переполнится... Установите флаг в таймере, и если этот флаг установлен, выйдите из ваш цикл «Принять ввод»!
@sanju - то, что сказал Свананд, - правильная идея. Это довольно простые вещи, и использование сторожевого таймера не лучший способ сделать это. В нашей системе у нас есть аппаратный таймер с частотой 1 кГц, работающий на подпрограмме прерывания, это увеличивает значение «тиков», как часы. В нашем основном программном обеспечении, если мы хотим что-то сбросить через 10 секунд, мы сейчас запоминаем значение «тика», и когда будет еще 10 000 тиков, мы сбрасываем статус.
@Swanand: Да, это хорошая идея. Я постараюсь. Спасибо за идею.
@JohnU: Да, я попробую то же самое.

Ответы (2)

Вместо использования для этой цели сторожевого таймера

Запустите таймер, прежде чем принимать входные данные от пользователя, сбрасывайте этот таймер каждый раз, когда пользователь что-то вводит... Если пользователь неактивен в течение заданного времени, таймер переполнится... Установите флаг в таймере, и если этот флаг установлен, выйдите из вашего "Принять Введите "Цикл!

Также обратите внимание, что десять секунд — это долгое время, и может быть невозможно растянуть периферийное устройство аппаратного таймера так далеко, если вы можете заблокировать ценный таймер и не разрешить его использование для чего-либо еще. Периодическое прерывание таймера, скажем, на 1 секунду или меньше, и уменьшение некоторого обратного отсчета может быть более оптимальным способом.

Можно добиться того же. Используйте сторожевой таймер (т.е. внутренний или внешний). Если он внешний, вы должны проверить его таблицу данных и ответ в соответствии с ним. Внутренний сторожевой таймер должен быть установлен на 2 секунды, а затем сброшен в цикле более чем на 1 секунду. для этой же цели целесообразно использовать таймер. Просто отключайте сторожевой таймер каждую секунду и сбрасывайте сторожевой таймер после 5 раз.