Problème Watchdog

Problème Watchdog

Message non lude 3gsTeam » Dim 30 Mar 2014 17:08

Bonjour à tous,

Mon application est une régulation d'un chauffe eau solaire :
Arduino MEGA2560 + LCD + DS18B20 + RTC + carte SD + 2 relais.

J'ai constaté des plantages du logiciel que je n'arrive pas encore à expliquer.

J'ai activé le watchdog de la carte avec le code ci-dessous :

#include <avr/wdt.h>

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

void loop(void) {
..
..
if (topSec == true) {
wdt_reset();
..
..
}
}


J'ai vérifié juste ces instructions sur une carte UNO,
le watchdog fonctionne correctement, en cas débordement il resete le soft.

Mon problème est sur la carte MEGA avec le logiciel de régulation,
le débordement du chien de garde plante le soft et le micro (?).
Les boutons reset (carte LCD, carte MEGA) sont inactifs !
Seul la mise sous tension permet le redémarrage du soft.

Quelqu'un aurait-il une idée ?

Merci de votre aide.
Serge
Avatar de l’utilisateur
3gsTeam
 
Messages: 7
Inscription: Jeu 14 Mar 2013 15:27

Re: Problème Watchdog

Message non lude Bemolu » Dim 30 Mar 2014 19:38

Il semblerait que tu ne sois pas le seul. Les UNO ne bloquent pas sur ce problème car elles ont le bootloader 'optiboot'. Optiboot existe aussi pour MEGA, mais pas par défault. Donc manip'un peu plus compliquée.
Bemolu
 
Messages: 63
Inscription: Mer 8 Fév 2012 21:19

Re: Problème Watchdog

Message non lude 3gsTeam » Sam 21 Juin 2014 17:24

Bonjour à tous.

J'ai résolut mon problème de watchdog sur la carte MEGA, en déactivant le watchdog interne
et en réalisant la fonction par un ATtiny85 et un transistor MOSFET canal P.

La carte MEGA génère un signal qui sur le front montant remet à zéro le chien de garde.
S'il déborde au bout de 30s, il coupe l'alimentation de la carte MEGA pendant 5 s.

Le logiciel de l'ATtiny85 est très simple.

Peut-être cette solution simple sera utile à quelqu'un.

Serge
Avatar de l’utilisateur
3gsTeam
 
Messages: 7
Inscription: Jeu 14 Mar 2013 15:27

Re: Problème Watchdog

Message non lude phil » Lun 23 Juin 2014 10:50

Bonjour,


oui en effet cela peut servir a pas mal de monde.
Est ce que vous pouvez partager votre code / schéma ?

++
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: Problème Watchdog

Message non lude 3gsTeam » Ven 27 Juin 2014 09:30

Bonjour,
Voici le schéma et le code.
Pour le schéma, j'ai utilisé des composants de fond de tiroir. Le régulateur et le MOS canal P sont très largement sur dimensionnés.
La led débordement mémorise un reset par watchdog.
Le led recopie WDG, permet le contrôle du fonctionnement (watchdog et carte Mega).
Le cavalier ACK_ERR inhibe le watcdog et resete la mémoire du débordement. Car le logiciel de la carte Mega a des initialisations incompatibles avec un watchdog qui n'était pas prévu.

Code: Tout sélectionner
/*
  Watchdog pour régulation solaire
 
  Le watchdog commande l'alimentation de la carte Arduino Mega.
  Il scrute un signal periodique WDG.
  En cas d'erreur, il séquence l'alimentation de la carte Mega.
 
 
    <____________________  _________________ Bloc alimentation
   Alim Mega            |^__|         
                          |
                          |
               ------------------------
               |      WATCHDOG        |
  WDG -------->| raz                  |--->  Led verte recopie WDG
               |                      |
  ACK_ERR ---->| inhibe               |---> Led rouge mémoire débordement
               |                      |
               |                      |
               ------------------------
                               __             __
  Signal controlé  WDG     ___|  |___________|  |_______       
                              ^0 ^1          ^3  (s)
                              _________________________________________________          ___
  Alimention Mega          __/                                                 \________/
                                             |<----      30 s             --->|<  5 s  >|                           
                             
  Règles de controle :
     raz watchdog sur front montant
     le wotchdog déborde au bout de 30 secondes et coupe l'aim carte Mage pendant 5 secondes
     le signal est échantilloné à 20ms
 
  Le signal WDG est recopié sur une led verte
  Le débordement est mémorié sur une led rouge clignotante (raz mémoire par reset ou power ON de l'ATtiny)
 
  Le signal ACK_ERR (strap anovible) inhibe le watchdog et resete l'erreur
 
*/
 
#define WDG     0
#define ALIM    1
#define LED_ERR 3
#define LED_WDG 4     
#define ACK_ERR 2      // inhibe le watchdog et efface l'erreur

byte mem_wdg;
byte wdg;
byte ack_err;

int cpt_watchdog;

byte erreur;
byte cpt_aff_err;

// seuils de controle (en 20ms)
#define T_WDG         1500  // 30 s temps de débordement du watchdog
#define T_OFF          250  // 5 s temps de coupure d'alimentation
#define T_CLIGNOTE      25  // 0.5 s temps de clignotage
#define T_LOOP          20  // 20 ms temps d'échantillonage dans le Loop()


void setup() {               
  pinMode(WDG, INPUT);     
  pinMode(ALIM, OUTPUT);     
  pinMode(LED_WDG, OUTPUT);     
  pinMode(LED_ERR, OUTPUT);   
  pinMode(ACK_ERR, INPUT);       
 
  digitalWrite(ALIM, HIGH); 
  digitalWrite(LED_WDG, LOW); 
  digitalWrite(LED_ERR, LOW); 
 
  mem_wdg = digitalRead(WDG); 
  cpt_watchdog = 0;
  cpt_aff_err = 0;
  ack_err = 1;
}


void loop() {
 
  delay(T_LOOP);

  // recopie WDG --> LED_WDG
  wdg = digitalRead(WDG);
  if (wdg == 1)
    digitalWrite(LED_WDG, HIGH); 
    else digitalWrite(LED_WDG, LOW); 
   
  ack_err = digitalRead(ACK_ERR);
 
  if (ack_err == 1){
    cpt_watchdog++;
   
    // changement d'état
    if (wdg != mem_wdg){
      mem_wdg = wdg;
      // WDG  0 --> 1
      if (wdg == HIGH) cpt_watchdog = 0;
      }
     
    // etst débordement
    if (cpt_watchdog >= T_WDG) {
      erreur = 1;
      cpt_watchdog = 0;
      alim_off();
      }
    if (erreur == 1) {
      cpt_aff_err++;
      if (cpt_aff_err > 25) digitalWrite(LED_ERR, HIGH); 
      if (cpt_aff_err > 50) {
        cpt_aff_err = 0;
        digitalWrite(LED_ERR, LOW); 
        }
      }
    }
    else inhibe_watchdog();
}

//* coupure temporaire de l'alimentation carte Mega
void alim_off(void){
byte i;
  digitalWrite(ALIM, LOW); 
  digitalWrite(LED_ERR, HIGH);
  for (i = 0; i < T_OFF; i++) delay(T_LOOP);
  digitalWrite(LED_ERR, LOW);
  digitalWrite(ALIM, HIGH); 
}


void inhibe_watchdog(void){
byte i;
  erreur = 0;
  digitalWrite(ALIM, HIGH); 
  digitalWrite(LED_ERR, HIGH);
  digitalWrite(LED_WDG, LOW);
  for (i = 0; i < T_CLIGNOTE; i++) delay(T_LOOP);
  digitalWrite(LED_ERR, LOW);
  digitalWrite(LED_WDG, HIGH);
  for (i = 0; i < T_CLIGNOTE; i++) delay(T_LOOP);
  digitalWrite(LED_ERR, LOW);
  digitalWrite(LED_WDG, LOW);
}



Désolé, je n'arrive pas à inclure l'image ou le pdf du schéma.
Comme il est très simple voici sa description :
ATtiny 85:
pin 5 : signal WDG (pulldown de 4K7)
pin 6 : commande alimentation Mega (2n2222 + IRF9530)
pin 7 : cavalier ACK_ERR (pullup de 4K7)
pin 2 : led recopie signal WDG
pin 3 : led mémoire débordement watchdog.
La carte Mega et la carte watchdog sont alimentées en 9 volts.

L’intérêt de ce montage outre sa simplicité, c'est qu'il est très adaptable :
- durée du watchdog (même pour des temps longs)
- méthode de remise à zéro du watchdog.

Bonne utilisation
Serge
Avatar de l’utilisateur
3gsTeam
 
Messages: 7
Inscription: Jeu 14 Mar 2013 15:27


Retourner vers Logiciel Arduino

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité