Autor Tema: ERROR con la sentencia interrupts global  (Leído 1155 veces)

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

Desconectado javier687

  • PIC10
  • *
  • Mensajes: 5
ERROR con la sentencia interrupts global
« en: 20 de Octubre de 2016, 17:45:05 »
distinguidos colaboradores, les dejo una inquietud, hace poco retome la compu para programar pic en ccs compiler v 4.130.
tengo problemas con la sentencia enable_interrupts(global), si quito ésta, funciona el programa pero no así las interrupciones, al colocarla funcionan las interrupciones pero el resto del programa nada!.
pfv si alguien cuanta con algo de tiempo para indicarme caminos a seguir o probar les agradeceré
#include <16F628A.h>
#use delay(clock=4000000)
#fuses NOWDT, HS, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD
#include <flex_lcd2.C>

#define trig pin_B1
#define echo pin_B0
#define ON    output_high
#define OFF   output_low
#define   BASE1MS      4 ;  // con prescaler1 : 8 para 16mhz  // 4 para 4 mhz
#define   BASE10MS     10 ;
#define   BASE100MS    10 ;
#define   BASE1S       10 ;
#define   BASE1m       60 ;

CONST INT ESTADO[10]={0,1,2,3,4,5,6,7,8,9};  //REFERENCIA DE ESTADOS
INT MUESTREO = 150;  //MUESTREO DE BOTON
char fBotSW1=1;
int cntBotSW1;
char fBotSW2=1;
int cntBotSW2;
INT ESTADOA,ESTADOB,ESTADOC,ESTADOD;  /// VARIABLE CONTROLADORAS DE ESTADO
int   Tic1ms = 4 , Tic10ms=10 , Tic100ms=10 , Tic1s = 10 ,Tic1m = 60 ;
int    Tiempo1ms , Tiempo10ms , Tiempo100ms , Tiempo1s ,Tiempo1m ;
int16 distancia, tiempo;

#int_EXT
void  EXT_isr(void)
{
tiempo=get_timer1();
distancia=(tiempo*10)/(58.0);
printf(LCD_PUTC, "\fTiempo :%Lu \nDistancia = %Lu",tiempo,distancia);
delay_ms(5);
}


#int_TIMER0
void  TIMER0_isr(void)
{
   set_timer0(29);//...............         C A D A   6 2 , 5 us     
//......................................
   if( -- Tic1ms==0){Tic1ms=BASE1MS;if(Tiempo1ms>0){--Tiempo1ms; }
//...................................... cada 1ms
//......................................
   if(--Tic10ms==0){Tic10ms=BASE10MS;if(Tiempo10ms>0){--Tiempo10ms;}
//......................................       C A D A   1 0 m s     
//......................................
   if(--Tic100ms==0){Tic100ms=BASE100MS;if(Tiempo100ms>0){--Tiempo100ms;}
//......................................       C A D A   1 0 0 m s 
//......................................
   if(--Tic1s==0){Tic1s=BASE1S;if(Tiempo1s>0){--Tiempo1s;}
//......................................       C A D A   1 s e g
//......................................
   if(--Tic1m==0){Tic1m=BASE1m;if(Tiempo1m>0){--Tiempo1m;}
//......................................       C A D A   1 s e g
   }}}}}
if (input(PIN_B1)==0) {cntBotSW1++;IF(cntBotSW1>=muestreo){fBotSW1=0;cntBotSW1=0;}
    }else{IF(cntBotSW1>0){cntBotSW1--; fBotSW1=1;}}
       
if (input(pin_B2)==0) {cntBotSW2++;IF(cntBotSW2>=muestreo){fBotSW2=0;cntBotSW2=0;}
    }else{IF(cntBotSW2>0){cntBotSW2--; fBotSW2=1; }}   
   
   
   }

//————————————————————————————————————————————————————————————
void main(void)
{
 setup_comparator(NC_NC_NC_NC);
 setup_vref(FALSE); // turn of ADC channels
 set_tris_b(0b00001111);
 set_tris_a(0b11111100);
 lcd_init();
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2|RTCC_8_bit);      //51.2 us overflow
 setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
 enable_interrupts(global);
 enable_interrupts(INT_EXT);
 EXT_INT_EDGE(L_TO_H);
 enable_interrupts(INT_TIMER1);
 enable_interrupts(INT_TIMER0);
 
 
 while( TRUE )
 {
 
 
  switch (ESTADOA)
{
case (ESTADO[0]): {printf(lcd_putc,"\f    INICIO ");delay_us(25);IF(fBotSW2==0){ESTADOA++;}}
break;
case (ESTADO[1]): {IF(fBotSW1==0){printf(LCD_PUTC, "\f MENU");delay_us(25);
                      if (fBotSW2==0){ESTADOA++;}else {if (tiempo1s==0){ESTADOB=0;}}}}
break;
case (ESTADO[2]): {printf(LCD_PUTC, "\f Calib. Maximo");delay_us(25);
                      if(fBotSW2==0){ESTADOA++;}}
break;
case (ESTADO[3]): {IF(fBotSW1==0){printf(LCD_PUTC, "\f Calib. Minimo");delay_us(25);ESTADOA++;}}
break;
case (ESTADO[4]): {IF(fBotSW1==0){ESTADOA=0;}}
break;
// ... continuamos
default:
ESTADOA = ESTADO[0]; //Si por alguna razón un estado indefinido ocurre   

}
     //if(Tiempo1s==0){output_high(trig);delay_us(10);
      //output_low(trig);Tiempo1s=1;set_timer1(0);} 

switch (ESTADOB)
{
case (ESTADO[0]): {}
break;
case (ESTADO[1]): {printf(LCD_PUTC, "\f EN ESPERA \n BY MANTENIMIENTO");delay_us(25);}
break;
case (ESTADO[2]): {}
break;
case (ESTADO[3]): {}
break;
// ... continuamos
default:
ESTADOB = ESTADO[0]; //Si por alguna razón un estado indefinido ocurre   
}
}
 }
 



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:ERROR con la sentencia interrupts global
« Respuesta #1 en: 20 de Octubre de 2016, 17:51:09 »
Para probar si es un problema del compilador, te sugiero que cambies por un momento el codigo de la interrupcion.

Trata de encender y apagar un led dentro de la interrupcion. Sin delays! . Si eso funciona entonces el problema es el codigo.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:ERROR con la sentencia interrupts global
« Respuesta #2 en: 20 de Octubre de 2016, 21:36:47 »
Para mi el problema puede estar en la interrupcion por timer 0, para probar si es asi, no utilices esa interrupcion y deja la INT_EXT habilitada (y habilita las interrupciones globales), si te funciona el codigo entonces el problema es debido a un poroblema de programacion.  :?
Prueba y nos dices que paso primero antes de extenderme  :D

De momento ando algo atariado.

Saludos

Desconectado javier687

  • PIC10
  • *
  • Mensajes: 5
Re:ERROR con la sentencia interrupts global
« Respuesta #3 en: 21 de Octubre de 2016, 15:26:36 »
si muchachos ya probé contando las interrupciones de a una, y con cualquiera de ellas pasa lo mismo, si no habilito la interrupción global funciona bien, pero no funcionan las interrupciones.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re:ERROR con la sentencia interrupts global
« Respuesta #4 en: 21 de Octubre de 2016, 18:19:09 »
Saca el printf() de dentro del código de la interrupción externa.
Esta totalmente desaconsejado usarlo dentro de la misma.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.