Watchdog более 30 сек на ATMEGA328P-AU

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

Здравствуйте, имеется arduino uno на ATMEGA328P-AU, а также код где при нажатии включается нагрузка несколько раз по ~5 сек с перерывом в ~2 сек итого старндартный Watchdog с его максимальным значением 10 сек начинает ребутить железку, подскажиите пожалуйста как увеличить время Watchdogа?

int _PWDC = 0;

int buttonPinE = 9;



void releEv(){
  for (int i=0; i<3; i++)
{
digitalWrite(12, 1); //on
delay(5000);
digitalWrite(12, 0); //off
delay(2000);
}
}



void setup()
{
TCCR2A = 0x00;
TCCR2B =  0x07;
TIMSK2=0x01;
TCNT2=100;

pinMode(buttonPinE, INPUT_PULLUP); 
}




void  loop(){
{_PWDC = 0;


if( digitalRead(buttonPinE) == 1 ){
delay(10);
releEv();
}
}
}
ISR(TIMER2_OVF_vect)
{ TCNT2=100;
if(_PWDC >= 1000){asm volatile ("jmp 0x0000");}else{_PWDC = _PWDC+1;};   // 10 сек
}

 

b707
Offline
Зарегистрирован: 26.05.2017

kpik пишет:

подскажиите пожалуйста как увеличить время Watchdogа?

Никак. И в этом нет необходимости.

Вместо этого нужно переписать код так, чтобы в нем не было delay(5000)

 

Кстати - а что это у вас в коде за таймеры? Уж не самодельный ли ватчдог? Удаление гланд через... ?

Штатный ватчдог на Атмеге328 делается в три строки:

#include <avr/wdt.h> 
void setup() {
 wdt_enable (WDTO_8S);
};

void loop() {
   wdt_reset(); 
....
.....
}

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Тут правильнее спросить "Как избавиться от delay?" тогда и ватчдог трогать не придется.

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

b707 пишет:

ЗЫ - а что это у вас в коде за таймеры? Уж не самодельный ли ватчдог? Удаление гланд через... ?

Вы как всегда правы :) FlProg его лепит

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Либо делать собаку двухступенчатым

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

Либо делать собаку двухступенчатым

Деда, посмотри исходник! - зачем тут двухступенчатый ватчдог? :))))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

В этом коде - не нужен. Но вопрос то стоял...

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

b707 пишет:

Вместо этого нужно переписать код так, чтобы в нем не было delay(5000)

Подскажите пожалуйста чем его можно заменить?

b707
Offline
Зарегистрирован: 26.05.2017

kpik пишет:

Подскажите пожалуйста чем его можно заменить?

изучайте BlinkWithoutDelay

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

В этом коде - не нужен. Но вопрос то стоял...

ну, кстати, у ТС в коде как раз двухступенчатый ватчдог. И 10 секунд, там, к слову. далеко не максимум :) Только, сдается мне, что это не ватчдог вовсе, а фигня.  Если МК зависнет - этот ватчдог зависнет вместе с ним.

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

b707 пишет:

ну, кстати, у ТС в коде как раз двухступенчатый ватчдог. И 10 секунд, там, к слову. далеко не максимум :) Только, сдается мне, что это не ватчдог вовсе, а фигня.  Если МК зависнет - этот ватчдог зависнет вместе с ним.

На практике так и есть...2 раза за сутки стабильно)

b707
Offline
Зарегистрирован: 26.05.2017

kpik пишет:

На практике так и есть...2 раза за сутки стабильно)

в строке 44 в условии сравнения вместо 1000 можете поставить любое число вплоть до 32767 - задержка вашего "ватчдога" вырастет в соответсвующее число раз. Если 1000 соответсвует 10 сек(лень проверять, так ли это) - значит максимум вашей "собаки" около 327 сек, то есть 5.5 минут.

Но код все равно будет подвисать, потому что это не настоящий ватчдог. Правильнее - переписать код, чтобы loop() укладывался хотя бы в пару секунд, чтобы использовать штатную "собаку". У штатного ватчдога максимум - 8сек.

bwn
Offline
Зарегистрирован: 25.08.2014

b707 пишет:

Правильнее - переписать код, чтобы loop() укладывался хотя бы в пару секунд,

Фрикассе себе, это что же в него без делеев напихать надо?)))) 
А за неделю сможешь? Не, один не смогу, тут помошники нужны.(с))))))

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

Как измерить емкость Ардуины в попугаях  в delay-ях? Надо напихать ровно столько delay-ев , и это будет емкость Ардуины.

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

b707 пишет:

изучайте BlinkWithoutDelay

 

Подскажите пожалуйста, я правильно все сделал/переделал?

#include <avr/wdt.h> 

int buttonPinE = 9;

void releEv(){
  for (int i=0; i<3; i++)
{
digitalWrite(12, 1); //on
pauze(5000);
digitalWrite(12, 0); //off
pauze(2000);
}
}


void setup()
{
wdt_enable (WDTO_8S);

pinMode(buttonPinE, INPUT_PULLUP); 
}


void  loop(){
wdt_reset();

if( digitalRead(buttonPinE) == 1 ){
pauze(50);
releEv();
}
}
}



void pauze(long intrval)
{
  unsigned long pre = millis();
  wail(milis() - pre < intrval);
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
void pauze(long intrval)
37 {
38   unsigned long pre = millis();
39   wail(milis() - pre < intrval);
40

}

ничем не лучше delay(). тока еще и while непраильна написан. 

b707
Offline
Зарегистрирован: 26.05.2017

kpik пишет:

Подскажите пожалуйста, я правильно все сделал/переделал?

Неправильно.

DetSimen уже написал - этот код полностью аналогичен delay - точно так же зависает на одном месте на 5 сек.

Вам нужно сделать отдельную процедуру для digitalWrite(12, ON) и отдельную для OFF. Вошли в первую процедуру, включили нагрузку - и передали управление loop-у на 5 секунд. Секунды прошли - вошли в процедуру для OFF и выключили нагрузку. И все это столько раз, сколько у вас было в цикле for

bwn
Offline
Зарегистрирован: 25.08.2014

bwn пишет:

b707 пишет:

Правильнее - переписать код, чтобы loop() укладывался хотя бы в пару секунд,

Фрикассе себе, это что же в него без делеев напихать надо?)))) 

Зря вы так на ТС, задачу он решил.))))

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

Ну а почему вот так нельзя?

 

#include <avr/wdt.h> 

int buttonPinE = 9;

void releEv(){
  for (int i=0; i<3; i++)
{
digitalWrite(12, 1);
delay(5000);
digitalWrite(12, 0);
delay(2000);
loop();   // спасаем от зависания
}
}


void setup()
{
wdt_enable (WDTO_8S);

pinMode(buttonPinE, INPUT_PULLUP); 
}


void  loop(){
wdt_reset();

if( digitalRead(buttonPinE) == 1 ){
pauze(50);
releEv();
}
}
}

тоесть в функцию которая выполняется при нажатии и длительность общая 22 сек вставить обратиться к loop() итого общее время будет не 22 сек, а 7 сек?

CheS_66
CheS_66 аватар
Offline
Зарегистрирован: 08.02.2017

b707 пишет:

Штатный ватчдог на Атмеге328 делается в три строки:



#include <avr/wdt.h> 
void setup() { wdt_enable (WDTO_8S); };
void loop() {
   wdt_reset(); 
....
.....
}

Оффтоп конечно, но спрошу.

Тут мы его инициализируем - 

#include <avr/wdt.h> 

void setup() {
 wdt_enable (WDTO_8S);
};

А тут сбрасываем его в каждом цикле -

void loop() {
   wdt_reset(); 
....
.....
}

Я правильно понял? Где-бы поподробнее про него почитать. Пока вроде не нужен, но вдруг пригодится)))

bwn
Offline
Зарегистрирован: 25.08.2014

Истинно, для малых интервалов на время отладки wdt.disable(). А то залезет в вечный перезагруз и будешь резетом скетч отлавливать.

b707
Offline
Зарегистрирован: 26.05.2017

bwn пишет:

Истинно, для малых интервалов на время отладки wdt.disable(). А то залезет в вечный перезагруз и будешь резетом скетч отлавливать.

чтобы не отлавливать, в начале setup кроме wdt.disable() вставить delay секунд на 10

b707
Offline
Зарегистрирован: 26.05.2017

kpik пишет:

в функцию которая выполняется при нажатии и длительность общая 22 сек вставить обратиться к loop() итого общее время будет не 22 сек, а 7 сек?

тогда уж вставьте там не loop(). а wdt_reset();, хотя это все равно костыль.

Повторяю - любую программу с любыми задержками можно переписать так, чтобы loop() оборачивался как минимум за 1-2 секунды. Причем посмотрите - когда я пишу "1-2 секунды" - и то надо мной все смеются, потому что вообще-то нормальные программы делают полный цикл loop за доли миллисекунд.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

kpik пишет:

Здравствуйте, имеется arduino uno на ATMEGA328P-AU, а также код где при нажатии включается нагрузка несколько раз по ~5 сек с перерывом в ~2 сек 

Может ТАК 


#define buttonPinE 9
#define led1 12
uint16_t pauze ; //2000
uint32_t milisin;
bool f_kn1;
uint16_t iter = 3;
bool shag;

void setup()
{
  pinMode(led1, OUTPUT);
  pinMode(buttonPinE, INPUT_PULLUP);
}


void  loop() {
  if (!digitalRead(buttonPinE) && !f_kn1) {
    f_kn1 = 1;
  }
  if (f_kn1 && iter)
  {
    if (millis() - milisin >= pauze)
    {
      milisin = millis();
      switch (shag) {
        case 0:
          digitalWrite(led1, HIGH );
          pauze = 5000;
          shag = 1;
          break;
        case 1:
	 --iter;
          digitalWrite(led1, LOW);
          pauze = 2000;
          shag = 0;
          break;
      }
    }
  }
  else {
    f_kn1 = 0;
    iter = 3;
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

vosara пишет:

Может ТАК

 

поздравляю с вступлением в клуб "тех, кого крик развел на код" :)

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

b707 пишет:

vosara пишет:

Может ТАК

 

поздравляю с вступлением в клуб "тех, кого крик развел на код" :)

 

СПАСИБО!!! Я старался.

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

Та нормально. Вы же не оскудели от этого, что написали код. Считайте это тренировкой "программистких мускул". А вот если эти "мускулы" ослабнут, тяжело будет браться за серьезный проект.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

 

Я конечно понимаю, что делай на 5 секунд это моветон, но т.к. собака на 8 секунд, то что мешает после таких делаев просто сбрасывать собаку?

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

KVadik пишет:
Я конечно понимаю, что делай на 5 секунд это моветон, но т.к. собака на 8 секунд, то что мешает после таких делаев просто сбрасывать собаку?

Нет вы не понимаете. Вот вам , к примеру, хватает на жизнь 500 рублей , что бы жить на подсосе. И вот вы начали получать 2000 рублей зарплаты. Но 1500 рублей  у вас принудительно забирают. Что для вас изменилось. Так любые delay это вы изымаете из процессора в пустую. Watchdog это экономия энергии. А если вы энергию не экономите, то Watchdog принимать бесмысленно.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

qwone пишет:

Нет вы не понимаете. Вот вам , к примеру, хватает на жизнь 500 рублей , что бы жить на подсосе. И вот вы начали получать 2000 рублей зарплаты. Но 1500 рублей  у вас принудительно забирают. Что для вас изменилось. Так любые delay это вы изымаете из процессора в пустую. Watchdog это экономия энергии. А если вы энергию не экономите, то Watchdog принимать бесмысленно.

тс, я так понимаю, не электричество экономить хотел, а перегрузку при зависаниях

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

KVadik пишет:

тс, я так понимаю, не электричество экономить хотел, а перегрузку при зависаниях

так, это лечится не перезагрузкой, а физической ликвидацией пейсателя кода, который зависает.

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

KVadik пишет:
тс, я так понимаю, не электричество экономить хотел, а перегрузку при зависаниях
Код зависает не потому что в коде Watchdog отсутсвует, потому что это зависание запрограммировано кривым программированием. Так что мой вам совет.Учитесь правильно писать программы и отлаживать. Но перед тем как писать, надо сначало проектировать программу. И не хватайтесь за Watchdog. Это не то.

 

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

qwone пишет:

Код зависает не потому что в коде Watchdog отсутсвует, потому что это зависание запрограммировано кривым программированием. Так что мой вам совет.Учитесь правильно писать программы и отлаживать. Но перед тем как писать, надо сначало проектировать программу. И не хватайтесь за Watchdog. Это не то.

Программирование в среде ардуино кривое по определению.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

KVadik, чем же кривое программирование на arduino? Чем оно отличается например от программирования в глобальном смысле от x86 процессоров в защищённом режиме?

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

KVadik пишет:

Программирование в среде ардуино кривое по определению.

ты как-то оперделись - тебе не нравится способ программирования или ты пишешь код, который загоняется в зависания.

лично мне интересны примеры, что сцуко может зависнуть в среде ардуино?

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

andycat пишет:
KVadik, чем же кривое программирование на arduino? Чем оно отличается например от программирования в глобальном смысле от x86 процессоров в защищённом режиме?

гм, это как сравнивать жидкое с зеленым

 

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

KVadik пишет:

гм, это как сравнивать жидкое с зеленым

ты примеры зависающего по причине кривости среды будешь выкладывать или будешь в своём гавне ковыряться?

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

KVadik пишет:
Программирование в среде ардуино кривое по определению.
Здесь вы не правы. На ардуине можно вполне нормально программировать , но новичкам это не под силу. 

ПС: Посмотрите это http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov

И это так легкий пробег. Там есть Менеджер задач. Так развитие этого направления вообще бомба.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

qwone пишет:

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

ПС: Посмотрите это http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov

И это так легкий пробег. Там есть Менеджер задач. Так развитие этого направления вообще бомба.

Возможно я не так высказался. Ардуино любительская среда, так сказать, микроконтроллеры для чайников. Можно писать "красиво" и "правильно" в любой среде. Но ардуино изначально детская игрушка, не расчитанная на серьезные задачи. Она бесплатна, поддерживает различное оборудование, все желающие пишут для неё свои библиотеки и т.д. Все это дает возможность быстро решать многие задачи, даже обладая весьма скромными и смутными познаниями в микроконтроллерах и программировании. Но при этом программа задачу решает, стоит дешево, но может быть достаточно "кривой" и иногда зависать. Я уже не говорю про дешевое китайское железо, которое обычно используют любители, из-за которого тоже возможны подвисания. Собака же вполне спасает от таких зависаний. 

b707
Offline
Зарегистрирован: 26.05.2017

KVadik пишет:

Возможно я не так высказался. Ардуино любительская среда, так сказать, микроконтроллеры для чайников. Можно писать "красиво" и "правильно" в любой среде. Но ардуино изначально детская игрушка, не расчитанная на серьезные задачи. Она бесплатна, поддерживает различное оборудование, все желающие пишут для неё свои библиотеки и т.д. Все это дает возможность быстро решать многие задачи, даже обладая весьма скромными и смутными познаниями в микроконтроллерах и программировании. Но при этом программа задачу решает, стоит дешево, но может быть достаточно "кривой" и иногда зависать. Я уже не говорю про дешевое китайское железо, которое обычно используют любители, из-за которого тоже возможны подвисания. Собака же вполне спасает от таких зависаний. 

набор общих слов, из которых совершенно очевидно одно - ты не в теме, бро :)-  верятно, ни под "детскую" ардуино, ни под другие МК ("взрослые"? :)никогда ничего не писал

arduinec
Offline
Зарегистрирован: 01.09.2015

KVadik пишет:

Программирование в среде ардуино кривое по определению.

Криворукость программирования зависит от исполнителя, а не от среды и микроконтроллера.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

arduinec пишет:

Криворукость программирования зависит от исполнителя, а не от среды и микроконтроллера.

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

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

KVadik пишет:

arduinec пишет:

Криворукость программирования зависит от исполнителя, а не от среды и микроконтроллера.

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

Какое интересное мнение.... Посмотрел бы я на криворукость под какой нибудь банальный Z80, вы сами то верите в то что пишите? Если уж под ардуино не в состоянии писать код - это полный пипец :(

P. S. Кстати о loop цикле: в текущим проекте добился 300 мс - все равно плохо - при низком уровне внешнего освещения мерцание дисплея :(

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

andycat пишет:
... под какой нибудь банальный Z80...

почему вы пытаетесь сравнивать между собой конкретные процессоры/архитектуры (z80, x86) со средой/оболочкой ардуино? 

И еще раз Ардуино это "средство для построения простых систем автоматики и робототехники, для непрофессиональных пользователей".

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

KVadik пишет:
И еще раз Ардуино это "средство для построения простых систем автоматики и робототехники, для непрофессиональных пользователей".
А вот это в корне неверно. Группа людей захотела заработать деньги путем затаскивания новичков в область программирования. Открыть новую нишу. А то что вы сказали следствие. Вот только не простых, а примитивных. Для простых надо изучать Си++. Из-за этого новички натыкаются на delay и совмещение скетчей.

arduinec
Offline
Зарегистрирован: 01.09.2015

KVadik пишет:

arduinec пишет:

KVadik пишет:

Программирование в среде ардуино кривое по определению.

Криворукость программирования зависит от исполнителя, а не от среды и микроконтроллера.

в среде ардуино, из-за ее назначения, число криворуких исполнителей преобладает

И из-за этого программирование тоже кривое? Кстати, а в чём назначение среды Ардуино?

KVadik пишет:

микроконтроллеры тоже имеют разные глюки, особенно новые и особенно в SDK

В глюках микроконтроллеров виноват набор софта (Software Development Kit)?

KVadik пишет:

подавляющее большенство пользователей аруино не вникают в тонкости работы конкретной модели контроллера и работы на нем тех или иных библиотек

И поэтому "программирование в среде ардуино кривое по определению"?

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Что-то диалог идет по кругу.

arduinec пишет:

И из-за этого программирование тоже кривое? Кстати, а в чём назначение среды Ардуино?

Выше написал: "средство для построения простых систем автоматики и робототехники, для непрофессиональных пользователей"

Меня поправили, что не простых, а "примитивных" и изначально "для новичков" . Но, имхо, это не суть важно. В результате имеем то, что имеем.

arduinec пишет:

В глюках микроконтроллеров виноват набор софта (Software Development Kit)?

Мухи отдельно, котлеты отдельно. Есть глюки в SDK, над которыми среда Ардуино надстройка. Но бывают и в самих микроконтроллерах (как изначально допущенные ошибки, которые исправляются в более поздних версиях, так и брак, который китайцы могут пустить на дешевые ардуинки.

arduinec пишет:

И поэтому "программирование в среде ардуино кривое по определению"?

Да. Обычно "непрофессиональные пользователи" и "новички" пишут программы криво. А профессионалы используют другие среды. Но это если говорить о профессионалах в сфере программирования микроконтроллеров. Есть один нюанс, ардуино сейчас часто используют профессиональные программисты, которые плохо знакомы со схемотехникой. Они вполне могут писать "красивые" и "правильные" программы, но часто ошибаюся в схемотехнике.

з.ы. Я уже забыл чего мы тут обсуждаем. Вроде у тс был конкретный вопрос, а мы тут совсем зафлудили тему. Засим откланиваюсь.

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

KVadik пишет:

з.ы. Я уже забыл чего мы тут обсуждаем. Вроде у тс был конкретный вопрос, а мы тут совсем зафлудили тему. Засим откланиваюсь.

Не, всё в пределах темы, общайтесь :)

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Если все в пределах темы - в итоге WDT в 7 секунд уместили?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Точнее в 30 секунд

arduinec
Offline
Зарегистрирован: 01.09.2015

KVadik пишет:

А профессионалы используют другие среды.

Зачем другие среды, если и в этой работает: http://arduino.ru/forum/proekty/transistor-tester-arduino