¿Es posible habilitar tanto UART como PLL al mismo tiempo en PIC18F?

1

Estoy haciendo una aplicación en la que enciendo algunos ws2812 LED con mi microcontrolador pic y quiero que hable con mi teléfono inteligente a través de bluetooth. Ahora, tengo el código para los LEDs de

enlace

y puedo iluminar los LED con los colores que quiero (a través de la codificación de un valor RGB) y por separado, puedo enviar un mensaje a mi teléfono (a través del terminal bluetooth) y mi microcontrolador recibe el mensaje completo (inspeccionado por el depurador ).

Sin embargo, el problema es cuando pongo los dos juntos. El código LED que obtuve requiere que se habilite el PLL, pero estoy descubriendo que cuando coloco la línea para habilitar el PLL

OSCTUNEbits.PLLEN=1;

el mensaje de recepción del microcontrolador se confunde.

Ya intenté encender y apagar el PLL después de que el microcontrolador recibe el mensaje, es decir,

//Receives the message from smart phone      
for(i=0;i<10;i++){
            while(!RCIF);
            receiveArray[i]=RCREG;
 }
 //Turns on lights
 OSCTUNEbits.PLLEN=1;
 OSCCONbits.IRCF = 0b110; 
 SetAllRGB(0,0,100);
 writePinMain(0);
 DelayMs(5000);    
 OSCTUNEbits.PLLEN=0;
 OSCCONbits.IRCF = 0b000; 

Sin embargo, esto hace que los colores de los LED sean inexactos, lo que me lleva a creer que la frecuencia está desactivada o que el PLL se ha estropeado.

También debo tener en cuenta que el código se ejecuta en un XTAL_FREQ de 8MHz. Los bits de configuración no han cambiado en absoluto cuando cambié entre la iluminación LED y el código UART (comente uno u otro), así que no creo que los bits de configuración sean un problema, pero aparte de eso, me he quedado sin ideas sobre lo que podría causar esto.

¿Hay algo que no estoy viendo?

    
pregunta cheunste

1 respuesta

2

Como ya lo han señalado los comentarios, debe ajustar la configuración de la velocidad en baudios para que el UART tenga en cuenta el cambio en la frecuencia en un factor de 4. Normalmente uso algo como

// baudrate = ~115,2k
if (PLLEN) {
    SPBRGH1 = 0x00;
    SPBRG1 = 0x89;
} else {
    SPBRGH1 = 0x00;
    SPBRG1 = 0x22;
}

en mi inicialización de UART para que siempre funcione (por supuesto, primero debes configurar PLLEN).

    
respondido por el Tobias Müller

Lea otras preguntas en las etiquetas