Usar el oscilador interno PIC

1

Estoy usando un PIC16F1824 con un oscilador externo de 4MHz. Realmente quiero usar el oscilador interno, pero el tiempo parece incorrecto.

Por ejemplo, traté de usar delay_ms (1000) y se retrasó 5 segundos en lugar del esperado 1 segundo.

¿Qué hice mal?

Hoja de datos: enlace

No tengo ni idea de leer los detalles de OSCCON:

    
pregunta mlam

4 respuestas

1

Para obtener 4 MHz, establezca el bit 6-3 de OSCCON en 1101 (página 71 de la hoja de datos).

Lo sugerí en un comentario, y aparentemente resolvió el problema.

El oscilador interno debe estar ejecutándose cuando se reinicia el dispositivo, así que simplemente tienes que cambiar esos bits y debes estar ejecutando desde 4 MHz, en lugar del cristal de 4 MHz.

    
respondido por el Leon Heller
1

Hay muchas cosas que podrían estar equivocadas entre el oscilador y, sin embargo, usted midió la demora que obtuvo. Primero, haga lo mismo con el buen oscilador de 4MHz y asegúrese de obtener la medida esperada. Luego intente con la configuración del oscilador sospechoso y vea lo que obtiene.

De todos modos, no estaría usando C y alguna posible rutina de retardo sospechoso para medir la frecuencia del oscilador. De vez en cuando quiero comprobar que el oscilador esté configurado como se espera, especialmente en los PIC con PLL y divisores complicados. Lo que normalmente hago es un bucle de escritura que alterna un pin de puerto en cada iteración, algo como:

loop
     btg   portb, 0
     bra   loop

Ese bucle toma 3 ciclos de instrucción por iteración, por lo que 6 ciclos de instrucción por período de salida y 24 ciclos de oscilador por período de salida. Ahora mire la onda cuadrada con un alcance o un medidor de frecuencia y multiplique por 24 para obtener la frecuencia del oscilador PIC después de aplicar cualquier PLL y divisores.

    
respondido por el Olin Lathrop
0

delay_ms probablemente requiere que la velocidad del reloj esté definida en algún archivo .h para que conozca la velocidad del oscilador y pueda calcular el tiempo de bucle. Si está en MPLAB, puede hacer clic derecho en la llamada de la función delay_ms y hacer clic en "GoTo Locator"; te llevará a la definición. Mire alrededor de ese archivo para ver si hay una definición en cualquier lugar que solicite la velocidad del reloj o algo similar.

    
respondido por el ajs410
0

delay_ms () confía en que usted defina correctamente XTAL en el código antes de su uso, no tiene idea de lo que ha configurado el reloj en hardware, por lo que debe indicarlo haciendo algo como XTAL 4000000 (no recuerdo de la parte superior de mi cabeza, pero eche un vistazo a los detalles de la función delay_ms (); en el manual del compilador y dirá)

ACTUALIZACIÓN:

Encontré mi código y la línea dice:

#define     _XTAL_FREQ 4000000  
    
respondido por el SimonBarker

Lea otras preguntas en las etiquetas