Программный Reset

kholonkin
Offline
Зарегистрирован: 14.10.2013
avrdude -cstk500v1 -patmega328p -PCOM7 -e -b19200
avrdude -cstk500v1 -patmega328p -PCOM7 -b19200 -U lfuse:w:0xff:m -U hfuse:w:0xdf:m -U efuse:w:0x05:m
 
Залил скетч
#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);
}

Я просто релаьно уже не понимаю, почему оно не работатет, убрано ВСЕ... вообще все..... 

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

HWman пишет:

Почему его слова принимать так близко к сердцу, задорнов клоун и этим всё сказано, чего стоят его рассказы, сказки и всё, хоть и моментами забавные.

не, не - ты не съезжай, этот расовый полупидор мне сугубо не симпатичен своими расистскими типо шютками, поэтому его сравнение со мной расцениваю как оскорбление.

leshak
Offline
Зарегистрирован: 29.09.2011

А если вот так?

setup(){
 MCUSR = 0
 wdt_disable();
.....
}

 

kholonkin
Offline
Зарегистрирован: 14.10.2013

Млин... хоть фунфырь тебе засылай....

Заработал и на маленьком скетче и на большом...

А что это за волшебное заклинание? В каком месте я его не доглядел? Нигде не попадалось.....

leshak
Offline
Зарегистрирован: 29.09.2011

kholonkin пишет:

Млин... хоть фунфырь тебе засылай....

Не пью я... давно ;) Из идеологических соображений (не религиозных :)

А "не доглядел" как минимум в даташите на свой камушек...

http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega4...

страница 52

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();
}

 

Так, что если бы как все, просто взяли поменяли бутлоадер, то как все "давно бы улыбались". А раз пошли "своим путем", выкинули его вообще... следовательно нужно было разобраться как всю полезную работу бутлоадера делать "вручную".

 

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Взято на заметку. Спасибо, тоже позже поюзаю.

leshak
Offline
Зарегистрирован: 29.09.2011

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

Пофиксать его в runtime-ме.

Вот в такую сторону мысли крутятся:

Взять, предварительно естествено сохранив куда-нибудь себе переменную первые байты бутлоадера, и "переписать их", прямо в памяти. записать по адрессу бутлоадера, что-то типа "jmp MyBooHandler".

В это MyBootHandler, выполнить запрещение вачдога... востановить (из сохраненной переменной) оригинальный вид бутлоадера, и сделать jmp обратно на него.

Вообщем сделать injection/interceptor для бутлоадера. Что-бы, после сработки вачдога, была возможность выполнить СВОЙ код, до того как бутлоадер стартанет.

kholonkin
Offline
Зарегистрирован: 14.10.2013

Мне такой гамбит не осилить былоб.

как то больше по прикладному.

Maverik
Offline
Зарегистрирован: 12.09.2012

возникла еще простая мыслишка про хард резет с цифровых пинов.

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

Kлапаyций 99.99
Offline
Зарегистрирован: 11.10.2014

Maverik пишет:

возникла еще простая мыслишка про хард резет с цифровых пинов.

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

ага - и, подцепить вторую дуино, что бы контроллировала всю эту халабуду, когда она подвиснет и войдёт в вечный ресет. на вторую дуино подцепить третью, если вторая зависнет и не заметит смерти первой. за всем этим установить таджыка, что бы ломиком размыкал контакт, питающий ВСЁ.

***

— Охранники, дежурящие на крышах домов по Филигранной улице, сообщили, что никто не входил и не выходил, господин доктор.

— А кто следит за охранниками?

— Они следят друг за другом, господин доктор.

Maverik
Offline
Зарегистрирован: 12.09.2012

ну дык на месте стыка цифровых и аналоговых схем всегда может быть засада.  важно правильно рассчитать параметры элементов, тогда всё будет ок.

хотя я вообще склоняюсь к варианту watchdog + optiboot

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

leshak пишет:

А если вот так?

setup(){
 MCUSR = 0
 wdt_disable();
.....
}

Хочю сказать большое спосибо "leshak" за подсказанную конструкцию, каторая решила проблему "собаки " при заливке скетча через SPI ПРОГРАММАТОР, ( проблема и плата сответствует посту #61, #68), но проблема осталась при заливке через BOOTLOADER, может кто подскажет где взять BOOT корректно работающий с "собакой" (плата Pro-Mini, 328P, 5v, 16Мгц.)  

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

oleg_kazakof,  разделение на нано /промини/ уно -чисто символическое.  Бутлоадеры у них разные, но так повелось исторически, ради совместимости и дабы не было путаницы продолжают вливать старые буты в наны и промини. Любую плату можно прошить как УНО, выбираете в меню что у вас УНО, и заливайте загрузчик. Исключение только 8-мегагерцовые проминьки, для них нужно скомпилить специальный бут.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

dimax, спасибо за совет, залил в PRO-MINI (328p, 5v, 16мгц) стандартный бутлоадер от UNO R3 (который идет в комплекте срды IDE 1.6.6) и собака заработала корректно.

# немного не в тему.  В PRO-MINI на платке есть вход RAW - что это. Посмотрел принципиальную схему (правда нашол только PRO-MINI на 128 процессоре) подключен к 5-ти ногому чипчику (на моей плате S80E) и больше ни куда, сама S80E только к питанию???.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

oleg_kazakof, вход нестабилизированного питания 7..12 вольт, идёт к внутреннему стабилизатору напряжения.

n006
Offline
Зарегистрирован: 12.02.2015

Светаните схемку для программной перезагрузки с использованием RESET, транзистора, кондёра и т.п.

n006
Offline
Зарегистрирован: 12.02.2015

n006 пишет:

Светаните схемку для программной перезагрузки с использованием RESET, транзистора, кондёра и т.п.

 

Есть кто нибудь?

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

n006 пишет:

n006 пишет:

Светаните схемку для программной перезагрузки с использованием RESET, транзистора, кондёра и т.п.

 

Есть кто нибудь?

нет никого - подключи пин дуино к пину ресет и стреляй себе в голову, нафига тебе транзисторы и кондёры?

uragan
Offline
Зарегистрирован: 23.02.2015

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

araqel
Offline
Зарегистрирован: 12.08.2016

Поставил самую свежую на данный момент IDE ардуино, 1.6.10 Собаку не удается запускать

в шапке, как полагается, вставляю #include <avr/wdt.h>

в setup вставлен wdt_enable(WDTO_5S);

в loop соответственно - wdt_reset();

плата есть UNO. Компиляция выдает exit status 1

'WDTO_5S' was not declared in this scope
 
Как побороть эту хреновщину?
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

araqel пишет:

Как побороть эту хреновщину?

Не выдумывать несуществующих команд.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

araqel пишет:

Как побороть эту хреновщину?

Нужно открыть 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, ну и меньше в миллисекундах.

 

araqel
Offline
Зарегистрирован: 12.08.2016

Jeka_M пишет:

araqel пишет:

Как побороть эту хреновщину?

Нужно открыть 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, ну и меньше в миллисекундах.

 

Ты просто умница! Жму руку! Не доглядел, виноват...

Artemiy
Offline
Зарегистрирован: 20.10.2014

Вопрос у меня такой возник по поводу watchdog'а.

А что делать ,еслиу меня сенсор и он спит от 30 секунд до 2-х минут? Там как настроить собаку и будет ли оно работать?

Прописать WDTO_120S? ))

И считает ли он, если устройство спит, или просто в режиме ожидания команд висит?

Типа, если завис на 3 минуты - то не страшно. А если висит уже минут пять, то надо ребутать.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

Максимум 8 сек.  Перед этим  пробуждение сброс собаки и снова сон. Вроде так. Или собака на внешнем таймере.

 

Artemiy
Offline
Зарегистрирован: 20.10.2014

Во сне счетчик watchdog'а не идет?

А внешний таймер - это ресет к пину прижимать через другое устройство, или как?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

Вопрос по вочдогу:

Можно ли как то обойти максимальный период вочдога в 8 секунд?

скажем мне раз в 30 секунд нужно отвлекаться на вочдог и "продлевать" его..  а там всего 8секунд после чего он перезапустится.

Logik
Offline
Зарегистрирован: 05.08.2014

Это чем же так надо загрузится, чтоб за 8 секунд не найти пол микросекунды на вачдог?! 8)

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

скажем так - "нельзя отвлекаться...", есть такой процесс..

в связи с эти вопрос - можно ли обойти эти 8 сек, или выход - только внешний 555 таймер или подобное?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Short Circuit пишет:

Можно ли как то обойти максимальный период вочдога в 8 секунд?

Нет, это аппаратное ограничиение. Связано с максимально возможным прескалером 1024K (1048576) cycles для тактовой 128КГц.

Modsley
Offline
Зарегистрирован: 14.01.2018

Уважаемые, фигню спрошу, но спрошу всё же. 

А нельзя ли как-то программно сбросить ардуину после загрузки, но только один раз?

Т.е. включили питание, загрузились, сбросили, всё, дальше работаем. 

Мистика, но датчик заводится только так. 

Включачем - не работает. 

Включаем, жмём на кнопку сброса - работает. 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

можно , но тогда в ЕЕPROM надо писать 1 или 0 в зависимости от того это первый запуск или второй перезапуск ;)

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

qwone пишет:

 тогда в ЕЕPROM надо писать 1 или 0 в зависимости от того это первый запуск или второй перезапуск ;)

Зачем? Работает датчик - хорошо, не работает - перегружаемся. Можно, конечно, только лучше бы найти причину глюка и устранить, чем костыли ставить.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Modsley пишет:

Уважаемые, фигню спрошу, но спрошу всё же. 

А нельзя ли как-то программно сбросить ардуину после загрузки, но только один раз?

Т.е. включили питание, загрузились, сбросили, всё, дальше работаем. 

Мистика, но датчик заводится только так. 

Включачем - не работает. 

Включаем, жмём на кнопку сброса - работает. 

 

Вы предлагаете заведомо неверное (и, строго говоря, нереализуемое) решение.

На самом деле, если глючит датчик, то и сбрасывать нужно датчик, а не контроллер.

sadman41
Offline
Зарегистрирован: 19.10.2016

Что за датчик, кстати?

Modsley
Offline
Зарегистрирован: 14.01.2018

Да вполне обычный MPU6050. 

Мистика...

sadman41
Offline
Зарегистрирован: 19.10.2016

С W5100 помогал delay в setup чтобы придержать МК, пока сетевой чип расчухивается после подачи питания. Но в вашем случае... у меня где-то 6050 лежит и я нне помню, чтобы он через раз инитился.