Autor Tema: ccs interrupcion RB no haze reentrada  (Leído 1101 veces)

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

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
ccs interrupcion RB no haze reentrada
« en: 02 de Junio de 2016, 16:52:36 »
Mal concepto
Tengo esta interrupcion de la sigiente manera
Código: [Seleccionar]
#INT_RB
void  RB_isr(void){
lee=Input_B () & 0XF0; 
//lcd_gotoxy(1,2); printf(lcd_putc,"lee %x    ",lee);  delay_ms(1500);
switch(lee){
case 0x10 : if(krz>2){ krz-=2; } break;//Disminulle Carencia (mini 0.02)FUEGO+RAPIDO
case 0x20 : if(krz<250){ krz+=2; } break;//AUMENTA Carencia (maxi 25.0)FUEGO+LENTO
case 0x30 : rk=r1-1; rkar=1; break;//FUERZA RECARGA en 2 segundos
case 0x40 : rkar=1; if(r1>15){ r1-=10; } break;//Disminulle Tiempo de RECARGA (minimo 5.0)
case 0x80 : if(r1<240){ r1+=10; } break;//AUMENTA Tiempo de RECARGA (maxi 250.0)
}//switch(lee)
lee=0;
clear_interrupt(INT_RB);
}
Estos CASE xx : corresponden con el binario enviado por diferentes BUTTON y todas las variables se muestran en LCD Comprendo que no se muestren si estoy continuamente pulsando cualquiera de los botones inplicados porque esta continuamente encerrado en INT RB y no podra hazer nada mas el programa mientras "b4 a b7 >0"
pero no entiendo porque solo les afecta una sola vez
si mantengo el binario 0x80 en portb durante un tiempo prolongado ¿RB deberia estar ejecutandose una y otra vez? una vez que dejo de pulsarlo porque r1 solo se incrementa +10; porque el lcd no muestra un incremento mucho mayor?

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:ccs interrupcion RB no haze reentrada
« Respuesta #1 en: 03 de Junio de 2016, 07:59:47 »
Hola como va a mi me parece que el clear_interrupt no es necesario ya que es automatico, por otro lado deberias poner un caso por defecto para cuando lee no esta comprendido dentro de las opcion del case. yo usaria en vez de case el bit_test, es mas directo

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:ccs interrupcion RB no haze reentrada
« Respuesta #2 en: 03 de Junio de 2016, 16:22:50 »
No conocia el bit_test pero por lo que veo me sirve igualmente meter lee=(Input_B () & 0XF0)>>4; dentro del mismo codigo. Cosa que queria evitar. La interrupcion es a intencion de no estorbar al codigo principal mientras no pulse button. Por lo que me an contado todos los compiladores no tienen el mismo defecto en mi caso el clear_interup con el timer fijo. un case: default no sirve en este caso para nada lo ideal es que no se cumpliese RB si es default

E mejorado esto implementando timer0 a RB como varrido de teclado. El resultado es similar al que hace el teclado de PC pulsas una tecla y opera, si continuas pulsando al cavo de cierto tiempo opera de manera continuada y mas rapido.
pero sige sin esplicarme por que rb se queda solo encerrado dentro de si mismo sin hacer nada.

Código: [Seleccionar]
#INT_RB//
void  RB_isr(void){
 clear_interrupt(INT_RB);
disable_interrupts(INT_RB); //RB se desactiva a si mismo
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
SET_TIMER0(1);
//es mejor no utilizar aqui clear_interrupt(INT_TIMER0); si lo hago el timer0 tardara en responder
//sin el clear actua de inmediato
enable_interrupts(INT_TIMER0);//Activa timer0
//enable_interrupts(global);
 clear_interrupt(INT_RB);
}
int1 puls=0;
int1 init=0,resul=0;
int1 trampa=0;//=1 datos que no debe mostrar
int1 mfin=0;//=1 muestra donde esta bola a prisionar boton-respuesta "case 1"
int mle=0;
int tolera=10;//tolerancia de error (+ - )
void tole(int1 t);
void defecto();
void estatico(trp);
void seesmilla(int16 semi);//mira la semilla inicial que impide que randon siempre empieze igual
#INT_TIMER0
void timer0(){
output_toggle(PIN_A2);
output_high(PIN_A3);
puls=1;
mle=lee;//se comprueva sise pulsa misma tecla
lee=(Input_B () & 0XF0)>>4;
switch(lee){
case 1 :
if(!init){  init=1; }
else { resul=1; }
break;
case 2 :
init=0; xg=5; yg=38;  break;
case 3 :
mle=0;
puls=0;//no se acepta como pulsada
output_low(PIN_A3);
disable_interrupts(INT_TIMER0);
//clock0(0); //anula timer1 retrasando RB=true 1.2 sg
if(!trampa){
texto="TRAMPA "; glcd_text57(5,38,texto,1,on);
texto=" TRUE ";  trampa=1;
} else {
texto="Trampa "; glcd_text57(5,38,texto,1,on);
texto=" False "; trampa=0;
}
glcd_text57(5,55,texto,1,on);
delay_ms(1100);
//glcd_text57(5,55,texto,1,off);
estatico(trampa);
ext_int_edge(l_to_h);//alto
clear_interrupt(INT_RB);
enable_interrupts(INT_RB);
break;
case 4 :  yg--;  break;
case 5 : yg++; break;
case 6 : if(vol<7){ vol++; xg++; glcd_circle(xg,yg,vol,on,off);  } break;

case 7 : xg--;  break;
case 8 : xg++;  break;

case 9 : if(vol>1){ glcd_circle(xg,yg,vol,on,off); vol--; xg--;  } break;

case 10 : if(tolera>1){ tole(0); } break;
case 11 : if(tolera<71){ tole(1); } break;

case 12 : defecto(); break;
case 13 :
mle=0; lee=0;
puls=0;//no se acepta como pulsada
output_low(PIN_A3);
disable_interrupts(INT_TIMER0);
set_adc_channel(0);
seesmilla(read_adc()); break;//mira la semilla inicial que impide que randon siempre empieze igual (y genera varios)
case 14 :
if(!mfin){
texto="FIN-VISUAL "; glcd_text57(5,44,texto,1,on);
texto=" TRUE ";  mfin=1;
} else {
texto="Fin-visual "; glcd_text57(5,44,texto,1,on);
texto=" False ";  mfin=0; }
glcd_text57(5,56,texto,1,on);
break;

//Aqui si es muy importante el default:
default://lee=0 u otras teclas no definidas (no se pulsa button)
mle=0;
puls=0;//no se acepta como pulsada
output_low(PIN_A3);
disable_interrupts(INT_TIMER0);//Timer0 se desactiva a si mismo
ext_int_edge(l_to_h);//alto 
clear_interrupt(INT_RB);
enable_interrupts(INT_RB);//Activa RB el teclado podra a volver a interrumpir cuando quiera
break;
}
if(puls && mle==lee){ setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); }// misma tecla a anterior reduce tiempo de barrido //else { j1=1; }
SET_TIMER0(1);
}
   

Luego esta que esto solo va con un solo micro si lo implemento en el proyecto anterior, Proteus se traba con varios micros y no responde

Saludos


 

anything