El interruptor del reloj en PIC18F4550 parece no funcionar

2

Estoy intentando cambiar de un reloj externo de 8MHz al reloj interno de 31kHz en el PIC18F4550.

este es mi código

#include <p18cxxx.h>
#include <delays.h>
#pragma config PLLDIV = 2, CPUDIV = OSC1_PLL2, USBDIV = 2,FOSC = HSPLL_HS, FCMEN =  OFF, 
IESO = ON, PWRT = OFF, BOR = OFF, VREGEN = OFF, WDT = OFF, CCP2MX = ON, PBADEN = OFF, 
LPT1OSC = OFF, MCLRE = ON, STVREN = OFF, LVP = OFF, ICPRT = OFF, XINST = ON, DEBUG = OFF, 
CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF, CPB = OFF, CPD = OFF, WRT0 = OFF, WRT1 = OFF, 
WRT2 = OFF, WRT3 = OFF, WRTC = OFF, WRTB = OFF, WRTD = OFF, EBTR0 = OFF, EBTR1 = OFF, 
EBTR2 = OFF, EBTR3 = OFF, EBTRB = OFF

int main(void) {
    long int i = 0;
    PORTB = 0;
    TRISB = 0;
    PORTB = 0;
    OSCTUNE = 0;//use internal INTRC osciallator for 32kHz clock

while (1){

    while (i++ <100000){
        PORTBbits.RB1 = ~PORTBbits.RB1;//toggle RB1 in external clock mode
    }
    i=0;//reset counter i
    OSCCON = 2;//switch clock to 32khz clock
    PORTBbits.RB5 = 1;//set RB5 high while in 32kHz mode
    while (i++<500){
        PORTBbits.RB1 = ~PORTBbits.RB1;//toggle RB1
    }
    OSCCON = 0;//set clock back to exterl oscillator
    i = 0;//reset counter
    PORTBbits.RB5 = 0;//clear RB5 while in external oscillator mode
}
return 0;

}

conecté PORTB a un alcance para ver si la forma de onda cambiaría pero no lo hizo, lo que me hace creer que no se produjo ningún cambio de reloj. No estoy seguro de dónde lo entiendo mal.

Estoy usando MPLABX con compilador C18.

EDITADO:

    
pregunta TiOLUWA

1 respuesta

2

Mirando la hoja de datos (pg32) Supongo que es porque no estás cambiando IRFC2: IRFC0 (bits 4-6 en OSCCON). IRFC controla la frecuencia del oscilador interno y, como no lo está cambiando, la forma de onda tampoco cambiará.

La confusión probablemente se debe al hecho de que este PIC tiene dos osciladores internos: alta velocidad (INTOSC) y baja velocidad (INTRC). El PIC puede generar el reloj de 31 KHz desde cualquiera de estos osciladores pero, de manera predeterminada, el valor IRFC (que determina la frecuencia del oscilador interno) es 100b, que equivale a 1MHz y utiliza el oscilador INTOSC. Debe cambiarlo a 000b para configurar la frecuencia a 31KHz y si desea asegurarse de que está usando INTRC, también debe configurar el bit INTRC (OSCTUNE: 7) a 1 (hoja de datos pág. 32 nuevamente).

Edit: Ahora me doy cuenta de que no puede ser completamente así: si el oscilador interno se configuró a 1MHz y el oscilador externo es de 8MHz, entonces debería ver algún tipo de cambio en el PORTB. Además, está configurando OSCCON a 0x02, lo que debería borrar los bits IRFC que mencioné anteriormente y establecer la frecuencia en 31KHz. Muy raro. Creo que su código debería funcionar, pero está mal comentado y está escrito de manera extraña, por lo que es difícil decirlo.

Por favor, investigue PORTC y díganos lo que obtiene. Supongo que esperas ver que PORTC se va alto mientras que la forma de onda de PORTB cambia de frecuencia, luego baja nuevamente cuando PORTB vuelve a la forma de onda original. ¿De verdad ves esto? ¿Tienes algún gráfico de la forma de onda para nosotros? Además, ¿puedes usar puntos de interrupción y ver si alguna vez se ejecutan tus instrucciones?

    
respondido por el AngryEE

Lea otras preguntas en las etiquetas