TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: lycans2005 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 -----------------------------
}
}
-
Esta claro, cuando accedes a la interrupcion #INT_EXT() al valer cuando RB! valga cero deshabilitas la interrupccion del timer como lo colocas aqui:
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
-
Esta claro, cuando accedes a la interrupcion #INT_EXT() al valer cuando RB! valga cero deshabilitas la interrupccion del timer como lo colocas aqui:
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
-
si RB1 = 1, mas abajo llegas a donde dice:
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
-
si RB1 = 1, mas abajo llegas a donde dice:
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);
}
}
-
RB0 o RB1?
-
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
-
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
}
-
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!