surbyte:
Quieres mejor la precisión de millis() y porque no usas micros()?
- micros tiene el bendito overflow cada 71 minutos. Es buena la idea pero si el Arduino no opera por más de una hora continua.
- Analizándolo bien, realmente no tenía pensado redefinir micros; desencadenar interrupciones que cuenten microsegundos con exactitud... imposible con 16 MHz.
A menos de que una interrupción de 974 hz no interfiera fuertemente con una de 1 KHz (de ahí un millis más "exacto y natural"); entonces no sería necesario deshabilitarla. Caso contrario, quedará como una opción para una librería (porque he notado que realmente paralizaría a micros).
noter:
Tal vez lo que desea implementar Lucario sea, por ejemplo, un prescaler de 8, con lo que cada conteo equivaldría a medio microsegundo, e interrupción/reseteo cada 2000 conteos, con lo que se incrementaría millis exactamente cada milisegundo.
Lo dices en timer1? Porque en timer0 o 2; está más complicado lidiar con no sub-múltiplos de 2000 (256).
Pero entiendo tu punto, 8 ciclos de reloj son exactamente 500 ns, entonces cada dos cuentas timer, hay un microsegundo (si tan solo se pudiera hacer el incremento completamente paralelo a una variable de la memoria RAM).
Yo tenía en mente hacerlo con el prescaler en 1, así el incremento tiene que ocurrir cada 15999 (16000) ciclos; o podría restarle los que se tarda en "moverse" del código principal a la ISR, que aparentemente (según Nick Gammon aquí, sección "How long does it take to execute an ISR?"), son 23 si no es interrupción externa.
Respecto a la redefinición... si no es algo que pueda hacer con un #include, entonces creo que bastará con deshabilitar la interrupción del overflow del timer0 (si el usuario así lo quisiera).
Alfaville:
Para un cronometro podria ser buena idea, pero en general tambien usamosSerial, I2C, PWM y mas cosas todas juntas, y queremos que vaya todo fluido.
Quizás por eso los padres fundadores han buscado un equilibrio global, a fin de cuentas para la hora usamos modulos externos, y los milisegundos los usamos siempre en modo relativo ... millis()-tiempo ...
Otro motivo más para no redefinir millis.
Leyendo el artículo del link que posteaste, me di cuenta que el contador de millis tiene lo que en el calendario gregoriano (con el que prácticamente todo el mundo vive, el de los 365 días) viene siendo el año bisiesto; esa unidad de más que se suma con el fin de compensar la desviación que provocan las cifras decimales. Vamos, para nadie es un secreto que el movimiento de traslación de la Tierra no dura exactamente 365 días; sino hasta el "29 de febrero" se podría usar como una indirecta de "nunca".
Si entonces millis tiene su razón de ser, entonces mejor dejarlo así; a menos de que se pueda cambiar con un #include <libreria.h>.
PD: creo que ya tengo claro que el modo CTC automáticamente reinicia el contador cuando viene la interrupción, pero ahora mi duda es: ¿Sigue contando aún dentro de una ISR, y aún si todas las interrupciones estuvieran deshabilitadas?
Yo supongo que sí, ya que los timers son piezas de hardware y no de software; que únicamente son contadores de pulsos (reloj interno o externo). No sé que piensan ustedes...