7 votos

¿Es esta una forma correcta de tener un retardo de 1 segundo?

Si tengo un PIC24 con una frecuencia de 4 MHz. Es exacto tener un retardo de 1 segundo teniendo 4 millones de ciclos de reloj?

Hice un retardo de 1 segundo como este en mi PIC24FJ128GA010:

    MOV     #244, W3
DL: REPEAT  #16383
    NOP
    DEC     W3, W3
    BRA     NZ, DL
    REPEAT  #1566
    NOP
    RETURN

Claramente si calculaste bien los ciclos obtendrás 3999995 ciclos más 3 para RETURN y 2 para CALL = 4000000 ciclos. ¿Puede ser esto exacto? En un ejemplo de parpadeo del LED con una comparación con un reloj real, puedo ver (casi) una diferencia muy muy menor entre ellos.

¿Qué factores pueden afectar a esta precisión?

P.D: He utilizado muchas técnicas de retardo, la función __delay_ms en el compilador de C XC16, la interrupción del temporizador tanto en ensamblador como en C, y el módulo RTCC para una temporización precisa. Lo pregunto sólo para practicar y aprender.

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

8voto

user4245 Puntos 324

Los bucles de repetición sólo sirven para cronometrar de forma "aproximada" y durante periodos cortos. Hay muchos factores que pueden influir en la duración del bucle:

  1. Precisión de la frecuencia de reloj. 4 millones de ciclos de reloj es sólo exactamente 1 segundo si se tiene precisamente un reloj de 4.000.000,00000000000000000000000000 Hz.
  2. Interrupciones. Si se produce una interrupción durante el bucle, éste tardará más tiempo.
  3. Extras no contabilizados. Si estás trabajando en C y tu retardo está en una función, tienes que tener en cuenta cosas como el preámbulo / postámbulo de la función, el tiempo que tarda la instrucción de llamada, etc.

Básicamente, el recuento de ciclos de instrucción / ciclos de reloj es un dolor en el recto y no es algo que quieras hacer muy a menudo.

El PIC, y la mayoría de los demás microcontroladores, tienen mejores mecanismos.

  1. Temporizadores internos. Sirven para periodos cortos y son mucho más sencillos que contar ciclos. Configura el temporizador con una interrupción, siéntate y relájate. Para periodos más largos, sin embargo, tienden a implicar la activación de la interrupción varias veces y el recuento de su propia variable. Una forma común es tener un temporizador de 1ms en constante funcionamiento que siempre está contando un contador de milisegundos. Esto se utiliza para cronometrar los retardos. No siempre es 100% preciso, pero es muy sencillo de manejar. Los temporizadores, por supuesto, siguen dependiendo de la precisión de tu fuente de reloj.
  2. Relojes en tiempo real. Para periodos más largos, de un segundo o más, en los que no se necesita una precisión de grano fino pero sí una precisión de grano grueso (es decir, precisión al segundo, no a la µS, pero esa precisión estable durante periodos largos), no hay nada mejor que un módulo de reloj de tiempo real, ya sea interno al chip o externo en un chip separado. Las fuentes de reloj de menor frecuencia (32768Hz) utilizadas en los módulos RTC tienden a hacerlos más precisos (50ppm en 4MHz son 200Hz; 50ppm en 32768Hz son 1,6384Hz).

5voto

Spehro Pefhany Puntos 90994

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.

1voto

j pimmel Puntos 7046

El microcontrolador tiene en su interior un oscilador sólo apto para su funcionamiento y la medición normal del tiempo. Usted tiene que utilizar un oscilador externo para una medición precisa.

Un oscilador necesita un diseño cuidadoso y tienen mucho que considerar (por ejemplo, compensación de temperatura), así que si no te importa usar IC, recomiendo usar RTC (Reloj en tiempo real) IC o similar.

0voto

yyk Puntos 21

Delay1s movlw d'120'
movwf 10h
movlw d'98'
movwf 11h
movlw d'10'
movwf 12h
decfsz 12h
goto $-1
decfsz 11h
goto $-5
decfsz 10h
goto $-9
devolver

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X