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

5

Si tengo un PIC24 con una frecuencia de 4 MHz. ¿Es preciso tener un retraso de 1 segundo al tener 4 millones de ciclos de reloj?

Hice un retraso 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 los ciclos correctamente, obtendrás 3999995 ciclos más 3 para RETORNO y 2 para CALL = 4000000 ciclos. ¿Puede esto ser exacto? En un ejemplo de parpadeo de LED con una comparación con un reloj real, puedo ver (casi) una diferencia muy pequeña entre ellos.

¿Qué factores pueden afectar esta precisión?

P.S: Utilicé muchas técnicas de retardo, la función __delay_ms en el compilador XC16 C, la interrupción del temporizador en el ensamblaje y C, y el módulo RTCC para una sincronización precisa. Pido esto solo para practicar y aprender.

    
pregunta 3bdalla

3 respuestas

7

Los bucles de repetición solo son realmente buenos para la temporización "aproximada" y para períodos cortos. Hay muchos factores que pueden afectar la duración de su bucle:

  1. precisión de la frecuencia del reloj. 4 millones de ciclos de reloj solo es exactamente 1 segundo si tiene exactamente un reloj de 4,000,000.00000000000000000000000000 Hz.
  2. Interrupciones. Si se produce una interrupción durante su bucle, el bucle tomará más tiempo.
  3. No se tienen en cuenta los extras. Si está trabajando en C y su retraso está en una función, debe tener en cuenta cosas como la función de preámbulo / postámbulo, el tiempo necesario para la instrucción de llamada, etc.

Básicamente, el conteo de ciclos de ciclo de reloj / reloj es un dolor correcto en el recto y no es algo que quieras hacer muy a menudo.

El PIC, y la mayoría de los otros microcontroladores, tienen mejores mecanismos.

  1. Temporizadores internos. Estos son buenos para períodos cortos y son mucho más simples que los ciclos de conteo. Configure el temporizador con una interrupción, siéntese y relájese. Para períodos más largos, aunque tienden a implicar la activación de la interrupción varias veces y contar su propia variable. Una forma común es tener un temporizador de 1 ms en ejecución constante que siempre cuenta un contador de milisegundos. Que luego se utiliza para cronometrar sus retrasos. No siempre es 100% preciso, pero muy simple de manejar. Los temporizadores, por supuesto, aún dependen de la precisión de su fuente de reloj.
  2. Relojes en tiempo real. Para períodos más largos de un segundo o más, en los que no necesita una precisión de grano fino, pero necesita una precisión de grano grueso (es decir, la precisión del segundo, no la µS, pero la precisión es estable durante largos períodos), no puede vencer a un módulo de reloj en tiempo real, ya sea interno al chip o externo en un chip separado. Las fuentes de reloj de frecuencia más baja (32768Hz) utilizadas en los módulos RTC tienden a hacerlas más precisas (50 ppm en 4MHz es 200Hz; 50ppm en 32768Hz es 1.6384Hz).
respondido por el Majenko
4

Por lo general, los bucles de retardo se utilizan en programas no sofisticados donde se requiere un retardo corto o aproximado. Por supuesto, puedes hacerlos perfectos para el ciclo agregando algunos NOP o lo que sea. Si el micro no hace nada más que contar un reloj y emitir una onda cuadrada, puede contar exactamente 500,000 ciclos con un reloj de 4 MHz (incluido el bucle y las instrucciones de conmutación), alternar el pin de salida y repita, y la salida será una onda cuadrada de 1Hz, tan precisa como el reloj (fluctuación de nanosegundos o nanosegundos) y con un ciclo de trabajo del 50%.

Si quiere tiempos precisos de 1 segundo, también puede usar un temporizador / contador periférico, cronometrado por el reloj del sistema, que le permite al micro hacer otra cosa que no sea contar. Muchos PIC también tienen una entrada de oscilador secundario que puede trabajar con (digamos) un cristal de reloj de 32,768Hz, lo que permite utilizar un reloj impreciso como el RC interno para el reloj del sistema. Si el contador / temporizador está programado para alternar el pin de salida directamente, el micro se puede usar para otros fines que no sean solo el conteo, y solo es necesario volver a configurar el siguiente valor de comparación antes de la próxima comparación. De nuevo, la salida será tan precisa como la frecuencia del reloj de entrada al contador. Algunos tienen un contador periférico en tiempo real que realiza el conteo por usted.

Si no te importa demasiado un poco de jitter (pero la frecuencia puede ser fuerte) puedes disparar interrupciones periódicas y contarlas. Por ejemplo, si tuvo interrupciones cada 2 ms, simplemente podría contar (en la rutina de servicio de interrupción) hasta 250, luego alternar la salida y restablecer el contador. Dado que el ISR puede tardar una cantidad variable 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 jitter en este enfoque (algunos ciclos de instrucción).

Mentí un poco cuando insinué que el micro no podía hacer nada más si estaba contando los ciclos. Es posible (pero bastante tedioso) crear un código de ensamblador que sea isócrono - toma exactamente lo mismo la cantidad de ciclos que se ejecutarán sin importar qué rama se tome, de modo que se puedan lograr cosas útiles dentro de un retraso. No es realmente algo bueno que hacer.

Cualquiera de estos métodos puede ser "correcto" para un propósito determinado.

    
respondido por el Spehro Pefhany
1

El microcontrolador tiene un oscilador interno que solo es adecuado para su operación y medición de tiempo normal. Tienes que usar un oscilador externo para una medición precisa.

Un oscilador necesita un diseño cuidadoso y tiene mucho que considerar (p. ej., compensación de temperatura), por lo que si no le importa usar IC, recomiendo usar RTC (reloj en tiempo real) IC o similar.

    
respondido por el user1448742

Lea otras preguntas en las etiquetas

Comentarios Recientes

Si se aumenta la marca de tiempo de eco, el usuario necesitará 32 bytes para generar el saldo de datos / TX para la primera mitad de la transacción. Por lo tanto, el usuario tendría entre 80 y 480 transacciones (40 MB), ¿deberíamos eliminar ese bono de tiempo? Tenga en cuenta que los comandos de depuración de IRC no identifican el parámetro del tiempo de propagación. Además, a diferencia de BTC IRC, generalmente realizaría la transacción concatenando / combinando direcciones (en lugar de generar una nueva... Lees verder