Autor Tema: Interrupción que no funcina bien. (Y no son rebotes)  (Leído 2175 veces)

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

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Interrupción que no funcina bien. (Y no son rebotes)
« en: 06 de Abril de 2011, 04:36:56 »
Hola a todos, estoy haciendo un pequeño temporizador en C a través de un 16F84, y ocurre algo muy curioso. Como he dicho se trata de un temporizador por RB=0, pues cuando se programa la interrupción por flanco desdendente todo va bien, pero cuando se hace por flanco ascendente, la interrupción funciona para los dos flancos, esto es con el circuito montado, ya que en proteus funciona correctamente.

¿Puede ser debido a la programación?. Ya que erebotes no pueden ser, pues cuando lo programo como descendente funciona correctamente.

Debo decir tambien, que he puesto un condensador de 1 uF en paralelo con la salida de un 7805, ya que si no lo ponía no funcionaba correctamente. ¿Tendrá esto algo que ver?

Otra vez os doy las gracias, ya que llevo varios días dandole vueltas y no consigo ver que es lo que ocurre.

Que pasene un buen día.


PD: Adjunto os dejo esquema y código

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Interrupción que no funcina bien. (Y no son rebotes)
« Respuesta #1 en: 06 de Abril de 2011, 05:35:13 »
resubo tu programa para que lo vean compañeros , ya que xd luego no nos gusta descargar anda para dar una miradita xD
Código: C
  1. ////////////////////////////////////////////////////////////////////////////////////
  2. //                
  3. //
  4. //  TEMPORIZADOR POR INTERRUPCIÓN
  5. //
  6. //  
  7. //////////////////////////////////////////////////////////////////////////////////
  8.  
  9. #include <16f84a.h>            //pic a utilizar          
  10. #fuses XT,NOWDT,NOPROTECT   //ordenes para el programador
  11. #use delay (clock=4000000)         //Fosc=4Mhz
  12. #use standard_io(b)
  13. #use fixed_io(a_outputs=PIN_A0)
  14.  
  15.  
  16.  
  17. ///LLAMADA FUNCION INTERRUPCION
  18. #INT_EXT
  19. void IntRB0()
  20. {
  21.    output_high(PIN_A0);
  22.    delay_ms(10000);
  23.    output_low(PIN_A0);      
  24. }
  25.      
  26. ///PROGRAMA
  27. void main(void)
  28. {
  29.    output_low(PIN_A0);              //por lo que pueda pasar al encender el cto.
  30.    enable_interrupts(int_ext);      //activar interrupcion externa
  31.    ext_int_edge(L_TO_H);         //configuracion:interrupcion cuando señal asscencente
  32.    enable_interrupts(GLOBAL);      //todas las interrupciones desactivadas
  33.  
  34.    for(;;){}   //bucle infinito esperando interrupcion
  35. }

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Interrupción que no funcina bien. (Y no son rebotes)
« Respuesta #2 en: 06 de Abril de 2011, 05:38:08 »
Así sin probar nada.
Ese retardo de 10,000ms osea 10segundos dentro de la interrupción , estoy casi seguro que te ha de mandar algún warning el compilador.

En vez de eso , pon una bandera y deacuerdo al estado de esa realizas la operación.

--------------------
¿Cómo tienes conectado el pin RB0?

Con una resistencia y un push button? o llega una señal digital de algún otro circuito??

Si es con flanco de bajada , supongo tienes una resistencia a VCC , cuando lo haces esperando el flanco de subida  tendrias que usar una resistencia a gnd.

Rebotes si has de tener.Agrega un capacitor de 0.1uF a RB y gnd.

Saludos!

Si puedes sube tu diagrama  de como esta todo fisicamente conectado,así nos dejamos de suposiciones y atacamos el problema.

« Última modificación: 06 de Abril de 2011, 05:44:34 por AKENAFAB »

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: Interrupción que no funcina bien. (Y no son rebotes)
« Respuesta #3 en: 06 de Abril de 2011, 07:02:46 »
Muchas gracias AKENAFAB por la respuesta, efectivamente se trataba de rebotes, ya que colocando el condensador en paralelo con el pulsador (RB0 y tierra), funciona correctamente. Lo que me sigue extrañando es porque cambiando en la programación el flanco siempre funcionaba bien.(Siendo el mismo pulsador tiene los mismos rebotes)

El esquema es el siguiente:


No sé como insertar la imagen, veo el icono, pero después qué  :oops:

Aunque en el primer post está el fichero en proteus.

Otra cosa no entendí lo que quieres decir con

Citar
En vez de eso , pon una bandera y deacuerdo al estado de esa realizas la operación.
Gracias de nuevo por vuestra colaboración

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Interrupción que no funcina bien. (Y no son rebotes)
« Respuesta #4 en: 06 de Abril de 2011, 07:23:28 »
Coincido con Akena en que ese delay dentro de la interrupción duele a la vista.
Lo que te recomienda de la bandera es utilizar una variable global que setearás a un valor dentro de la interrupción, mientras que en el bucle principal de tu programa estarás siempre chequeando su valor. Cuando encuentres que ha cambiado, sabrás que entró y salió de la interrupción y por tanto te toca hacer ese output_high

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: Interrupción que no funcina bien. (Y no son rebotes)
« Respuesta #5 en: 06 de Abril de 2011, 08:52:20 »
Gracias Nocturno por tu respuesta, la verdad es que debido aún a mi ignorancia en el mundo de los PIC, no entiendo muy bien que es lo que ocurre al poner el dalay en la interrupción, te agradeciría alguna respuesta. Por otro lado he modificado el código y he puesto lo siguiente, ¿te referías a esto?

Código: [Seleccionar]
#include <16f84a.h>            //pic a utilizar         
#fuses XT,NOWDT,NOPROTECT   //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz
#use standard_io(b)
#use fixed_io(a_outputs=PIN_A0)
int1 flag;

///LLAMADA FUNCION INTERRUPCION
#INT_EXT
void IntRB0()
{
   flag=1; 
}
     
///PROGRAMA
void main(void)
{
   flag=0;
   output_low(PIN_A0);              //por lo que pueda pasar al encender el cto.
   enable_interrupts(int_ext);      //activar interrupcion externa
   ext_int_edge(L_TO_H);         //configuracion:interrupcion cuando señal asscencente
   enable_interrupts(GLOBAL);      //todas las interrupciones desactivadas

   for(;;) {   //bucle infinito esperando interrupcion
   output_low(PIN_A0);
   if(flag==1) {
   
   output_high(PIN_A0);
   delay_ms(5000);
   output_low(PIN_A0); 
   }
   flag=0;
   
   }
}

De nuevo gracias por la colaboración

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Interrupción que no funcina bien. (Y no son rebotes)
« Respuesta #6 en: 06 de Abril de 2011, 09:26:58 »
Exacto, ese es el uso correcto de la interrupción y la bandera.
Un delay dentro de una interrupción es un problema porque impide que salten otras interrupciones en algunos micros, e incluso impide que salte de nuevo la misma interrupción.
En según qué aplicaciones te puede interesar mantenerla activa mientras se está ejecutando.

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: Interrupción que no funcina bien. (Y no son rebotes)
« Respuesta #7 en: 06 de Abril de 2011, 10:52:24 »
OK. Gracias por la aclaración.