Autor Tema: Entrada de oscilador al TMR1  (Leído 2415 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado micro_carp

  • PIC10
  • *
  • Mensajes: 13
Entrada de oscilador al TMR1
« en: 31 de Marzo de 2012, 17:47:21 »
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);
   }

 }


Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Entrada de oscilador al TMR1
« Respuesta #1 en: 02 de Abril de 2012, 06:19:50 »
Hola, yo lo único que te puedo decir es que tengas cuidado con el delay_ms, porque provoca retardos en la atención de interrupciones muchas veces, has probado el mismo código sin él?

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Entrada de oscilador al TMR1
« Respuesta #2 en: 02 de Abril de 2012, 20:49:40 »
Hola

Que sepa, los delay dan problema cuando se usan dentro de la interrupción y en este caso no es así; por lo que creo que no va por ahi.

A mi me paso algo similar con un PIC12F ... el oscilador era inestable ... y la verdad deje tirado eso ahí ... no se si al conectar la carcasa del cristal a GND ayude o hacer un plano de masa .... pero, como trabajaba con una protoboard, no seguí mas.

Saludos
El papel lo aguanta todo

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Entrada de oscilador al TMR1
« Respuesta #3 en: 03 de Abril de 2012, 04:56:01 »
Hola, tiene sentido lo que dices MLO_, aunque de todas formas yo he tenido problemas con los delay_ms e interrupciones y al acortar el delay o quitarlo desaparecieron.
Pues tiene sentido que tengas espureos que se acoplen por las líneas de masa y desequilibren el VCO modificando capacidades.  De todas formas en este caso tendría que ser un fallo del entrenador que usas  :?.


 

anything