Autor Tema: #int_TIMER1 con #int_EXT  (Leído 2944 veces)

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

Desconectado lycans2005

  • PIC10
  • *
  • Mensajes: 23
#int_TIMER1 con #int_EXT
« en: 26 de Julio de 2013, 14:13:10 »
el problema es que la interrupción del timer no se habilita, he puesto a encender otros led hacer otras cosas en la misma interrupcion externa, pero no se
porque no se habilita, solo funciona en el while principal...


#include <16F628A.h>
#FUSES NOWDT, XT, NOPUT
#use delay(internal=4000000) //Frecuencia de reloj
#use fast_io(A)
#bit RB0=0x06.0     //Identificadores de bits
#bit RB1=0x06.1
#bit movil=0x06.2
#bit sirena=0x06.3
#bit RB7=0x06.7
               

//#define movil    PIN_B2     
//#define sirena   PIN_B3
                             
#DEFINE T_CLAVE 76             // Tiempo para ingresar clave. 20 segundos = 76 
 int contador=0;   
//--------------- Interrupcion Externa ----------------------------------------     
#int_EXT                       
void EXT_isr(void){                 
     if (RB1){                               // Si el interruptor de desactivación está abierto
         RB7=1;                              // activa la alarma conectada en RB7
         enable_interrupts(INT_TIMER1);      // Habilita interrupcion     
                 
      while(RB1);                            // mientras el RB1=1 bucle infinito
           RB7=0;                            // cuando RB1=0, se desacactiva la alarma
           disable_interrupts(INT_TIMER1);   // deshabilita la interupcion                                         
   }                                           
}                         
//--------------- Interrupcion Tiempo1 ----------------------------------------                                     
#int_TIMER1                                   
void TIMER1_isr(void){                                //                                   
     contador++;                                        //  Variables que simulan la cuenta de segundos para que la persona                                                                                                             
     if(contador==T_CLAVE)           ////  Marca el tope de segundos o intentos.
       {                   
     
          movil=1;       
   
        }                                                           
                                           
}       
//--------------- Programa Principal ------------------------------------------                                   
                                         
void main(){                                                   
     set_tris_b(0b00000011);                 // configura la puerta B  (RB7-RB0)
     //output_b(0b00000011);                               
     RB7=0; movil=0;sirena=0;                                 // inicializo RB7
     setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // 
     enable_interrupts(GLOBAL);              // habilito interrupción global
     enable_interrupts(INT_EXT);             // habilito interrupción externa
     disable_interrupts(INT_TIMER1);         //
     while(true);                          // Bucle infinito hasta interrupción     
     // while(1){                              // Ciclo Infinito 
//------------- Lectura de estado de los Sensores -----------------------------         
                         
    }
}
 
               
               
               

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: #int_TIMER1 con #int_EXT
« Respuesta #1 en: 26 de Julio de 2013, 14:20:18 »
Esta claro, cuando accedes a la interrupcion #INT_EXT() al valer cuando RB! valga cero deshabilitas la interrupccion del timer como lo colocas aqui:

Citar
while(RB1);                            // mientras el RB1=1 bucle infinito
           RB7=0;                            // cuando RB1=0, se desacactiva la alarma
           disable_interrupts(INT_TIMER1);   // deshabilita la interupcion         

Saludos

Desconectado lycans2005

  • PIC10
  • *
  • Mensajes: 23
Re: #int_TIMER1 con #int_EXT
« Respuesta #2 en: 26 de Julio de 2013, 14:28:48 »
Esta claro, cuando accedes a la interrupcion #INT_EXT() al valer cuando RB! valga cero deshabilitas la interrupccion del timer como lo colocas aqui:

Citar
while(RB1);                            // mientras el RB1=1 bucle infinito
           RB7=0;                            // cuando RB1=0, se desacactiva la alarma
           disable_interrupts(INT_TIMER1);   // deshabilita la interupcion         

Saludos


Pero cuando  valga 1 de igual no la activa

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: #int_TIMER1 con #int_EXT
« Respuesta #3 en: 26 de Julio de 2013, 14:38:53 »
si RB1 = 1, mas abajo llegas a donde dice:
 
Citar
while(RB1);                            // mientras el RB1=1 bucle infinito

Entonces mientras se mantenga en 1 entra a un lazo infinito y nunca sales de la interrupcion  :mrgreen:
Recuedar que cuando entras a una rutina de interrupcion el bit GIE se hace cero deshabilitando todas las interrupciones posteriores que podrian suceder  :-)
He alli tu problema  :mrgreen:

Saludos

Desconectado lycans2005

  • PIC10
  • *
  • Mensajes: 23
Re: #int_TIMER1 con #int_EXT
« Respuesta #4 en: 26 de Julio de 2013, 14:44:13 »
si RB1 = 1, mas abajo llegas a donde dice:
 
Citar
while(RB1);                            // mientras el RB1=1 bucle infinito

Entonces mientras se mantenga en 1 entra a un lazo infinito y nunca sales de la interrupcion  :mrgreen:
Recuedar que cuando entras a una rutina de interrupcion el bit GIE se hace cero deshabilitando todas las interrupciones posteriores que podrian suceder  :-)
He alli tu problema  :mrgreen:

Saludos

ohhh super, soy muy nuevo en esto, muchas gracias, pero entonces como soluciono el problema? quiero que cuanto RB0 halla un 1 se dispare el timer y comience un conteo para activar una alarma


#include <16F887.h>
#FUSES NOWDT, XT, NOPUT
#use delay(clock=4000000)//Frecuencia de reloj
#use fast_io(A)
#bit RB0=0x06.0     //Identificadores de bits
#bit RB7=0x06.7
#bit RB1=0x06.1
int cont=0, seg=0;             
short ban_1seg=0;               
void temporizar();               
 //-------------- Interrupción por desbordamiento ------------------------------   
#int_TIMER1                           
void temp1s(void){                     //                         
   delay_cycles(2);                    //                         
   set_timer1(3041);                   // 62.500 * 8 (prescaler) = 0,5 seg
   cont++;                             //                                   
   if(cont == 2){                      // 0,5 seg x 10 son 5 segundos
        ban_1seg = 1;  cont = 0;       //                                     
   }                                   //     
} //           
#int_EXT
void EXT_isr(void){
   
   
   if (RB1){            // Si el interruptor de desactivación está abierto
      RB7=1;         // activa la alarma conectada en RB7 
      while(RB1);       // mientras el RB1=1 bucle infinito
           RB7=0;       // cuando RB1=0, se desacactiva la alarma
   }
}
void main(){       
     set_tris_b(0b00000011);        // configura la puerta B
     RB7=0;                     // inicializo RB7
     
     setup_timer_1 (t1_internal | t1_div_by_8);
   set_timer1 (3041);                          // Recarga del tmr1
   disable_interrupts(int_timer1);             // Deshabilita interrupcion timer1
     enable_interrupts(GLOBAL);      // habilito interrupción global
     enable_interrupts(INT_EXT);   // habilito interrupción externa
     
     
     while(true);                 // Bucle infinito hasta interrupción
     
           if(ban_1seg){                      //                             
                  ban_1seg = 0; temporizar();    // 
                }                                //
           
}     

//--------------- Temporizar -------------------------------------------------- 
void temporizar(){                               //       
   seg++;                                        // Contando segundos
   if(seg == 10){                                // Si ya van 10 seg       
     seg=0;                             //
      output_high(pin_b6);                     //
      disable_interrupts(int_timer1);            // Deshabilita interrupcion timer1 
      delay_ms(500);       
       output_low(pin_b6);                                               
   }                           
}   
« Última modificación: 26 de Julio de 2013, 14:54:46 por lycans2005 »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: #int_TIMER1 con #int_EXT
« Respuesta #5 en: 26 de Julio de 2013, 14:54:31 »
RB0 o RB1?

Desconectado lycans2005

  • PIC10
  • *
  • Mensajes: 23
Re: #int_TIMER1 con #int_EXT
« Respuesta #6 en: 26 de Julio de 2013, 14:57:19 »
RB0 o RB1?

RB1 perdon, RB0 seria el sensor, y RB1 es la activacion o desactivacion de la alarma que es la que pone un 1 en RB7

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: #int_TIMER1 con #int_EXT
« Respuesta #7 en: 26 de Julio de 2013, 15:16:50 »
Sencillo  :mrgreen:
if(RB1)
{
     RB7=1;                              // activa la alarma conectada en RB7
     enable_interrupts(INT_TIMER1);      // Habilita interrupcion         
}
Else
{
     RB7=0;                            // cuando RB1=0, se desacactiva la alarma
     disable_interrupts(INT_TIMER1);   // deshabilita la interupcion         

}

Desconectado lycans2005

  • PIC10
  • *
  • Mensajes: 23
Re: #int_TIMER1 con #int_EXT
« Respuesta #8 en: 26 de Julio de 2013, 16:19:51 »
Sencillo  :mrgreen:
if(RB1)
{
     RB7=1;                              // activa la alarma conectada en RB7
     enable_interrupts(INT_TIMER1);      // Habilita interrupcion         
}
Else
{
     RB7=0;                            // cuando RB1=0, se desacactiva la alarma
     disable_interrupts(INT_TIMER1);   // deshabilita la interupcion         

}

:) si, muchas gracias!