Re: Desbordamiento y millis()

La clave esta en la linea

while(millis()-tiempo < T1) delay(10);

'Al volver a pasar por el mismo código, millis() devuelve 980 y luego 20 (ya que hemos pillado un overflow entre las lecturas),'
millis=20 y tiempo =980

el while quedara:
while(20-980<T1) delay(10)

El ejemplo no es muy bueno, ya que el overflow lo tendremos cuando millis() alcance el maximo valor para un unsigned long: 4,294,967,295
Replanteemos el ejemplo con datos mas adecuados:
-el bucle se ejecuta cuando millis() esta a punto de desbordar, y obtenemos un valor de 4,294,967,294 para la variable tiempo
-cuando llegamos al while, millis() devuelve un valor de 5
-millis()-tiempo = 5-4,294,967,294= -4,294,967,289
-como el resultado es negativo, es menor que T1, y se evalua como verdadera la condicion para el while, que ejecuta el delay(10)

  • se vuelve a evaluar la condicion del while, que da un numero aproximadamente 10 unidades mayor.
    Es sencillo ver que esta situación se va a mantener siempre, ya que nunca millis() va a devolver un valor 10 unidades mayor que tiempo.

Lo ue no acabo de ver es porque dices que no devuelve un negativo... creo que seria diferente si hicieras
unsigned numero
numero = millis()-tiempo