L'interruption de MsTimer2 ne s'active pas !

Bonsoir, j'ai un code dans lequel quand je clique sur une case/icône.png il ne se passe rien.
En fait je clique sur un bouton du site internet hébergé par ma carte Mega 2560...

Quand je clique sur le lien/l'icône, tout se passe comme prévu comme peut me le certifier mes Serial.println ou pas ln, sauf un lancement d'interruption lié à MsTimer2 qui n'a pas l'air de se mettre en route.

En effet, quand j'active la fonction en cliquant dessus; j'ai bien les Serial.print de la fonction qui sont placer juste avant l'activation du Timer2 qui s'affichent alors que mes Serial.print de la fonction d'interruption Timer2 ne s'affichent pas; il ou elle, ne va pas dedans !

fonctions2.cpp ligne 240 appartenant au projet domo6.ino

configuration.h (3.3 KB)

configuration2.cpp (19.5 KB)

domo6.ino (3.03 KB)

fonctions2.cpp (9.32 KB)

i2c.cpp (2.64 KB)

Je n'ai pas lu le code mais essayer de faire un Serial.print (utilise des interruptions) dans une interruption n'est pas possible ni une bonne idée en général - il faut changer l' architecture de votre code pour metttre à vrai un drapeau dans l'interruption et traiter cela ensuite dans la loop par exemple

Oui, merci du conseil mais c'est exactement ce que je fais; je mets simplement un flag dans l'interruption.
Mais comme celui-ci n'était jamais mis à UN, j'y ai mis un Serial.print pour debugger en quelques sortes:

   if (StrContains(HTTP_req, "TEMP1=1")) {  // si mesure de température demandée
        TEMP_state[0] = 1;  // save TEMP1 state
        //  commande à envoyer  pour son effectuation
        #ifdef Serverout
        Serial.println("mesure temperature envouyée via i²c");
        #endif
        commande = "mesure temperature";
        tramei2c (1);    // envoye la trame en I²C à l'esclave 1
        MsTimer2::start(); // active Timer 2
        #ifdef Serverout
        Serial.println("et j'ai mis en route l'interruption Timer2");
        #endif
        
    }
    else if (StrContains(HTTP_req, "TEMP1=0")) {  // si arrêt de mesure température demandée
        TEMP_state[0] = 0;  // save TEMP1 state
        #ifdef Serverout
        Serial.println("stop mesure temperature envouyée via i²c");
        #endif
        commande = "stop mesure temperature";
        tramei2c(1);    // envoye la trame en I²C à l'esclave 1
        MsTimer2::stop(); // désactive Timer 2
    }
    
    if (flag == 1)  {
      #ifdef Serverout
      Serial.println("Le 'flag = 1' donc je vais lire en I²C");
      Serial.println("l'esclave n°2: 'recepteur domo6'");
      #endif
      master_read (2);    // lecture en I2C sur l'esclave 2 de 6 octets
      flag = 0;
    }
    
        
}

Et la routine d'interruption MsTimer:

///// Fonction d'interruption du timer 2
void InterruptTimer2() { // debut de la fonction d'interruption Timer2
  #ifdef Serverout
  Serial.println("Je suis dans l'interruption Timer2");
  #endif
   flag = 1;  // interruption timer2 intervenue
}

Alors même que ce timer est bien initialisé dans la fonction setup {}:

MsTimer2::set(500, InterruptTimer2); // période 500m

Je ne comprends pas pourquoi elle ne s'active pas

NEWS !!!
J'ai appris via Google que la carte Mega 2560 n'était pas compatible avec la librairie MsTimer2:

MsTimer2.cpp

...History:
  	29/May/09 - V0.5 added support for Atmega1280 (thanks to Manuel Negri)
  	19/Mar/09 - V0.4 added support for ATmega328P (thanks to Jerome Despatis)
  	11/Jun/08 - V0.3 
  		changes to allow working with different CPU frequencies
  		added support for ATMega128 (using timer2)
  		compatible with ATMega48/88/168/8
	10/May/08 - V0.2 added some security tests and volatile keywords
	9/May/08 - V0.1 released working on ATMEGA168 only
	

  This library is free software; you can redistribute it and/or...

C'est vrai qu'en lisant on s’aperçoit que la dite carte n'est pas prise en compte; il faudrait tout refaire en assembleur et voir quels registres affecter pour pouvoir l'utiliser et encore, je n'en suis pas si sûr...

Cependant, dans mon projet j'ai toujours besoin d'un interruption de temps qui fait que au bout d'un certain temps, il ou elle va lire un esclave en I²C...

J'ai trouvé ceci mais il paraîtrait que millis() stoppe les interruptions or j'ai besoin qu'elles ne le soient pas dans mon projet:

Millis ()

Donc comment feriez-vous pour interrompre un programme au bout d'un certain temps juste pour qu'il lise en I²C sans MsTimer2 et sans millis() apparement...

Test timer

/*-------------------------------------------------------------

  Test du Timer 2 en interruption
  
/-------------------------------------------------------------*/

// inclusion des différentes bibliothèques nécessaires  //

//#include <MsTimer2.h> // inclusion de la librairie Timer2

#include "define.h"

// Les variables sont modifiées au cours du programme
int ledState = LOW;             // ledState est utilisée pour fixer l'état de la LED (HIGH/LOW)

// les variables suivantes sont de type long car le temps, mesuré en millisecondes
// devient rapidement un nombre qui ne peut pas être stocké dans un type int.

long previousMillis = 0;  // variable pour mémoriser le temps écoulé depuis le dernier changement de la LED
long interval = 3000;     //intervalle de clignotement de la LED (en millisecondes)

void setup()
{
  pinMode(LED, OUTPUT);
  
  Serial.begin(9600);  // start serial for output
  Serial.println("Serial output initialized");
}

void loop()
{
      unsigned long currentMillis = millis(); // stocke la valeur courante de la fonction millis()
      
      if(currentMillis - previousMillis > interval) {
        // mémorise la valeur de la fonction millis()
        previousMillis = currentMillis;
        
        // inverse la variable d'état de la LED
        if (ledState == LOW) {
          Serial.println("ledstate = 0 => 1");
          ledState = HIGH;
        } else  {
          Serial.println("ledstate = 1 => 0");
          ledState = LOW;
        }
          
        // modifie l'état de la LED
        digitalWrite(LED, ledState);
  }
      
     
}

et le *.h:

#ifndef define_h
#define define_h

//  sorties utilisées
#define LED  7


#endif //__define_H

emmett_brown:
NEWS !!!
J'ai appris via Google que la carte Mega 2560 n'était pas compatible avec la librairie MsTimer2:

si elle fonctionne sur une MEGA je l'utilise pour ma ruche
dans le setup :

  // initialisation interruption Timer 2
    MsTimer2::set(periode, InterruptTimer2); // période 1000ms = 1s

la fonction :

// ------------------------ traitement interruption timer 2 ----------------------
void InterruptTimer2() { 
    .........
    irqt2 = 1; // irq traitée 
}

et dans la loop :

....
    if (irqt2 == 1){
        Serial.println("J'ai traite l'interruption Timer2");
        ....
        irqt2 = 0;
    }

bien sur il faut que ta loop fasse moins que la période ...

Hum...

Cette librairie semble conduire à un paradoxe temporel...