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