Autor Tema: Problemas con RS232: Interrupcion INT_RDA  (Leído 6803 veces)

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

Desconectado Urien

  • PIC10
  • *
  • Mensajes: 4
Problemas con RS232: Interrupcion INT_RDA
« en: 21 de Mayo de 2008, 06:34:07 »
Saludos a todos!

En primer lugar dar la enhorabuena a toda la comunidad por este sitio. Hace poco que lo conozco y hay muchísima información, gracias =)

Ahora queria explicaros el problemita que tengo. Uso un PIC16F873 conectado a un módulo de RF para comunicar varios dispositios entre ellos. Entre el pic y el módulo RF hay comunicacion RS232. El problema es que al recibir, la interrupcion solo salta una vez. Es decir, el pic recibe una interrupción por el primer mensaje que le llega pero, si no lo reseteo manualmente, no es capaz de volver a entrar en la interrupcion.

¿Puede ser debido a que necesito hacer algun tipo de clear? Las otras interrupciones que uso (INT_TIMER0 y INT_RB) no me dan problemas, y saltan siempre que tienen que saltar. He probado varias cosas: deshabilitar las interrupciones al inicio y habilitarlas al final de la misma interrupcion (aunque eso ya lo hace el compilador), hacer la interrupcion muy corta (en cuanto a codigo)...

Aquí os copio las partes que importan del código a ver si sirve de algo.

Código: [Seleccionar]
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

...

#INT_RDA
void interrupcion_recibir(){
if (kbhit()){
gets(in_pconv);
if(in_pconv[0]==pconv[0]){
touch();
}
}
}

...

void main(){

...

enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(TRUE){}
}

Pues nada, muchas gracias de antemano. Saludos!

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problemas con RS232: Interrupcion INT_RDA
« Respuesta #1 en: 21 de Mayo de 2008, 12:47:57 »
Hola.

Pues a mi nunca me han dado problemas las interrupciones, siempre y cuando salga lo mas rapido posible de ellas. Por eso he aprendido a utilizar flags en las interrupciones y procesarlas en el programa principal. Segun veo en el pedazo de codigo, lo que haces es capturar un string y luego validas un byte de ese string. Creo que la INT_RDA salta cuando se llena el registro de recepcion, y este se llena caba byte y tu estas capturando es tooodo un string. Seria recomendable que tu llenes el string de manera controlada no crees? de byte en byte, implica mas codigo, pero tu controlas toda la funcion de llenado del string.

Por aqui en el foro hay unos ejemplos del uso de la INT_RDA ( las del gran RedPic son geniales, te las recomiendo). Hechale un vistazo, estudialas y vas a ver que se soluciona.

Saludos
El papel lo aguanta todo

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Problemas con RS232: Interrupcion INT_RDA
« Respuesta #2 en: 21 de Mayo de 2008, 13:54:11 »
Sí yo también creo que el fallo está en el gets, debes usar getc() para ir guardando caracter a caracter en un buffer.

Desconectado Urien

  • PIC10
  • *
  • Mensajes: 4
Re: Problemas con RS232: Interrupcion INT_RDA
« Respuesta #3 en: 21 de Mayo de 2008, 18:05:58 »
Hola! Gracias por vuestras respuestas!

Lo de los flags ya lo probé y el resultado fue el mismo.

En cuanto a lo del gets() funciona bien. Probaré mañana en el laboratorio lo que propones de usar getc() pero por los experimentos que he hecho hasta ahora dudo que el problema esté ahi, puesto que envio la informacion con puts() y al utilizar gets() el formato es el mismo que de salida (no sé si me explico).

Mañana daré más noticias, gracias de nuevo =)

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problemas con RS232: Interrupcion INT_RDA
« Respuesta #4 en: 21 de Mayo de 2008, 19:24:08 »
Que modulos de RF estas usando??? El RLP y el TLP??
Yo he usado esos, pero solo he usado un emisor y un receptor. Nunca he utilizado un receptor y varios emisores.

Si usas mas de un transmisor podrias tener problemas ( me imagino ) si no sincronizas los envios de las tramas correspondientes a cada uno de los emisores.

Saludos
El papel lo aguanta todo

Desconectado Urien

  • PIC10
  • *
  • Mensajes: 4
Re: Problemas con RS232: Interrupcion INT_RDA
« Respuesta #5 en: 24 de Mayo de 2008, 12:39:12 »
Saludos de nuevo!

Los módulos de transmision que uso son LPRS. No hay problema con varios emisores y varios receptores puesto que trabajamos con un protocolo nuestro que lo permite.

Bueno, he probado usando solo getc() y el efecto es el mismo, solo funciona una vez. Además he hecho pruebas con un mensaje corto y sigue sin funcionar. Me he mirado los códigos de redPic pero no usa la UART con interrupciones sino que tiene rutinas con while para esperar el caracter y yo trato de hacerlo con interrupciones.

Código: [Seleccionar]
#INT_RDA
void interrupcion_recibir(){
if (kbhit()){

char prova;
prova=getc();

if(prova==pconv[0]){
simple_touch();
}
}
}

En este código ni siquiera me preocupo de recibir todo el mensaje, sino que cualquier caracter que sea como mi pconv[0] (que es un caracter del receptor) hará saltar la funcion touch. El resultado es el de antes, salta una vez pero no vuelve a saltar.

Ya sé que es muy extraño... no vemos la luz por ningun lado... =(

Saludos y gracias !!

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problemas con RS232: Interrupcion INT_RDA
« Respuesta #6 en: 24 de Mayo de 2008, 16:32:09 »
Citar
Me he mirado los códigos de redPic pero no usa la UART con interrupciones

No se que codigos habras visto. Revisa AQUI
Con respecto a los emisores, el problema es que transmiten a una misma frecuencia y puede haber interferencia entre los mensajes, pero si ya tienen un protocolo definido, no dara problema.

Saludos
El papel lo aguanta todo

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Problemas con RS232: Interrupcion INT_RDA
« Respuesta #7 en: 24 de Mayo de 2008, 16:58:43 »
« Última modificación: 24 de Mayo de 2008, 17:11:08 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problemas con RS232: Interrupcion INT_RDA
« Respuesta #8 en: 24 de Mayo de 2008, 23:03:39 »
Hola

Ya se que codigo fue el que viste!!!  :D :D :D :D El que no lo vi fui yo!!!!!!!  :mrgreen: , pero bueno, al igual que toooodos los post del maestro RedPic, muy entendibles, muy aplicables.

Creo que eso solucionara el problema del amigo Urien. A proposito, puedes postear la referencia de los modulos de RF?

Saludos
El papel lo aguanta todo

Desconectado Urien

  • PIC10
  • *
  • Mensajes: 4
Re: Problemas con RS232: Interrupcion INT_RDA
« Respuesta #9 en: 26 de Mayo de 2008, 07:35:34 »
 :-/ :-/ :-/ :-/ :-/ :-/

Miles de gracias RedPic. He adaptado tus funciones que trabajan con el buffer y, por fin, ya entramos en la funcion todas las veces que recibimos !! De verdad, gracias =)


MLO_ los módulos que usamos se llaman Low Power Radio Solution (LPRS) y van muy bien. Son sencillos de configurar, encriptan el mensaje con un protocolo propio de la empresa que se llama ER y tienen mucho alcance. Nuestro sistema usa transreceptores (emisor y receptor en un módulo) y usamos 3, uno para cada dispositivo que se tiene que conectar.


Bueno, pues una vez más gracias a RedPic y a toda la comunidad. Cuando tengamos el proyecto más definitivo quizás posteamos en la seccion de proyectos =D Saludos, y hasta la próxima!