Autor Tema: Interrupción #INT_RDA y #INT_EXT  (Leído 10429 veces)

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

Desconectado amaia.13

  • PIC10
  • *
  • Mensajes: 6
Interrupción #INT_RDA y #INT_EXT
« en: 06 de Marzo de 2012, 14:25:02 »
Hola,

Tengo un problema. Utilizo el PIC16F886 y dos interrupciones, la de puerto serie y la externa en RB0. Por separado me funcionan bien, pero juntas la interrupción serie se me queda colgada, utilizo un gets para recoger los datos que le mando desde Visual Basic, sin embargo, al utilizar un getc me funcionan correctamente pero sólo me recoge un dato(que es lo que hace realmente el getc) y yo lo que quiero recoger es una cadena de 10 caracteres. Gracias.
« Última modificación: 06 de Marzo de 2012, 16:24:06 por amaia.13 »


Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Interrupción #INT_RDA y #INT_EXT
« Respuesta #2 en: 07 de Marzo de 2012, 04:49:37 »
Hola, la opción que tienes es hacer un bucle para recoger caracteres de la siguiente manera:

i=0;
if(kbhit())
{
     recibido=getc();
     i++;
}
Vamos así pero adaptándolo a tu código y sin tratar de sobrecargar mucho la rutina de la interrupción que eso también genera errores. Luego ya en vez de trabajar con una cadena de texto tienes que trabajar con un vector de caracteres que es un poco más coñazo.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Interrupción #INT_RDA y #INT_EXT
« Respuesta #3 en: 07 de Marzo de 2012, 05:50:58 »
Con la interrupción RDA no es necesario kbhit ya que la propia interrupción se origina cuando el dato esta completo y listo para ser leído.

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Interrupción #INT_RDA y #INT_EXT
« Respuesta #4 en: 07 de Marzo de 2012, 07:19:11 »
Pues yo si que he tenido problemas si no lo pongo, sobre todo si trabajas con otras fuentes de interrupción de manera paralela

Desconectado amaia.13

  • PIC10
  • *
  • Mensajes: 6
Re: Interrupción #INT_RDA y #INT_EXT
« Respuesta #5 en: 07 de Marzo de 2012, 07:24:42 »
Gracias de antemano por haber contestado.

Nose si se ha entendido bien mi problema, el gets() me funciona correctamente con la interrupción por el puerto serie  #INT_RDA  cuando envio desde visual basic una cadena de 10 dígitos. Pero se me bloquea el PIC cuando entra en la interrupción serie si previamente he activado la interrupcion externa puerto RB0 - #INT_EXT, que también necesito. Me estoy volviendo loco ya que un dia me funcionaron ambas a la vez pero no he vuelto a conseguirlo. Nosé a que se debe.

Un saludo

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Interrupción #INT_RDA y #INT_EXT
« Respuesta #6 en: 07 de Marzo de 2012, 07:44:49 »
Pues no te había entendido, pero te voy a dar una respuesta parecida a la anterior, el gets es problemático en muchos casos, porque no pruebas a hacer la recepción caracter a caracter, yo creo que de esa forma si que te debe funcionar. Si no es así pues cuelga el código de la recepción y seguro que así te podremos ayudar mejor.
Un saludo.

Desconectado amaia.13

  • PIC10
  • *
  • Mensajes: 6
Re: Interrupción #INT_RDA y #INT_EXT
« Respuesta #7 en: 07 de Marzo de 2012, 09:59:45 »
Tengo hecho de otra manera, con el getc, pero tampoco me funciona:

#int_RDA
void intser()                  //Interrupción recepción serie USART
{         
   ultcar = 0x00;               //inicializo caracter recibido

   ultcar=getc();               //guardo en la variable
   anadobuf(ultcar);            //lo añado al buffer

   return;      
}

int anadobuf(char c)
{                  // Añade a cbuff -----------------------
int a;

   switch(c)
   {
      case 0x0D:            //Enter ->
         serie=1;
         sig=0x00;
         break;
      default:            //Si es cualquier caracter menos enter...
         buferendo[sig++]=c;   //...que acumule en el array el caracter que he enviado
   }
}


Serie es un flag que utilizo para luego ir a la función de grabar.
Esta función funciona bien cuando solo utilizo la interrupción serie.


Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Interrupción #INT_RDA y #INT_EXT
« Respuesta #8 en: 07 de Marzo de 2012, 10:59:29 »
Asi de pronto lo primero que veo en esa rutina es demasiado trabajo, el llamar a un método que introduzca el caracter en un buffer ya te está fastidiando, porque si el micro además tiene que estar pendiente de más fuentes de interrupción es una sobrecarga importante. Asique mi consejo es que pruebes a llenar el buffer primero dentro de la propia rutina, primeramente sin comparaciones  exhaustivas y luego vas incrementando la complicación, Prueba así de abajo arriba a ver que tal.

Desconectado diguito_69

  • PIC16
  • ***
  • Mensajes: 136
Re: Interrupción #INT_RDA y #INT_EXT
« Respuesta #9 en: 07 de Marzo de 2012, 13:30:51 »
Hola, podrias probar con algo asi:

Código: [Seleccionar]
#int_RDA
void intser()
{
    buferendo[sig++] = getc();
    if (buferendo[sig] == '\n')
    {
        sig = 0;
        //hacer lo que haya que hacer con buferendo.
    }
}

No se si se entiende, no se que compilador esta usando. La idea es que cada ves que se recibe un caracter, se produce una interrupción, en esta se guarda el caracter en el buffer y se comprueba si el caracter recibido es '\n' o cualquier otro que quieras, es caso de que así sea haces lo que tengas que hacer con la cadena y en caso de que no, esperas otra interrupción.

Saludos.
"Carezco de un don especial. Sólo soy apacionadamente curioso". Albert Einstein.

Desconectado amaia.13

  • PIC10
  • *
  • Mensajes: 6
Re: Interrupción #INT_RDA y #INT_EXT
« Respuesta #10 en: 07 de Marzo de 2012, 14:06:55 »
He probado como me ha dicho diguito_69, pero con ello solo consigo recoger los dos primeros caracteres y yo necesito recoger 11.

No sé si el problema será ya de mi programa o del Visual Basic. Desde el visual mando un enter cada vez que mando un dato y al final del todo otro más, porque (creo) que el getc necesita un enter para recoger el dato.

Desconectado diguito_69

  • PIC16
  • ***
  • Mensajes: 136
Re: Interrupción #INT_RDA y #INT_EXT
« Respuesta #11 en: 07 de Marzo de 2012, 14:18:58 »
He probado como me ha dicho diguito_69, pero con ello solo consigo recoger los dos primeros caracteres y yo necesito recoger 11.

No sé si el problema será ya de mi programa o del Visual Basic. Desde el visual mando un enter cada vez que mando un dato y al final del todo otro más, porque (creo) que el getc necesita un enter para recoger el dato.

Hola, getc recoge un solo caracter, sea cual sea, el error lo tienes al mandar un enter cada vez que mandas un dato.

Saludos.
"Carezco de un don especial. Sólo soy apacionadamente curioso". Albert Einstein.

Desconectado diguito_69

  • PIC16
  • ***
  • Mensajes: 136
Re: Interrupción #INT_RDA y #INT_EXT
« Respuesta #12 en: 07 de Marzo de 2012, 14:20:16 »
Tendrías que mandar el enter solo al final.
"Carezco de un don especial. Sólo soy apacionadamente curioso". Albert Einstein.

Desconectado amaia.13

  • PIC10
  • *
  • Mensajes: 6
Re: Interrupción #INT_RDA y #INT_EXT
« Respuesta #13 en: 07 de Marzo de 2012, 14:37:19 »
Listo, muchas gracias. El fallo estaba en lo que mandaba, al quitar el enter que iba cada vez que metia un dato funciona perfectamente.