Pages: [1]   Go Down
Author Topic: Reset millis()  (Read 631 times)
0 Members and 1 Guest are viewing this topic.
Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3749
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 smiley-grin
Logged


Global Moderator
Netherlands
Offline Offline
Shannon Member
*****
Karma: 221
Posts: 13848
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Logged

Rob Tillaart

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

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3626
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3749
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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:
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 smiley-wink
Logged


France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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, ...
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3749
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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é
Logged


Pages: [1]   Go Up
Jump to: