TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: T0ni0 en 04 de Noviembre de 2004, 07:33:00

Título: Interrupcion externa por flanco
Publicado por: T0ni0 en 04 de Noviembre de 2004, 07:33:00
Hola, alguien ha utilizado las interrupciones externas pero por flanco ascendente o descendente?

por deteccion de cambio ya lo he utilizado, pero he probado con la funcion ext_int_edge( L_TO_H );

y no se si no la pongo en el sitio que toca pero no me da los resultados esperados.

 LlorandoLlorandoLlorando  alguien que la aya utilizado?
Título: RE: Interrupcion externa por flanco
Publicado por: pocher en 04 de Noviembre de 2004, 09:35:00
Si no pones el programa, no se puede detectar el error.
Título: RE: Interrupcion externa por flanco
Publicado por: JacoPastorius2004 en 04 de Noviembre de 2004, 16:02:00
Cabeza

Primero tenes que definir que flanco es el que queres que interrumpa, si el de subida o el de bajada, deshabilitando el que no quieras, para no tener interrupciones  no deseadas.
Otra es que una interrupcion por cambio de flanco en PB7:4 va a la misma rutina de servicio por lo que tenes que discernir en la rutina que pin la provoco. Preguntando por el estado actual de cada pin y comparandolo con el estado anterior, por ejemplo.
Depende tambien que tipo de señal provocara la interrupcion, si es un pulso corto en tiempo tendras dos cambios de nivel muy seguido.

En fin como dice el Pocher, mejor pone el codigo para analizarlo.

Jaco
Título: RE: Interrupcion externa por flanco
Publicado por: telekitor en 08 de Noviembre de 2004, 02:18:00
funciona muy bien, la interrupcion es externa int0, int1 o int2 (18f452)
no confundas la habilitacion de la interrupcion con la seleccion del flaco
activo, no es lo mismo.

por ejemplo


/*****rutinas de atencion a las interrupciones: *****/

#INT_EXT
void irq_modo(void){
     //antirebotes
     delayantirebotes();

     modo = modo + 0x01;
     if(modo>0x02){
        modo = 0x00;
     }

}

#INT_EXT1
void irq_mas(void){
     //antirebotes
     delayantirebotes();

     if(modo = 0x02){
         notabase = notabase + 1;
         if(notabase>453){
            notabase = 453;
         }
     }
}

#INT_EXT2
void irq_menos(void){
     //antirebotes
     delayantirebotes();

     if(modo = 0x02){
        notabase = notabase - 1;
        if(notabase<427){
           notabase = 427;
           }
     }
}


//*********************programa principal**********************/

// programa principal
void main(void){


//inicializamos pic
inipic();

//inicializamos variables
modo = 0x02;
notabase = 440;

//inicializamos lcd
inilcd();


/***********habilitamos interrupcion********************/
enable_interrupts(GLOBAL);

enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_EXT2);
/*********seleccionamos flaco activo *************/
ext_int_edge(0, H_TO_L);
ext_int_edge(1, H_TO_L);
ext_int_edge(2, H_TO_L);




dios mio hasta funciona RebotadoRebotadoRebotadoRebotado
Título: RE: Interrupcion externa por flanco
Publicado por: T0ni0 en 08 de Noviembre de 2004, 02:27:00
Escrito originalmente por telekitor

/*********seleccionamos flaco activo *************/
ext_int_edge(0, H_TO_L);
ext_int_edge(1, H_TO_L);
ext_int_edge(2, H_TO_L);




Eso era, solo habia pedido como se hacía no lo encontre en ninguna ayuda
THXAvergonzadoAvergonzadoAvergonzado