Autor Tema: problemas con interrupciones #int_ext y #int_rda  (Leído 6329 veces)

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

Desconectado oman

  • PIC10
  • *
  • Mensajes: 14
problemas con interrupciones #int_ext y #int_rda
« en: 29 de Mayo de 2011, 00:29:16 »
buen dia. tengo un ploblema con interrupciones #int_ext y  #int_rda que no he podido resolver, espero que me puedan orientar.
 
les explico un poco de primero de mi proyecto pic-nokia 3220, ya puedo leer los mensajes y desifrarlos para una determinada aplicacion, solo que me aparecio un problema del cual no he podido resolver, bien a hora lo boy expliacar experando que alguien me pueda orientar.

codigo que funciona bien: este parte de codigo funciona perfectamente para recibir un mensaje.
#include <16f877a.h>
#FUSES nowdt,xt,noprotect
#use delay (clock=4000000)
#use rs232(baud=9600,parity=N,xmit=pin_c6,rcv=pin_c7,bits=8,stop=1)
.
.
#int_rda
void serial_isr() // Interrupcion recepcion serie USART
{
   rcvchar=0x00;  //inicializo el caracter recibido
   rcvchar=getchar();   // lo descargo
   addcbuff(rcvchar); //lo añado al buffer
}


solo que haora tengo la necesidad de poner una interrupcion extra, externa que es por rb0. con la funcionalidad que a la hora que se active mandar un mensaje, entoces hago lo abitual y tambien lo habilito correctamente.      solo que haora, al poner el codigo relacionado con la interrupcion externa rb0, la simulacion deja de funcionar correctamente, es como si de alguna manera el solo poner el codigo relacionado con la interrupcion rb0, la interupcion  #int_rda dejara de hacer su tarea correctamente.     si canselo la parte correspondiente a la #int_rda poniendolo como texto de ayuda /*todo la funcion #int_rda*/, la interupcion externa por rb0 funciona correctamente, si haora hago lo contrario poniendo como texto de ayuda /*toda la funcion #int_ext */, la interrupcion  #int_rda vuenbe a hacer todo su trabajo correctamente.

en conclusion el poner el codigo de #int_ext, afecta el funcionamiento de la #int_rda, e buscado informacion pero no he encontrado nada que me diga que estas interrupciones estan de alguna manera entrelazadas o algo por el estilo, la verdad no entiendo por que una interrupcion  #int_ext me afecta el funcionamiento de la otra #int_rda.

#include <16f877a.h>
#FUSES nowdt,xt,noprotect
#use delay (clock=4000000)
#use rs232(baud=9600,parity=N,xmit=pin_c6,rcv=pin_c7,bits=8,stop=1)
.
.

#int_ext
void ext_isr(void)//Interrupcion externa que cuando se activa manda un mensaje al
{        //al usuario con los datos de los sensores del sistema.
   delay_ms(50);
   enviarMSM();
}

#int_rda
void serial_isr() // Interrupcion recepcion serie USART
{
   rcvchar=0x00;  //inicializo el caracter recibido
   rcvchar=getchar();   // lo descargo
   addcbuff(rcvchar); //lo añado al buffer
}


espero ser claro, si necesitan mas datos para entenderme mejor solo diganmelo.

sin mas que decir, me despido, saludos.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #1 en: 29 de Mayo de 2011, 00:33:13 »
Que tiene la función enviar mensaje? Podrías solo setear una bandera al ocurrir la interrupción externa, testearla en el bucle principal y allí enviar el mensaje..


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #2 en: 29 de Mayo de 2011, 03:54:09 »
#int_ext
void ext_isr(void)//Interrupcion externa que cuando se activa manda un mensaje al
{        //al usuario con los datos de los sensores del sistema.
   delay_ms(50);
   enviarMSM();
}

Hola, me da la impresion de que tu problema es el retardo que tienes en tu interrupcion externa, ya que talvez es muy largo y en los delay se descativan las interrupciones, por lo que de preferencia no pongas delays dentro de estas.

intenta quitarlo y pruebas.
"Nada es imposible, no si puedes imaginarlo"

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #3 en: 29 de Mayo de 2011, 10:34:17 »
En los delays en si no se desactivan las interrupciones, que esté dentro de una interrupción si afecta. Generalmente se indica que ha ocurrido una pulsación, se espera 20ms y luego se vuelve a testear el estado del pin para saber si es una pulsación o una falsa alarma.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado oman

  • PIC10
  • *
  • Mensajes: 14
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #4 en: 30 de Mayo de 2011, 01:14:06 »
buen dia, agradesco su ayuda.

siguendo con el tema les cuento que quite el delay de la interrupcion, tal como me recomiendan pero no funciono. Tengo poco conociminto de asm y poco tiempo para aprenderlo, aunque si me gusta y espero que cuando ya me quite de presiones extras, me voy a meter a fondo por que se me hace muy interesante, pero por eso mi estimado Suky prefiero manternerme al margen de las prestaciones que me ofrece pcw.
el contenido la funcion es el siguente, lo que quiero hacer es solo cuando se active la interrupcion por rb0, se llame a esta funcion, que es para mandar un mensaje por comandos at, con un nokia 3220 y un pic.
void enviarMSM(void)  //envia un mensaje

   setup_ADC_ports(ALL_analog);
   setup_adc(adc_clock_internal);
   
   set_adc_channel(0);
   delay_ms(200);
   variable0 = read_adc();
   delay_ms(50);
   set_adc_channel(1);
   delay_ms(200);
   variable1 = read_adc();
   delay_ms(50);
   //printf("AT+CSCA=\"+5294100001410\"\r\n"); // N° CSCA TELCEL EN MEXICO.
   //delay_ms(2000);
 
   delay_ms(30);
   printf("AT\r\n"); // Le llama la atención al teléfono. 
   delay_ms(3000); //espera 5 segundos
   printf("AT+CMGF=1\r\n"); //configura modo texto
   delay_ms(3000);
   printf("AT+CMGS=\"6181208301\"\r\n");// N° MIO del destinatario.
   delay_ms(4000); //del celular al que se envia el sms
   printf("TEM1 = %d",((variable0)*2));
   delay_ms(50);
   printf("\rTEM2 = %d",((variable1)*2));
   delay_ms(50);
   putc(26); //ascii(26)=(ctrl+z) envia el mensaje   
   delay_ms(4000);
   printf(lcd_putc,"\fTEM1= %d",(variable0)*2);
   printf(lcd_putc,"\r\nTEM2= %d",(variable1)*2);
   delay_ms(4000);
   return;
}

cuando pruebo por separado la interrupcion externa pos rb0 (pogo en modo texto de ayuda el codico de /* toda la funcion #int_rda*/ ) la interupcion rb0, funciona
corectamente, y cuando hago lo contrario, pruebo por separado la #int_rda  (pogo en modo texto de ayuda el codico de /* toda la funcion #int_ext*/ ) la interupcion #int_rda funciona correctamente, luego lo que yo deseo es tenerlas en el mismo codigo y que funcionen las dos correctamente, entonces cuando agrego el codigo de las dos funciones la #int_ext funciona bien pero la #int_rda deja de hacer su trabajo correctamente, y eso precisamente es lo que no logro entender, por que hace mal su trabajo si antes lo hacia bien, no me recibe caracteres por ejemplo. la verdad se hace muy extraño.


solucion provicional: en mi proyecto tambien me es posible usar la tecnica polling, bueno no es lo ideal pero nimodo.
 if (input(pin_b5)==1)
      {
         enviarMSM();
      }

 voy a seguir investigando este problema de interrupciones, hasta que encuentre solucion.

les agradesco su pronta respuesta. saludos.


 




 

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #5 en: 30 de Mayo de 2011, 02:10:04 »
¿Has probado a deshabilitar la otra interrupción cada vez que entras en una de ellas?

de esta manera en int_ext pondrías:
Código: C
  1. disable_interrupts(INT_RDA);
  2. --- contenido función ---
  3. enable_interrupts(INT_RDA);

y en int_rda pondrías:
Código: C
  1. disable_interrupts(INT_EXT);
  2. --- contenido función ---
  3. enable_interrupts(INT_EXT);

Perderás aquellos eventos que se lancen mientras estás procesando la interrupción contraria, por lo que esta ejecución debe ser lo más corta posible.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #6 en: 30 de Mayo de 2011, 09:17:10 »
Hola.

Creo que la mejor opción es hacer la rutina de envío del SMS desde el main, tal como está ocupa muchos delay (algunos de hasta 3 segundos) y eso no va bien con las interrupciones.

Saludos
El papel lo aguanta todo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #7 en: 30 de Mayo de 2011, 10:04:04 »
Hola.

Creo que la mejor opción es hacer la rutina de envío del SMS desde el main, tal como está ocupa muchos delay (algunos de hasta 3 segundos) y eso no va bien con las interrupciones.

Saludos

Es exactamente lo que propongo, esa rutina es demasiado larga para una interrupción, está ~20segundos!
No contesto mensajes privados, las consultas en el foro

Desconectado oman

  • PIC10
  • *
  • Mensajes: 14
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #8 en: 31 de Mayo de 2011, 15:08:09 »
buen dia, creo que tienen razon de que llame a la funcion msm desde la main, puse el siguente codigo pero la int_ext se queda colgada y llano regresa a la main, les agradesco cualquier comentario que me puedan dar.

#FUSES nowdt,xt,noprotect
int interrupcion = 0;

#priority int_ext
ext_isr()
{
   interrupcion = 1;
}
#int_rda
void serial_isr() // Interrupcion recepcion serie USART
{
   rcvchar=0x00;  //inicializo el caracter recibido
   rcvchar=getchar();   // lo descargo
   addcbuff(rcvchar); //lo añado al buffer
}

main(){
    enable_interrupts(int_ext);
   ext_int_edge(l_to_h);
   enable_interrupts(int_rda);//Habilita interrupcion serial.
   enable_interrupts(global);


     if (interrupcion==1)
      {
         enviarMSM();
      }

}

saludos.
   


Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #9 en: 31 de Mayo de 2011, 15:32:21 »
Hola.

Dentro de la rutina de validación del flag interrupción debes ponerla a cero otra vez.

Saludos
El papel lo aguanta todo

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #10 en: 31 de Mayo de 2011, 15:42:13 »
no sale de tu funcion de interrupcion o de tu funcion EnviarMSM, si es la primera intenta poner clear_interrupt(int_ext) dentro de la interrupcion para borrar la bandera manualmente.

 si es la segunda, en cuanto entres a la funcion EnviarMSM borra tu bandera "interrupcion" para que no vuelva a entrar cuando regrese al main
"Nada es imposible, no si puedes imaginarlo"

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #11 en: 31 de Mayo de 2011, 15:45:46 »
En CCS no es necesario limpiar el flag de la interrupción EXT, además:
Código: [Seleccionar]
#int_EXT
void ext_isr(void)
{
 ...
}

Saludos
El papel lo aguanta todo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #12 en: 31 de Mayo de 2011, 23:02:33 »
Claro, falta el #int_ext que se expresa en el titulo  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #13 en: 01 de Junio de 2011, 01:42:23 »
Como dice MLO, te falta borrar el flag:


#FUSES nowdt,xt,noprotect
int interrupcion = 0;

#priority int_ext
ext_isr()
{
   interrupcion = 1;
}
#int_rda
void serial_isr() // Interrupcion recepcion serie USART
{
   rcvchar=0x00;  //inicializo el caracter recibido
   rcvchar=getchar();   // lo descargo
   addcbuff(rcvchar); //lo añado al buffer
}

main(){
    enable_interrupts(int_ext);
   ext_int_edge(l_to_h);
   enable_interrupts(int_rda);//Habilita interrupcion serial.
   enable_interrupts(global);


     if (interrupcion==1)
      {
         enviarMSM();
           interrupcion=0;
      }

}

Desconectado oman

  • PIC10
  • *
  • Mensajes: 14
Re: problemas con interrupciones #int_ext y #int_rda
« Respuesta #14 en: 02 de Junio de 2011, 17:50:09 »
buen dia.
    ya probe con sus consejos y resulto. les agradesco bastante por tomarse un minuto de su tiempo, para apoyar a resolver los problemas que a mi y a otros compañeros se nos presentan: codigo correcto:
#FUSES nowdt,xt,noprotect
int interrupcion = 0;

#int_ext
void ext_isr(void)
{
   interrupcion = 1;
}
#int_rda
void serial_isr() // Interrupcion recepcion serie USART
{
   rcvchar=0x00;  //inicializo el caracter recibido
   rcvchar=getchar();   // lo descargo
   addcbuff(rcvchar); //lo añado al buffer
}

main(){
    enable_interrupts(int_ext);
   ext_int_edge(l_to_h);
   enable_interrupts(int_rda);//Habilita interrupcion serial.
   enable_interrupts(global);


     if (interrupcion==1)
      {
         interrupcion==0;
         enviarMSM();
      }

}

saludos.