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
}
}
}