Buenas,
suelo leer el foro para las dudas que me surgen en mi primer proyecto con PIC programando en CCS. Me ha sido de mucha ayuda para el teclado y el modulo CCP o poner tablas en la EEPROM por ejemplo.
Pues bien, escribo porque ando programando un 18F4550 y los tiempos (pongamos encender/apagar un LED) no me concuerdan.
Aquí les pongo un ejemplo:
#include <18f4550.h>
#fuses MCLR //Reset encendido
#fuses XTpll //Utilizamos un crystal de alta velocidad = 4MHZ con el PLL activo
#fuses NOWDT //No vamos utilizar el perro guardián
#fuses NOPROTECT //Desactivamos la protección del código
#fuses NOLVP //Desactivamos la programación a bajo voltaje.
#fuses NODEBUG //Modo debug desactivado
#fuses PLL1 //No PLL prescaler no dividira la entrada del cristal(4Mhz)
//#fuses USBDIV //No queremos sistema postscaler
#fuses CPUDIV1 //No queremos sistema postscaler
#fuses VREGEN //Habilita el regulador de 3.3 volts que usa el módulo USB
#fuses NOPBADEN //
#use standard_io(c)
#use standard_io(b)
int8 cont=0;
#int_TIMER1 //Interrupción Timer1
void temp1s(void) //Función
{
cont++;
if (cont==20)
{output_toggle(PIN_c0);
cont=0;}
set_timer1 (15536); //recarga del TMR1
}
void main()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
set_timer1 (15536); //recarga del TMR1
enable_interrupts(INT_TIMER1); //habilita interrupcion timer1
enable_interrupts(global); //habilita interrupción general
port_b_pullups(true);
while(true)
}
Estoy utilizando el Timer 1 para contar 20 ciclos de 0.05 segundos (1s), y encender/apagar un LED que tengo en el pin C0 según la fórmula T= 4/fosc(65536-carga TMR1).
Utilizo un cristal de 4 MHz que tengo conectado con sus condensadores y conexion que me dice el datasheet del PIC.
El caso es que ya puedo cambiar los fuses que sea, ya puedo meter un cristal de 20MHz, ya puedo hacer funcionar el PIC sin cristal conectado, que en vez de 1 segundo, me hace SIEMPRE 4 segundos. Llego a la conclusion que de alguna manera tengo metida una fosc=1MHz y no hay manera de moverla.
Todo este programa con tantos fuses viene a raíz de que usando el cristal de 4MHz y la directiva #use delay(clock=4000000); al usar delay_ms(1000) también me daba 4 segundos. En cambio, si cambiaba la directiva a #use delay(clock=1000000) sí cambiaba el LED cada 1s.
La frecuencia de oscilacion en mi caso es de vital importancia porque debo tratar motores con PWM (lo haré con el modulo CCP en modo comparación).
Alguien sabe algo o le ha pasado lo mismo? es algun fuse que me dejo o utilizo mal? es cosa del 18F4550?
Cualquier duda sobre mi planteamiento sera respondida