Normalmente, los bucles de retardo se utilizan en programas poco sofisticados en los que se requiere un retardo corto o aproximado. Por supuesto puedes hacerlos de ciclo perfecto añadiendo algunos NOPs o lo que sea. Si el micro no va a hacer nada más que contar un reloj y emitir una onda cuadrada, puedes contar exactamente 500.000 ciclos con un reloj de 4 MHz (incluidas las instrucciones de bucle y conmutación), conmuta el pin de salida y repite, y la salida será una onda cuadrada de 1 Hz tan precisa como el reloj (más o menos nanosegundos de fluctuación) y con un ciclo de trabajo del 50%.
Si quieres tiempos precisos de 1 segundo, también puedes utilizar un periférico temporizador/contador, sincronizado por el reloj del sistema, que permite al micro hacer otra cosa que contar. Muchos PICs también tienen una entrada de oscilador secundario que puede trabajar con (digamos) un cristal de reloj de 32.768Hz, permitiendo que un reloj inexacto como el RC interno se utilice para el reloj del sistema. Si el contador/temporizador está programado para conmutar el pin de salida directamente, el micro puede ser utilizado para otros propósitos además de contar, y sólo necesita volver para configurar el siguiente valor de comparación antes de que la siguiente comparación llegue a su fin. De nuevo, la salida será tan precisa como la frecuencia del reloj de entrada al contador. Algunos tienen un periférico contador en tiempo real que hace el conteo por ti.
Si no te importa demasiado un poco de fluctuación (pero la frecuencia puede seguir siendo exacta), puedes activar interrupciones periódicas y contarlas. Por ejemplo, si tuvieras interrupciones cada 2ms podrías simplemente contar (en la rutina de servicio de interrupción) hasta 250, luego conmutar la salida, y reiniciar el contador. Dado que la ISR puede tomar diferentes cantidades de tiempo en algunos micros para comenzar (dependiendo de lo que estaba haciendo cuando se interrumpió) y por otras razones puede haber un poco de fluctuación en este enfoque (algunos ciclos de instrucción).
Mentí un poco al insinuar que el micro no podía hacer otra cosa si estaba contando ciclos- es posible (pero bastante tedioso) elaborar código ensamblador que sea isócrona - tarda exactamente el mismo número de ciclos en ejecutarse independientemente de la bifurcación que se tome, de modo que se pueden realizar cosas útiles con retardo. No es realmente una cosa agradable tener que hacer.
Cualquiera de estos métodos puede ser "correcto" para un fin determinado.
4 votos
El oscilador interno no es especialmente preciso. Si quieres una precisión similar a la de un reloj, necesitas un cristal con algún tipo de compensación de temperatura.
1 votos
I can see (Almost) a very very minor difference between them.
Trucos ópticos. Pero principalmente lo que dijo pjc50. Pasaste por tus 4 millones de ciclos, pero si tu reloj de 4mHz es en realidad 4.02 a X temperatura...