Question sur les interruptions dans un programme de station météorologique avec interruptions pour pluviomètre et anémomètre /
Mon programme remplit une adresse IP sur mon réseau local. Malheureusement, j'ai perdu quelques informations sur le pluviomètre, je n'ai pas trouvé la cause, mais en augmentant le temps de rafraîchissement, j'ai réalisé que ce problème venait de l'occupation du processeur et que même en ayant ces 2 interruptions, ça ne protégeait pas moi de la perte d'information tout en actualisant les données sur Ethernet.
Quelqu'un at-il une expérience de ce problème ????
Ci-joint le morceau provocateur de code ces erreurs:
Je ne veux perdre aucun des basculements du pluviomètre, je voudrais éventuellement que le rafraîchissement des données web soit légèrement décalé, s'il il y une impulsion vers basculement du pluviomètre sinon je perds 0.23 mm de pluie....
Je n'ai pas mis tout mon car il est trop lourd..... mais possible en pièces jointes....??
L’interruption va interrompre la partie web donc je ne suis pas sûr de quel est votre problème.
Quand vous arrivez à la demande web, faites une section critique ou vous dupliquez les variables utilisées dans l’ISR et remettez le compteur à zéro puis sortez de la section critique et utilisez la copie des données pour votre page web. Utilisez aussi les techniques AJAX pour minimiser le flux vers votre page web.
S'il s'agit d'un pluviomètre à augets basculants comme les modèles J Richard, la détection peut se faire lors de la bascule, avec une brève interruption (qu'il ne faut pas rater au passage), mais aussi par la présence/absence de l'auget en position basculée de l'un ou l'autre des deux cotés, cet état n'est pas un transitoire donc ça laisse le temps de le mesurer.
En fait je ne comprenais pas pourquoi je perdais un certain nombre de bascule d'augets.... et en augmentant le temps de refresh à 60s, je me suis rendu compte que je ne les perdais pas...
Dans mon code j'ai 2 interruption une pour l’anémomètre et une pour le pluviomètre.
Est-ce que le changement d'ordre de ces 2 interruptions permettrait d’être plus fiable pour le pluviomètre??
Je pensais que le refresh était interrompu par une interruption ce qui ne semble pas être le cas. J'ai l'impression que le processeur termine son refresh avant de pendre en compte l'interruption...
Je joins mon code en PJ..
Je ne reçois pas les notifications des réponses, bien que j'ai coché cette option???
Notes and Warnings
Note
Inside the attached function, delay() won’t work and the value returned by millis() will not increment. Serial data received while in the function may be lost. You should declare as volatile any variables that you modify within the attached function. See the section on ISRs below for more information.
ou sur GG, tu tapes "interruption et millis()"...
dans tes "isr", incrémente ton compteur et traite le résultat dans le reste du code
Aujourd'hui j'ai beaucoup de vent, les pertes de données du pluviomètre sont fréquentes...
Je vais essayer d'inverser les interruptions entre le pluviomètre et l’anémomètre, car si j'ai bien compris, l'interruption sur le digital 2 est prioritaire par rapport au 3.
Peux-tu me dire le rôle réel de cli(); et de sei(); Servent-ils bien à permettre une réinitialisation du Timer1, et si c'est le cas quel doit être la fréquence de réinitialisation.
dfgh:
dans tes "isr", incrémente ton compteur et traite le résultat dans le reste du code
C'est bien ce que je fais ici si je ne trompe pas???
// Interruption du gestionnaire de routine qui est déclenchée lorsque l'on détecte de la pluie
void isr_rg() {
if ((millis() - contactTime) > 3 ) { // Déclenchement du signal du Pluviometre
contactTime = millis();
}
}
// interrupteur pour incrementer le nombre de rotation pour la vitesse du vent
void isr_rotation () {
if ((millis() - contactBounceTime) > 15 ) { // Déclare le contact valide de l'interrupteur pour la vitesse du vent
rotations++;
contactBounceTime = millis();
}
}
void isr_rotation ()
{
rotations++; //ici, l'isr sera la plus courte possible
}
et dans le code
if (rotation>0){
if ((millis() - contactBounceTime) > 15 ) { // Déclare le contact valide de l'inter pour la vitesse du vent
contactBounceTime = millis();rotation=0;
}
}
pendant que ton prg est dans l'isr, il peut s'en passer des choses, donc l'isr le plus courte possible.
pas de calcul ou de comparaison.
et dans l'isr, pas de millis() non plus.
cli(); interdit les interruptions
ensuite tu initialises ton timer, puis tu "attaches" ton "isr_timer"
sei(); autorise les interruptions
en faisant comme cela, tu te mets à l'abri d'un appel de l'isr pendant que tu l'initialises.