Me gustaría ejecutar un Microchip PIC18F25K50 a su velocidad máxima de 48MHz desde su oscilador interno.
Aquí está la descripción general del sistema del oscilador de la hoja de datos:
Los16MHzdesdeelHFINTOSCsepuedenenviardirectamentealaCPUconfigurandoSCS=0b10
(INTOSC).Alhacerlo,obtengoexactamenteloqueespero:
Mi código alterna una salida, y los pulsos tienen un ancho de ~ 250ns / 4MHz, que es la velocidad de ejecución de la MCU de 16MHz / 4.
Ahora, el INTOSC de 16MHz también se alimenta al módulo del reloj principal, por lo que habilitar el PLL 3x, establecer el poscaler PLL en / 1, y elegir SCS=00
(reloj primario) debe dar una velocidad de ejecución del reloj de 48MHz / 12MHz.
Sin embargo, eso no funciona. La MCU muestra una sensibilidad capacitiva extrema, normalmente no produce ningún impulso. Cuando pongo mis manos cerca o incluso las toco, comienza a producir pulsos de varias, pero extremas longitudes. Para mí, parece que el MCU de alguna manera atrapa el ruido y deriva su reloj. Por cierto, también pasé por alto el PLL en CFGPLLEN=0
, eso no cambia nada.
¿Alguien sabe cómo ejecutar el MCU a 48MHz desde el oscilador interno?
Aquí están mis bits de configuración:
// CONFIG1L #pragma config PLLSEL = 1 // PLL multiplier: 0->4x 1->3x #pragma config CFGPLLEN = 0 // PLL enabled? #pragma config CPUDIV = 0 // CPU Clock divider: 0-> No divider #pragma config LS48MHZ = 1 // USB clock: System@48MHz->0 System@24MHz->1 // CONFIG1H #pragma config FOSC = 0b1001 // OscillatorConfig: InternalOscClockOut->1001 #pragma config PCLKEN = 0 // Primary clock: disable by software ->0 alwaysEnabled->1 #pragma config FCMEN = 0 // Fail-Safe Clock Monitor? #pragma config IESO = 0 // Internal/External Oscillator Switchover?
y aquí mi código:
void main(void) { OSCCONbits.IRCF=0b111; // No divide -> 16MHz OSCCONbits.SCS=0b00; // Primary clock //OSCCONbits.SCS=0b10; // INTOSC ANSELA=0; //Make PortA digital TRISAbits.TRISA0=0; //Make PortA output while (1){ LATAbits.LA0=1; LATAbits.LA0=0; LATAbits.LA0=1; LATAbits.LA0=0; } }