Go Down

Topic: Reset millis() (Read 670 times) previous topic - next topic

B@tto

Salut à tous,

Pour une application qui a toutes les chances de tourner + de 49 jours, et même s'il y a très très peu de chance que millis() overflow pile au moment fatidique (millis() ne me sert qu'à remplacer des delay(), mais la temporisation est critique), je ne veux pas prendre de risque et j'aimerais remettre à zéro millis() tous les 40 jours.

En cherchant sur le net je suis arrivé à me monter une petite routine  :

Code: [Select]
extern volatile unsigned long timer0_overflow_count;
extern volatile unsigned long timer0_millis;
uint8_t old_SREG;

void ResetMillis() {
old_SREG = SREG;
cli();
timer0_millis=0;
timer0_overflow_count=0;
SREG = old_SREG;
}


Testé sur Mega 10 minutes avec succès, mais bon perfectionniste comme je suis, si un expert peut me confirmer sa fiabilité et m'informer sur d'éventuels risques à prendre en compte, je le remercie par avance :D
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

robtillaart

I might not be the expert you're looking for but what you do manually in your code is almost exact the same as what happens when millis() overflow.
So if your code cannot handle millis() that flips to 0 again it will still fail..

(google translate says)
Je ne pourrais pas être l'expert que vous cherchez, mais ce que vous faites manuellement dans votre code est presque exactement la même chose que ce qui arrive quand millis () débordement. Donc, si votre code ne peut pas gérer millis () qui retourne à nouveau à 0, il échouera toujours ..

vérifier la classe chronomètre - http://playground.arduino.cc/Code/StopWatchClass - pour voir comment gérer millis ()

Excuse, Le français n'est pas ma langue maternelle


Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

fdufnews

Quote
même s'il y a très très peu de chance que millis() overflow pile au moment fatidique

Pourquoi parles-tu de moment fatidique?
Il n'y a qu'un problème de débordement de capacité de la variable qui est parfaitement connu et dont on connait le moyen de contourner le problème http://playground.arduino.cc/Code/TimingRollover.

B@tto

@robtillaart : thanks for your answer. My code and what I found was of course inspired by the original millis(). My problem was to avoid calculation with an overflowed millis(). Example :

Code: [Select]

Start = millis();
while(millis() - Start<Delay) ; // what happens here if millis() overflow during my loop ?


But fdudnews gave me the answer : I was worried about nothing xD

Merci fdufnews ;)
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

skywodd

Salut,

Question conne : il te sert à quoi ton millis() dans ton code ?
C'est pour faire quelque chose à un intervalle de temps précis ?
Si oui tu feras mieux d'utiliser un timer pour ça, même sans interruption (juste un flag + code dans loop avec un if).

En fait ce qu'il faut voir c'est :
Solution millis() : ça augmente, ça augmente, ça *paf *
Solution timer : tick, tick, tick, tick, tick, ... et 2000 ans plus tard : tick, tick, tick, tick, ...
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

B@tto

En fait c'est un système avec une électrovanne en verre. J'évoquais le sujet il y a pas longtemps sur la préservation de la durée vie du montage (PWM + forte induction). Le but c'est d'envoyer un fort courant pour décoller le piston, puis un courant faible pour le maintenir. Pour parfaire le système, j'ai couplé avec un capteur IR qui vérifie si le piston est bien levé mais toutefois sans dépasser 3 secondes de "courant fort". Donc j'ai une boucle du type que celle que j'ai évoqué juste avant, avec dedans une condition sur le capteur IR et un break.

Comme le système n'est pas sensé s'arrêter sauf pour maintenance (et il peut tourner plusieurs années sans ...) je voulais être sûr de mon coup.

Je suis tout à fait d'accord pour les timers et je m'en sers sur tout le temps sur msp430, mais pour ce projet la, qui au final est très basique, ça me faisait c*ier de devoir jouer avec les registres pour juste assurer un cas qui a une chance sur 10 000 de se produire (et en plus tous les 50 jours ...) alors qu'il s'agit d'un delay à peine plus évolué
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Go Up