Autor Tema: INT_RB ingresa una sola vez a la interrupción.  (Leído 2028 veces)

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

Desconectado crdevia

  • PIC10
  • *
  • Mensajes: 1
INT_RB ingresa una sola vez a la interrupción.
« en: 06 de Marzo de 2014, 01:36:50 »
Hola, como están?
Resulta que hice un programa para probar la interrrupción RB, ya que estoy teniendo muchos problemas para hacer funcionar un teclado 4x3 y un lcd por el puerto b. Cansado de modificar librerías, decidí hacer la rutina de atención del teclado, ya que el lcd funciona bien. Como no he podido hacerlo funcionar, volví hacia atrás y me propuse probar la interrupción por cambio de nivel de RB(4 a 7). El bit 7 del puerto b, lo utilizo como salida y pruebo con los otros 3(4 a 6). Aquí suceden dos cosas extrañas: 1) Configuro el puerto B de la siguiente manera: set_tris_b(0x70), RB4 a 6 como entradas y las demás como salidas, el tema es que cuando escribo el puerto B (output_b(0), por ejemplo) el TRISB = 00. y debo volver a configurarlo, no entiendo porque. Eso lo salvé colocando de nuevo la instrucción(tengo que usar standard_io(b)?). 2) Ingresa una sola vez a la interrupción y no vuelve a ingresar. Antes que explicar cada paso, les dejo el código para ver si alguien se da cuenta que está mal. Estoy usando mplab 8.92 con CCS 4.084.
Les voy a agradecer su ayuda.

#include <18F2550.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,NOPBADEN
#use delay(clock= 4000000)       
#byte PuertoB =0x06
#byte INTCON = 0xFF2 //Dirección del registro que habilita interrupciones.
 

char bandera ='0';

#int_RB
void RB_isr(void)
{
   output_b(input_b()); //Esto sale en el datasheet, hay que leer y escribir el puerto b si o si.
   set_tris_b(0x70); //No se porque al escribir el puerto B, me borra la configuración TRISB. por eso la coloco de nuevo aquí.
   bit_clear(INTCON,3);//deshabilito interrupción por nivel.
   if(bandera == '0')
   bandera = '1'; //flag que enciende el parpadeo del Led.
   else
   bandera = '0'; //falg que apaga el parpadeo del Led.
   bit_clear(INTCON,0); //limpio el flag de interrupción RBIF
}

void main(void)
 {


//Preparo interrupción
output_high(PIN_B7); //PinB7 en alto para que no se habilite el diodo led
set_tris_b(0x70); //RB0 a RB3=salidas / RB4 a RB6=entrada / RB7=Salida
bit_set(INTCON,3); //Habilito interrupción RB
//ext_int_edge(L_TO_H); //no se si sirve para Int_RB o es solo para la interrupción de RA0
bit_set(INTCON,7); //Habilito globalmente las interrupciones

while (true)
      {
       if(bandera == '1')
       {
         delay_ms(100); //hago una espera por los rebotes       
         bit_set(INTCON,3); //habilito interrupción RB. el flag RBIF se borra a la salida de la interrupción por software
         output_low(PIN_B7); //Enciende Led
         delay_ms(1000);     
         output_high(PIN_B7);//Apaga Led
         delay_ms(1000);   
           
       }
       else
       {   
         delay_ms(100);
         output_high(PIN_B7);//Apaga Led
         bit_set(INTCON,3); //habilito interrupción RB
       }
      }
 }

se que cuando bandera=0 o 1, hay instrucciones que se repiten al cuete, pero es solo una prueba.
No pude adjuntar un archivo a pesar de ser menor a 256KB. Pero el circuito en proteus es simple, tengo un pulsador a vcc y al RB4 y de allí una resistencia a tierra. En RB7 conecto una resistencia y esta al cátodo de un led cuyo ánodo esta a Vcc. nada más. 
Desde ya les agradezco.
Saludos.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: INT_RB ingresa una sola vez a la interrupción.
« Respuesta #1 en: 06 de Marzo de 2014, 08:44:58 »
  Desde tu rutina de interrupción estás deshabilitando la interrupción del puerto B y nunca la vuelves a habilitar.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: INT_RB ingresa una sola vez a la interrupción.
« Respuesta #2 en: 06 de Marzo de 2014, 11:27:01 »
no entiendo para que es esta linea

 output_b(input_b()); //Esto sale en el datasheet, hay que leer y escribir el puerto b si o si.


otra cosa es que cuando usas el output_b, el compilador va a configurar todo tu puerto como salidas, para evitar esto usa el

#use fast_io(b);

de esta forma cuando configures tu puerto el compilador no podrá cambiarlo al usar un output_b()
"Nada es imposible, no si puedes imaginarlo"