TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: newells5 en 27 de Marzo de 2006, 04:14:00

Título: problemillas con el TMR1
Publicado por: newells5 en 27 de Marzo de 2006, 04:14:00
La idea del ejercicio es que divida una frecuencia entre 4. Le meto una señal "f" por RC0 para que salga una señal "f/4" por RB0. Yo creo que esta bien pero no funciona, a ver si veis algun fallo...


#include <16F877.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)

int a;


#int_timer1      //interrupcion del TMR1
   void cuenta()
   {
   disable_interrupts(GLOBAL);      //deshabilito las interrupciones por seguridad
      a=!a;      //cada vez que i=4 cambio el valor de a
   set_TIMER1(0xFFFC);      //cargo el TMR1 para que se desborde al contar 4
   }




void main()      //PROGRAMA PRINCIPAL
{
   set_TRIS_C(00000001);      //RC0 como entrada de pulsos para TMR1
   set_TRIS_B(11111110);      //RB0 como salida del divisor
   SETUP_TIMER_1(T1_EXTERNAL);   //TMR1 cuenta segun pulsos externos
   disable_interrupts(GLOBAL);      
   enable_interrupts(int_timer1);
   set_TIMER1(0xFFFC);         //cargo TMR con FFFC para que se desborde al contar 4
   enable_interrupts(GLOBAL);
   

   do
   {
      
      if(a=0)               //si a=0...
         output_b(0x01);      //...salida=1
      if(a=1)               //si a=º...
         output_b(0x00);      //...salida=0
      enable_interrupts(GLOBAL);
   }while(true);               //bucle infinito
}
Título: RE: problemillas con el TMR1
Publicado por: maunix en 27 de Marzo de 2006, 05:46:00
Escrito originalmente por newells5

Codigo:

#int_timer1      //interrupcion del TMR1
   void cuenta()
   {
   disable_interrupts(GLOBAL);      //deshabilito las interrupciones por seguridad
      a=!a;      //cada vez que i=4 cambio el valor de a
   set_TIMER1(0xFFFC);      //cargo el TMR1 para que se desborde al contar 4
   }






Porque deshabilitas las interrupciones globales en la rutina de interrupcion?  Esto lo hace el pic automáticamente!!

Título: RE: problemillas con el TMR1
Publicado por: newells5 en 27 de Marzo de 2006, 06:10:00
Ya lo he solucionado.

He metido el bucle de cambio 0 --> 1 y 1 --> 0 dentro de la interrupcion y funciona bien.

Suponogo que el problema venia porque salia de la interrupcion y antes de ejecutar el bucle volvia a entrar.
Título: RE: problemillas con el TMR1
Publicado por: maunix en 27 de Marzo de 2006, 21:01:00
Escrito originalmente por newells5
Ya lo he solucionado.

He metido el bucle de cambio 0 --> 1 y 1 --> 0 dentro de la interrupcion y funciona bien.

Suponogo que el problema venia porque salia de la interrupcion y antes de ejecutar el bucle volvia a entrar.


De todas formas hazme caso y no uses el deshabilitar las interrupciones globales justamente en la rutina de interrupcion porque no tiene sentido! ya que esto es realizado automáticamente por el PIC.

Luego uno debe hacer un retfie (esto si que hay que hacerlo manualmente) con lo cual se vuelve a reactivar el GIE.  Eso si, lo de usar el RETFIE lo hace solito el C por lo cual no debieras preocuparte.