TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: javier687 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
}
}
}
-
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.
-
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
-
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.
-
Saca el printf() de dentro del código de la interrupción externa.
Esta totalmente desaconsejado usarlo dentro de la misma.