Autor Tema: problemas con interrupciones en timer 0 y 1  (Leído 3979 veces)

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

Desconectado arlex

  • PIC10
  • *
  • Mensajes: 49
problemas con interrupciones en timer 0 y 1
« 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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: problemas con interrupciones en timer 0 y 1
« Respuesta #1 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

Midiendo un pulso. 1ª Parte. Tiempo en Alto con INTEXT
Midiendo un pulso. 2ª Parte. Tiempo en Alto con INTCCP
Midiendo un pulso. 3ª Parte. Tiempo en Alto con INTRB
Midiendo un pulso. 4ª Parte. El pulso completo. El Periodo y la Frecuencia

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

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado arlex

  • PIC10
  • *
  • Mensajes: 49
Re: problemas con interrupciones en timer 0 y 1
« Respuesta #2 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!!
}