Hola.
Estoy intentando configurar el pic 16f1938 a 32 MHz de oscilador interno.
Para ello, estoy haciendo un programilla que encienda un led 1 segundo, lo mantenga apagado 1 segundo:
__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF & WRT_OFF & VCAPEN_OFF & PLLEN_ON & STVREN_ON & BORV_25 & LVP_OFF);
...
void main()
{
OSCCON=0b11110010; // 32MHz
ANSELA=0; // Todo I/O digital
ANSELB=0;
TRISA=0x00; // Salida
LED_V = 0;
while(1)
{
LED_V = !LED_V;
Delay_1s();
}
}
void Delay_1s()
{
// Temporizacion = (65536 - Precarga)*PS*(4/fosc);
// 0.05 = (65536 - Precarga)*PS*(4/32e+6);
// 400000 = (65536 - Precarga)*8;
// 50000 = (65536 - Precarga);
// Precarga = (65536 - 50000) = 15536
// Lo pasamos a hexadecimal y resulta mas sencillo asignar TMR1H y TMR1L;
// Precarga = 15536 d = 0x3CB0;
// TMR1H = 0x3C;
// TMR1L = 0xB0;
// Configuracion del modulo Timer1
// Seleccionamos preescala:
TMR1ON = 0;
TMR1CS1 = 0; // Fuente de temporizador = frecuencia de oscilacion
TMR1CS0 = 0;
T1CKPS1 = 1; // Valor de preescala = ==> 1:8-->cada 8 ciclos cuenta 1
T1CKPS0 = 1;
int contador=20;
while(contador>=0)
{
TMR1H = 0x3C;
TMR1L = 0xB0;
TMR1IF = 0;
TMR1ON = 1;
while(!TMR1IF); // Este bucle espera a que termine la cuenta--> 50 msg
contador--;
TMR1ON = 0;
}
}
Resulta que con este codigo, el led se enciende 4 segundo, se apaga 4 segundos, es decir, que la frecuencia es de 8MHz, no me esta funcionando el PLL. Alguien me puede decir donde tengo el fallo, si tengo que activar algun bit mas o algo?
muchas gracias
un saludo