#include <avr/wdt.h>
void setup() {
wdt_disable();
// put your setup code here, to run once:
digitalWrite(13,1);
delay(3000);
wdt_enable(WDTO_4S);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(13,0);
delay(1000);
digitalWrite(13,1);
delay(500);
}
Я просто релаьно уже не понимаю, почему оно не работатет, убрано ВСЕ... вообще все.....
Почему его слова принимать так близко к сердцу, задорнов клоун и этим всё сказано, чего стоят его рассказы, сказки и всё, хоть и моментами забавные.
не, не - ты не съезжай, этот расовый полупидор мне сугубо не симпатичен своими расистскими типо шютками, поэтому его сравнение со мной расцениваю как оскорбление.
Note: If the Watchdog is accidentally enabled, for example by a runaway pointer or brown-out condition, the device
will be reset and the Watchdog Timer will stay enabled. If the code is not set up to handle the Watchdog, this might
lead to an eternal loop of time-out resets. To avoid this situation, the application software should always clear the
Watchdog System Reset Flag (WDRF) and the WDE control bit in the initialization routine, even if the Watchdog is
not in use.
Правда вообщем хватило-бы, наверное и один бит сбросить, но сбрасывать, так сбрасывать, так что тупо обнулили все регистр MCUSR, не вникая в тонкости его битов :)
А если вникнуть (сохранить его куда-нибудь в переменную перед тем как обнулить), то глядя внимательно на него и медитирую над даташитом, можно потом, после того как вырубили собаку, отличить ситуацию "мы включились по питанию, или это был ресет по вачдогу... (в лог там записать, типа "был аварийный ребут").
А вообще, моя цепочка поиска была примерно такой:
гугланул "atmega328 max watchdog timeout" (че-то закралось сомнение, что на всех камнях одинаковую длительность вачдога можно поставить). Первая ссылка там была вот эта
где прочитал, вообщем-то уже известную инфу о том что старые камни при ресете сами вырубали собаку, а новые оставляют как есть. И этим должен заниматься бутлоадер (или сам, если уж бутлоадер вырубил).
Там же попался на глаза пример с вырубанием вачтога, в котором присутсвует сброс флага...
На всяк случай, гугланул код первого попавшегося бутлоадера современного (раз мы взяли на себя его работу, логчино посмотреть как это там делается?)
/* Check the reason for the reset so we can act accordingly */
uint8_t mcusr_state = MCUSR; // store the initial state of the Status register
MCUSR = 0; // clear all reset flags
/* Watchdog may be configured with a 15 ms period so must disable it before going any further */
wdt_disable();
Ну и в даташит заглянул, уже специально на 328-камень. гугланул... как ни странном там тоже пример правильного вырубания имеется (страница 52)
void WDT_off(void)
{
__disable_interrupt();
__watchdog_reset();
/* Clear WDRF in MCUSR */
MCUSR &= ~(1<<WDRF);
/* Write logical one to WDCE and WDE */
/* Keep old prescaler setting to prevent unintentional time-out */
WDTCSR |= (1<<WDCE) | (1<<WDE);
/* Turn off WDT */
WDTCSR = 0x00;
__enable_interrupt();
}
Так, что если бы как все, просто взяли поменяли бутлоадер, то как все "давно бы улыбались". А раз пошли "своим путем", выкинули его вообще... следовательно нужно было разобраться как всю полезную работу бутлоадера делать "вручную".
Меня теперь другое "муляет". А можно ли, все-таки, не меняю фюзы и не перешивая пофиксаный бутлоадер добится того же эффекта?
Пофиксать его в runtime-ме.
Вот в такую сторону мысли крутятся:
Взять, предварительно естествено сохранив куда-нибудь себе переменную первые байты бутлоадера, и "переписать их", прямо в памяти. записать по адрессу бутлоадера, что-то типа "jmp MyBooHandler".
В это MyBootHandler, выполнить запрещение вачдога... востановить (из сохраненной переменной) оригинальный вид бутлоадера, и сделать jmp обратно на него.
Вообщем сделать injection/interceptor для бутлоадера. Что-бы, после сработки вачдога, была возможность выполнить СВОЙ код, до того как бутлоадер стартанет.
возникла еще простая мыслишка про хард резет с цифровых пинов.
заряжаем конденсатор с цифрового пина, затем другим цифровым пином открываем базу транзистора для прохода тока с нулевой ноги конденсатора на пин резет. еще, на случай если время работы второго пина окажется недостаточным, можно организовать небольшую положительную обратную связь для поддержания тока базы зарядом конденсатора, пока он разряжается на резет.
возникла еще простая мыслишка про хард резет с цифровых пинов.
заряжаем конденсатор с цифрового пина, затем другим цифровым пином открываем базу транзистора для прохода тока с нулевой ноги конденсатора на пин резет. еще, на случай если время работы второго пина окажется недостаточным, можно организовать небольшую положительную обратную связь для поддержания тока базы зарядом конденсатора, пока он разряжается на резет.
ага - и, подцепить вторую дуино, что бы контроллировала всю эту халабуду, когда она подвиснет и войдёт в вечный ресет. на вторую дуино подцепить третью, если вторая зависнет и не заметит смерти первой. за всем этим установить таджыка, что бы ломиком размыкал контакт, питающий ВСЁ.
***
— Охранники, дежурящие на крышах домов по Филигранной улице, сообщили, что никто не входил и не выходил, господин доктор.
Хочю сказать большое спосибо "leshak" за подсказанную конструкцию, каторая решила проблему "собаки " при заливке скетча через SPI ПРОГРАММАТОР, ( проблема и плата сответствует посту #61, #68), но проблема осталась при заливке через BOOTLOADER, может кто подскажет где взять BOOT корректно работающий с "собакой" (плата Pro-Mini, 328P, 5v, 16Мгц.)
oleg_kazakof, разделение на нано /промини/ уно -чисто символическое. Бутлоадеры у них разные, но так повелось исторически, ради совместимости и дабы не было путаницы продолжают вливать старые буты в наны и промини. Любую плату можно прошить как УНО, выбираете в меню что у вас УНО, и заливайте загрузчик. Исключение только 8-мегагерцовые проминьки, для них нужно скомпилить специальный бут.
dimax, спасибо за совет, залил в PRO-MINI (328p, 5v, 16мгц) стандартный бутлоадер от UNO R3 (который идет в комплекте срды IDE 1.6.6) и собака заработала корректно.
# немного не в тему. В PRO-MINI на платке есть вход RAW - что это. Посмотрел принципиальную схему (правда нашол только PRO-MINI на 128 процессоре) подключен к 5-ти ногому чипчику (на моей плате S80E) и больше ни куда, сама S80E только к питанию???.
Для начинающих. Если контроллер из коробки, то для работы сторожевого таймера его также нужно предварительно настроить, как показано выше. В случае без использования загрузчика.
Нужно открыть wdt.h и убедиться, что там нет WDTO_5S. В комментариях там написано: "Possible timeout values are: 15 ms, 30 ms, 60 ms, 120 ms, 250 ms, 500 ms, 1 s, 2 s. (Some devices also allow for 4 s and 8 s.)" Поэтому есть такие варианты: WDTO_1S, WDTO_2S, WDTO_4S, WDTO_8S, ну и меньше в миллисекундах.
Нужно открыть wdt.h и убедиться, что там нет WDTO_5S. В комментариях там написано: "Possible timeout values are: 15 ms, 30 ms, 60 ms, 120 ms, 250 ms, 500 ms, 1 s, 2 s. (Some devices also allow for 4 s and 8 s.)" Поэтому есть такие варианты: WDTO_1S, WDTO_2S, WDTO_4S, WDTO_8S, ну и меньше в миллисекундах.
Ты просто умница! Жму руку! Не доглядел, виноват...
С W5100 помогал delay в setup чтобы придержать МК, пока сетевой чип расчухивается после подачи питания. Но в вашем случае... у меня где-то 6050 лежит и я нне помню, чтобы он через раз инитился.
Я просто релаьно уже не понимаю, почему оно не работатет, убрано ВСЕ... вообще все.....
Почему его слова принимать так близко к сердцу, задорнов клоун и этим всё сказано, чего стоят его рассказы, сказки и всё, хоть и моментами забавные.
не, не - ты не съезжай, этот расовый полупидор мне сугубо не симпатичен своими расистскими типо шютками, поэтому его сравнение со мной расцениваю как оскорбление.
А если вот так?
Млин... хоть фунфырь тебе засылай....
Заработал и на маленьком скетче и на большом...
А что это за волшебное заклинание? В каком месте я его не доглядел? Нигде не попадалось.....
Млин... хоть фунфырь тебе засылай....
Не пью я... давно ;) Из идеологических соображений (не религиозных :)
А "не доглядел" как минимум в даташите на свой камушек...
http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega4...
страница 52
Ну и в даташит заглянул, уже специально на 328-камень. гугланул... как ни странном там тоже пример правильного вырубания имеется (страница 52)
Так, что если бы как все, просто взяли поменяли бутлоадер, то как все "давно бы улыбались". А раз пошли "своим путем", выкинули его вообще... следовательно нужно было разобраться как всю полезную работу бутлоадера делать "вручную".
Взято на заметку. Спасибо, тоже позже поюзаю.
Меня теперь другое "муляет". А можно ли, все-таки, не меняю фюзы и не перешивая пофиксаный бутлоадер добится того же эффекта?
Пофиксать его в runtime-ме.
Вот в такую сторону мысли крутятся:
Взять, предварительно естествено сохранив куда-нибудь себе переменную первые байты бутлоадера, и "переписать их", прямо в памяти. записать по адрессу бутлоадера, что-то типа "jmp MyBooHandler".
В это MyBootHandler, выполнить запрещение вачдога... востановить (из сохраненной переменной) оригинальный вид бутлоадера, и сделать jmp обратно на него.
Вообщем сделать injection/interceptor для бутлоадера. Что-бы, после сработки вачдога, была возможность выполнить СВОЙ код, до того как бутлоадер стартанет.
Мне такой гамбит не осилить былоб.
как то больше по прикладному.
возникла еще простая мыслишка про хард резет с цифровых пинов.
заряжаем конденсатор с цифрового пина, затем другим цифровым пином открываем базу транзистора для прохода тока с нулевой ноги конденсатора на пин резет. еще, на случай если время работы второго пина окажется недостаточным, можно организовать небольшую положительную обратную связь для поддержания тока базы зарядом конденсатора, пока он разряжается на резет.
возникла еще простая мыслишка про хард резет с цифровых пинов.
заряжаем конденсатор с цифрового пина, затем другим цифровым пином открываем базу транзистора для прохода тока с нулевой ноги конденсатора на пин резет. еще, на случай если время работы второго пина окажется недостаточным, можно организовать небольшую положительную обратную связь для поддержания тока базы зарядом конденсатора, пока он разряжается на резет.
ага - и, подцепить вторую дуино, что бы контроллировала всю эту халабуду, когда она подвиснет и войдёт в вечный ресет. на вторую дуино подцепить третью, если вторая зависнет и не заметит смерти первой. за всем этим установить таджыка, что бы ломиком размыкал контакт, питающий ВСЁ.
***
— Охранники, дежурящие на крышах домов по Филигранной улице, сообщили, что никто не входил и не выходил, господин доктор.
— А кто следит за охранниками?
— Они следят друг за другом, господин доктор.
ну дык на месте стыка цифровых и аналоговых схем всегда может быть засада. важно правильно рассчитать параметры элементов, тогда всё будет ок.
хотя я вообще склоняюсь к варианту watchdog + optiboot
А если вот так?
Хочю сказать большое спосибо "leshak" за подсказанную конструкцию, каторая решила проблему "собаки " при заливке скетча через SPI ПРОГРАММАТОР, ( проблема и плата сответствует посту #61, #68), но проблема осталась при заливке через BOOTLOADER, может кто подскажет где взять BOOT корректно работающий с "собакой" (плата Pro-Mini, 328P, 5v, 16Мгц.)
oleg_kazakof, разделение на нано /промини/ уно -чисто символическое. Бутлоадеры у них разные, но так повелось исторически, ради совместимости и дабы не было путаницы продолжают вливать старые буты в наны и промини. Любую плату можно прошить как УНО, выбираете в меню что у вас УНО, и заливайте загрузчик. Исключение только 8-мегагерцовые проминьки, для них нужно скомпилить специальный бут.
dimax, спасибо за совет, залил в PRO-MINI (328p, 5v, 16мгц) стандартный бутлоадер от UNO R3 (который идет в комплекте срды IDE 1.6.6) и собака заработала корректно.
# немного не в тему. В PRO-MINI на платке есть вход RAW - что это. Посмотрел принципиальную схему (правда нашол только PRO-MINI на 128 процессоре) подключен к 5-ти ногому чипчику (на моей плате S80E) и больше ни куда, сама S80E только к питанию???.
oleg_kazakof, вход нестабилизированного питания 7..12 вольт, идёт к внутреннему стабилизатору напряжения.
Светаните схемку для программной перезагрузки с использованием RESET, транзистора, кондёра и т.п.
Светаните схемку для программной перезагрузки с использованием RESET, транзистора, кондёра и т.п.
Есть кто нибудь?
Светаните схемку для программной перезагрузки с использованием RESET, транзистора, кондёра и т.п.
Есть кто нибудь?
нет никого - подключи пин дуино к пину ресет и стреляй себе в голову, нафига тебе транзисторы и кондёры?
Для начинающих. Если контроллер из коробки, то для работы сторожевого таймера его также нужно предварительно настроить, как показано выше. В случае без использования загрузчика.
Поставил самую свежую на данный момент IDE ардуино, 1.6.10 Собаку не удается запускать
в шапке, как полагается, вставляю #include <avr/wdt.h>
в setup вставлен wdt_enable(WDTO_5S);
в loop соответственно - wdt_reset();
плата есть UNO. Компиляция выдает exit status 1
Не выдумывать несуществующих команд.
Как побороть эту хреновщину?
Нужно открыть wdt.h и убедиться, что там нет WDTO_5S. В комментариях там написано: "Possible timeout values are: 15 ms, 30 ms, 60 ms, 120 ms, 250 ms, 500 ms, 1 s, 2 s. (Some devices also allow for 4 s and 8 s.)" Поэтому есть такие варианты: WDTO_1S, WDTO_2S, WDTO_4S, WDTO_8S, ну и меньше в миллисекундах.
Как побороть эту хреновщину?
Нужно открыть wdt.h и убедиться, что там нет WDTO_5S. В комментариях там написано: "Possible timeout values are: 15 ms, 30 ms, 60 ms, 120 ms, 250 ms, 500 ms, 1 s, 2 s. (Some devices also allow for 4 s and 8 s.)" Поэтому есть такие варианты: WDTO_1S, WDTO_2S, WDTO_4S, WDTO_8S, ну и меньше в миллисекундах.
Ты просто умница! Жму руку! Не доглядел, виноват...
Вопрос у меня такой возник по поводу watchdog'а.
А что делать ,еслиу меня сенсор и он спит от 30 секунд до 2-х минут? Там как настроить собаку и будет ли оно работать?
Прописать WDTO_120S? ))
И считает ли он, если устройство спит, или просто в режиме ожидания команд висит?
Типа, если завис на 3 минуты - то не страшно. А если висит уже минут пять, то надо ребутать.
Максимум 8 сек. Перед этим пробуждение сброс собаки и снова сон. Вроде так. Или собака на внешнем таймере.
Во сне счетчик watchdog'а не идет?
А внешний таймер - это ресет к пину прижимать через другое устройство, или как?
Вопрос по вочдогу:
Можно ли как то обойти максимальный период вочдога в 8 секунд?
скажем мне раз в 30 секунд нужно отвлекаться на вочдог и "продлевать" его.. а там всего 8секунд после чего он перезапустится.
Это чем же так надо загрузится, чтоб за 8 секунд не найти пол микросекунды на вачдог?! 8)
скажем так - "нельзя отвлекаться...", есть такой процесс..
в связи с эти вопрос - можно ли обойти эти 8 сек, или выход - только внешний 555 таймер или подобное?
Можно ли как то обойти максимальный период вочдога в 8 секунд?
Нет, это аппаратное ограничиение. Связано с максимально возможным прескалером 1024K (1048576) cycles для тактовой 128КГц.
Уважаемые, фигню спрошу, но спрошу всё же.
А нельзя ли как-то программно сбросить ардуину после загрузки, но только один раз?
Т.е. включили питание, загрузились, сбросили, всё, дальше работаем.
Мистика, но датчик заводится только так.
Включачем - не работает.
Включаем, жмём на кнопку сброса - работает.
можно , но тогда в ЕЕPROM надо писать 1 или 0 в зависимости от того это первый запуск или второй перезапуск ;)
тогда в ЕЕPROM надо писать 1 или 0 в зависимости от того это первый запуск или второй перезапуск ;)
Зачем? Работает датчик - хорошо, не работает - перегружаемся. Можно, конечно, только лучше бы найти причину глюка и устранить, чем костыли ставить.
Уважаемые, фигню спрошу, но спрошу всё же.
А нельзя ли как-то программно сбросить ардуину после загрузки, но только один раз?
Т.е. включили питание, загрузились, сбросили, всё, дальше работаем.
Мистика, но датчик заводится только так.
Включачем - не работает.
Включаем, жмём на кнопку сброса - работает.
Вы предлагаете заведомо неверное (и, строго говоря, нереализуемое) решение.
На самом деле, если глючит датчик, то и сбрасывать нужно датчик, а не контроллер.
Что за датчик, кстати?
Да вполне обычный MPU6050.
Мистика...
С W5100 помогал delay в setup чтобы придержать МК, пока сетевой чип расчухивается после подачи питания. Но в вашем случае... у меня где-то 6050 лежит и я нне помню, чтобы он через раз инитился.