TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: arlex en 15 de Mayo de 2010, 15:40:42

Título: problemas con interrupciones en timer 0 y 1
Publicado por: arlex en 15 de Mayo de 2010, 15:40:42
hola a todos, estoy tratando de medir las rpm de un motor haciendo uso de las interrupciones por timer0 y timer1, estoy usando un pic 18f2550, un LCD conectado al puerto B y por RA4 del pic esta la senal proveniente del motor, el problema que tengo es que cuando lo simulo en proteus no hace nada, ah estoy tabajando con el compilador CCS. el codigo que tengo hasta ahora es el siguiente:

#include <18F2550.h>
#device adc=8
#FUSES WDT1;FUSES XT;USES NOPROTECT;#FUSES BROWNOUT;#FUSES BORV20;#FUSES NOPUT;#FUSES NOCPD;                   
#FUSES STVREN;#FUSES NODEBUG;#FUSES NOLVP;#FUSES NOWRT;#FUSES NOWRTD;#FUSES IESO;#FUSES FCMEN;#FUSES NOXINST
#include <lcd.c>
#use STANDARD_IO (a)
int16 counter=0;

//**********INTERRUPCION CON TIMER_1**************
#int_TIMER1
void  TIMER1_isr(void)
{
  counter=get_timer0();                      //lectura del contador timer0
  counter=counter*2*120;
  lcd_gotoxy(1,1);                              //conversion a rpm
  printf(lcd_putc,"%6lu rpm", counter);
  set_timer0(0);                                 //reinicia cuenta
  set_timer1(3036);                           //recarga a 0.5s
 
}

void main()
{
   
//   setup_adc_ports(NO_ANALOGS|VSS_VDD);
//   setup_adc(ADC_OFF);
//   setup_timer_2(T2_DISABLED,0,1);
//   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
//   setup_comparator(NC_NC_NC_NC);
//   setup_vref(FALSE);
//   Setup_Oscillator parameter not selected from Intr Oscillotar Config tab

   lcd_init();
   lcd_gotoxy(2,1);
   lcd_putc("tacometro");
   setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   set_timer0(0);
   set_timer1(3036);
   enable_interrupts(int_timer1);
   enable_interrupts(global);
}

Cuando compilo el programa me arroja los siguientes warning:
interrupts disabled during call to prevent re-entrancy (lcd_putc)
interrupts disabled during call to prevent re-entrancy (lcd_gotoxy)

si en el codigo de interrupcion coloco como comnetaio lo que esta escrito en rojo desaparacen los warning, pero igual no consigo simular el circuito.

no se donde estara el problema espero que me puedan ayudar
Título: Re: problemas con interrupciones en timer 0 y 1
Publicado por: RedPic en 15 de Mayo de 2010, 15:57:16
Arlex,

Hay varias ideas importantes que no se nos pueden olvidar cuando trabajamos con las interrupciones. La primera y fundamental: "Dentro de la interrupción haz lo estrictamente necesario, lo demás debe ir fuera".

En tu caso debes utilizar la interrupción para obtener el valor del timer que necesitas, y nada más. Ten en cuenta que por un lado es mas que probable que el manejo del LCD te interfiera con la interrupción y que tanto el LCD como el printf son lentos y devoradores de ROM. BNo es lógico tener todo ese código "embutido" en el manejo de la interrupción.

Dale un vistazo a distintas formas de medir pulsos que hice con mis ejemplos en la serie: Serie Técnicas en C : Presentación e Indice de Contenidos (http://www.todopic.com.ar/foros/index.php?topic=14427.0)

Midiendo un pulso. 1ª Parte. Tiempo en Alto con INTEXT (http://www.todopic.com.ar/foros/index.php?topic=14428.0)
Midiendo un pulso. 2ª Parte. Tiempo en Alto con INTCCP (http://www.todopic.com.ar/foros/index.php?topic=14479.0)
Midiendo un pulso. 3ª Parte. Tiempo en Alto con INTRB (http://www.todopic.com.ar/foros/index.php?topic=14528.0)
Midiendo un pulso. 4ª Parte. El pulso completo. El Periodo y la Frecuencia (http://www.todopic.com.ar/foros/index.php?topic=14434.0)

Después, si quieres, podemos ir depurando tu aplicación.  :mrgreen:

Título: Re: problemas con interrupciones en timer 0 y 1
Publicado por: arlex en 15 de Mayo de 2010, 23:15:24
gracias red pic, no se pueda estar el problema que no consigo que el siguiente codigo no me funcione en la simulacion, el mismo codigo lo probe con el pic16f870 16f84A y funciona correctamente el programita lo que mide es la frecuencia aplicada por RA4,  uando pruebo con el 18f2550 no funciona aparace frecuencia 0

 
#include <lcd.c>
#byte timer0=1
unsigned long a=0,b=0;

#int_RTCC
void  RTCC_isr(void)

 b=256;
}


void main()
{
   setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
   lcd_init();
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   lcd_putc("Frecuencimetro 500Hz");
   timer0=0;
   while(true){
       delay_ms(1000);
       a=timer0+b;
       lcd_gotoxy(1,0);
       printf(lcd_putc,"F=%Ld",a);
       b=0;
       timer0=0;
       output_c(0xff);
 
 }
   // TODO: USER CODE!!
}