Reiniciar Millis()

Existe alguna forma, aparte de resetear el micro , de reinicializar el valor de millis() ? Por software digo. Gracias

Para que quieres resetear el contador ? Basta con restarlo.

unsigned long tiempo = 0;
if (si ocurre algo){
   if (millis - tiempo > 50){
      tiempo = millis();
   }
}

Te iba a decir que no pero prueba esto que encontré para

extern volatile unsigned long timer0_millis;
unsigned long new_value = 0;

void setup(){
  //Setup stuff
}

void loop(){
  //Do stuff
  //--------

  //Change Millis
  setMillis(new_value);
}

void setMillis(unsigned long new_millis){
  uint8_t oldSREG = SREG;
  cli();
  timer0_millis = new_millis;
  SREG = oldSREG;
}

Confirma si funciona.

El otro modo es hacer un jump 0 pero no recuerdo exactamente como ponerlo.
Aunque se ha respondido varias veces.

@Kike_GL. El programa es para un cronómetro que está permanentemente alimentado esperando que se dispare. A los 50 dias sufre el desborde del contador de millis del micro y puede generarse algún conflicto con la resta si se desborda en pleno funcionamiento.

@Surbyte. He probado lo que posteaste y funciona perfectamente. Como siempre un lujo lo suyo.

Gracias a ambos.

Pablo_Lucini:
@Kike_GL. El programa es para un cronómetro que está permanentemente alimentado esperando que se dispare. A los 50 dias sufre el desborde del contador de millis del micro y puede generarse algún conflicto con la resta si se desborda en pleno funcionamiento.

Si dimensionas adecuadamante la variable (unsigned long) el desborde no representa ningún problema para tus cálculos, porque se autocorrigen.

Pero el no hablaba de desborde sino de poner a 0 millis(), tendrá sus razones.
Mi respuesta inicial era como la tuya Kike_GL, obviamente que no era posible pero luego hice una búsqueda y para mi sorpresa no solo se puede reiniciar como un HOT RESET usando Jump 0x00 o algo asi, sino que ahora me desayuno que se puede poner a 0 el millis(), Sorpresa total!!!

Si Surbyte, lei el articulo y para mi también fue una sorpresa, ya esta incluido como comentario aqui.

La comunidad de Arduino es increíble. Nunca deja de sorprender.

Somos dos Kike, somos dos o tres junto a Pablo_Lucini.

El problema con el desborde radica en que si justo en ese momento está activado el cronómetro la comparación de millis() me da un número negativo, ya que las millis anteriores están cerca de 2^32 y las millis actuales apenas por encima de cero, con lo cual se complica realiza la diferencia de tiempo. El jmp 0X00 no me sirve porque reinicia el programa completamente. La solución brindada por Ricardo funciona perfecto ( obviamente lo ensayé con un valor mucho más bajo, no voy a esperar 50 días ). En realidad uso dicha función reseteando el valor de millis mucho antes que desborde y cuando está desactivado para no generar un conflicto. Gracias nuevamente.

Por favor @Pablo_Lucini si dices eso es porque no has leído el comentario y trabajo hecho por @noter y tantos otros que explica que jamás te dará un número negativo usando unsigned long.
Claro que si usas long tendras errores de todo tipo.

Busca en indice de temas tutoriales millis() explicado por @noter y verás. Busca donde esta tu error y si aún no lo comprendes plantea el problema y te lo explicamos.

En realidad no había leido lo de @noter. Acabo de hacerlo. Sin embargo, a pesar de estar usando unsigned long, como dice la nota , me apareció el inconveniente a los 50 días. Por algún motivo que desconozco no me funciona como dice @noter.

NO es posible. Publica el código que has usado por favor si es posible.
Esta documentado por todos lados. La operación no falla.

Ahi va el código. Funciona perfecto hasta los 50 días. Luego funciona pero comienza cada conteo desde el último resultado. No comienza desde cero.

#include <SPI.h>
#include <DMD2.h>
#include <fonts/Arial_Black_16.h>
//#include <fonts/Droid_Sans_16.h>
#include <fonts/SystemFont5x7.h>
int flag=0;// bandera cambio de segundo
int uno=0;//unid segundo
int dos=0;//decena segundos
int tres=0;//unid minutos
int cuatro=0;//decena minutos
int cinco=0;//unid horas
unsigned long anterior;
unsigned long actual;
unsigned long lapso;
int activacion=5;// salida a cronometro oficina
int disparador = 3;   // triger no se usa
int entrada =4;      // start
//long distancia;
//int on=0;
int flag2=0;
//int flag3=0;
SoftDMD dmd(2,1);  


void setup() {
  Serial.begin(9600);
  dmd.setBrightness(100);
  dmd.begin();
  pinMode(disparador, OUTPUT);
  pinMode(entrada, INPUT);
  pinMode ( activacion,OUTPUT);
  dmd.selectFont(SystemFont5x7);
  
  dmd.drawString(59,1,"2");
  anterior=millis();
 
}


void loop()
{
   dmd.selectFont(Arial_Black_16);
   entrada = digitalRead(4);
    if (entrada==HIGH) {
                       
                       digitalWrite ( activacion,HIGH); 
                       flag2=0;        
                      cuenta();
                      
                          }
  
  else{ uno=0;// sino apaga el display
          dos=0;
          tres=0;
          cuatro=0;
          cinco=0;
          if (flag2==0){
                       dmd.clearScreen();
                       digitalWrite ( activacion,LOW);
          
                       dmd.selectFont(SystemFont5x7);
                       
                       dmd.drawString(59,1,"2");
                       flag2=1;
                       }
          anterior=millis() ;
         }
}  
  void cuenta()
  {
   
  actual=millis();
  
   lapso= actual-anterior;
 
  if ( lapso<0){lapso=0;}
 
  if ( lapso>=1000){
                    
               int   unobis= (lapso)/1000;
                   if ( unobis >uno){
                    flag=1;
                    
                    uno=unobis;}
                  }// calcula unid. de segundos
 
   if(lapso >= 10000) // si cambia decenas de segundos corrige
   {
    anterior = actual;
    uno=0;
    dos++;
        if(dos >= 6)
        {
            dos=0;
            tres++;
                if(tres >= 10)
                {
                    tres=0;
                    cuatro++;
                    if (cuatro >= 6)
                    {
                        uno=0;
                        dos=0;
                        tres=0;
                        cuatro=0;
                        cinco++;
                        if ( cinco>= 10){
                                        cinco=0;
                                         }
                     }
                }
          }
                
  }
  


  if (flag==1) { 
              //flag3--;
             dmd.drawString(1,0,String(cinco));
              dmd.drawString(14,0,String(cuatro));
              dmd.drawString(23,0,String(tres));
              dmd.drawString(36,0,String(dos));
              dmd.drawString(10,0,":");
              dmd.drawString(32,0,":");
              dmd.drawString(45,0,String(uno));
              dmd.selectFont(SystemFont5x7);
              dmd.drawFilledBox(53,0,63,15, GRAPHICS_OFF); 
              
              dmd.drawString(59,1,"2");
              if ((cinco*10+cuatro)>=3 ){
                                    if (uno%2==0){
                                                dmd.drawFilledBox(0,0,63,15, GRAPHICS_ON);
                                                
                                                dmd.drawString(59,1,"2",GRAPHICS_INVERSE);                                                
                                                dmd.selectFont(Arial_Black_16);
                                                dmd.drawString(1,0,String(cinco),GRAPHICS_INVERSE);
                                                dmd.drawString(14,0,String(cuatro),GRAPHICS_INVERSE);
                                                dmd.drawString(23,0,String(tres),GRAPHICS_INVERSE);
                                                dmd.drawString(36,0,String(dos),GRAPHICS_INVERSE);
                                                dmd.drawString(10,0,":",GRAPHICS_INVERSE);
                                                dmd.drawString(32,0,":",GRAPHICS_INVERSE);
                                                dmd.drawString(45,0,String(uno),GRAPHICS_INVERSE);
                                                }
                                    }           
             
             
               flag=0;
              }
             
              
  }

He visto tu código y no veo la razón por la que dices que se comporta mal.
Probaste forzar anterior con un valor cercano a los 47.X dias?

unsigned long anterior = 0xfffffff0; // Faltan 16 cuentas para el desbordamiento
unsigned long actual = 5;                       // Han transcurrido 5 cuentas desde el desbordamiento
unsigned long lapso = actual - anterior;        // Debería resultar 21, que es el número total transcurrido, ¿no?

Intentalo!!

@surbyte He intentado poner el codigo para resetear el millis que sale en la arduwiki, pero me da un fallo, en la parte de setMillis(nuevo_valor); me dice esto :

expected constructor, destructor, or type conversion before '(' token