De acuerdo al fabricante, es posible hacer un reloj en tiempo real con el TMR1, un cristal de 32... Khz y dos condensadores. La conexion se presenta en el mismo manual del PIC con el cual quiero trabajar (16F877).
Hago mis pruebas con una tarjeta de desarrollo EasyPic7 y compilador Mikroc. Pero tengo el inconveniente que no genera 1 segundo como esperaría. A mi parecer se generan interferencias o algo asi, ya que si acerco mi dedo a la tarjeta, esta oscila mas y si retiro el cristal la oscilacion continua pero con un tiempo diferente. A alguien le ha pasado esto?
Dejo el programa que he creado para que lo revisen.
-----------------------------------------------------------------------
void interrupt() {
if (PIR1.TMR1IF==1){ //Detectar interrupción por desbordamiento de TRM1
PIR1.TMR1IF=0; //Reset flag de interrupción de TMR1
T1CON.TMR1ON=0; //Apagar TMR1
TMR1H=0X80; //Cargar TMR1H y TMR1L
TMR1L=0x00;
T1CON.TMR1ON=1; //Encender TMR1
PORTB.F1=~(PORTB.F1); //Cambiar estado de bit1 PORTB
INTCON.PEIE=1; //Habilitar interrupcion de perifericos
INTCON.GIE=1; //Habilitar interrupcion general
}
}
//--------------------------- RUTINA PRINCIPAL ---------------------------------
void main() {
TRISB=0; //Configurar puerto B como salida.
TRISC.F0=TRISC.F1=1;//RC0(T1OSI) Y RC1(T1OSO) como entrada de oscilador
PORTB=0X00;
//Configurar TMR1 para trabajar con oscilador externo.
T1CON.TMR1ON=0; //Desabilitar TMR1 antes de configurarlo
TMR1H=0X80; //Cargar TMR1H y TMR1L
TMR1L=0X0;
PIR1.TMR1IF=0; //Limpiar flag overflow timer1
PIE1.TMR1IE=1; //Habilitar interrupcion por desbordamiento de TMR1
INTCON.PEIE=1; //Habilitar interrupciones de perifericos
INTCON.GIE=1; //Habilitar interrupciones generales
T1CON=0b00001110;
//<0> TMR1ON: Deshabilitar TMR1
//<1> TMR1CS: Habilitar la fuente externa del reloj
//<2> T1SYNC: No sincronizar la fuente externa con la interna
//<3> T1OSCEN: Habilitar los pines para entrada del oscilador.
//RC0 y RC1 pasan a ser entradas del oscilador externo
//<4,5> T1CKPS1 T1CKPS0: Prescaler 1:1
T1CON.TMR1ON=1; // Habilitar TMR1.
while(1){
PORTB.F0=~PORTB.F0;
Delay_ms(100);
}
}