TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: amaia.13 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.
-
Explícate
-
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.
-
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.
-
Pues yo si que he tenido problemas si no lo pongo, sobre todo si trabajas con otras fuentes de interrupción de manera paralela
-
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
-
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.
-
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.
-
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.
-
Hola, podrias probar con algo asi:
#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.
-
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.
-
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.
-
Tendrías que mandar el enter solo al final.
-
Listo, muchas gracias. El fallo estaba en lo que mandaba, al quitar el enter que iba cada vez que metia un dato funciona perfectamente.