La función de cronómetro en MPLABX da un valor que está muy lejos de la realidad

1

Tengo un PIC16F688 corriendo a 4MHz (intosc) y necesito un retraso de aproximadamente 1 segundo. Usando este bucle for:

for (unsigned long n = 0; n < 219300; n++) {}

produce este resultado en la función de cronómetro en el simulador:

Stopwatch cleared. Stopwatch cycle count = 0 (0 ns)
Target halted. Stopwatch cycle count = 4038340 (1.009585 s)

Eso está perfectamente bien para mi aplicación.

Pero cuando ejecuto el código en un chip real, el retraso demora entre 10 y 12 segundos en lugar de 1. Esto me hizo pensar que el chip se está ejecutando en una frecuencia inferior a 4MHz, pero lo he comprobado dos veces y de hecho está funcionando a 4MHz. El simulador también está configurado para funcionar a 4MHz, por lo que no hay discrepancias aquí.

Aparte de una frecuencia demasiado baja, no puedo pensar en ningún otro error que haga que este retraso se desactive. Las interrupciones están desactivadas (INTCON = 0).

¿Alguna pista de por qué sucede esto? ¿Por qué el valor del cronómetro no coincide con la realidad?

    
pregunta bos

2 respuestas

2

Creo que la frecuencia del oscilador Rc (que es la frecuencia interna de Rc) es lo que debe usar en su cálculo y no la frecuencia de instrucción. Al ver que (4 MHz / 250 KHz) == 16, su código retrasado por 12 segundos puede atribuirse a esta falta de coincidencia.

    
respondido por el Igbokwe Danny
-1

Divide el valor entre 4. El simulador muestra Mcycles / sec not Fclock, que es 4 veces más rápido.

    
respondido por el Hans

Lea otras preguntas en las etiquetas