TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Urien 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.
#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!
-
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
-
Sí yo también creo que el fallo está en el gets, debes usar getc() para ir guardando caracter a caracter en un buffer.
-
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 =)
-
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
-
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.
#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 !!
-
Me he mirado los códigos de redPic pero no usa la UART con interrupciones
No se que codigos habras visto. Revisa AQUI (http://picmania.garcia-cuervo.com/PICC.php#RDA1)
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
-
JA, aj, ja :D :D :D ... puedo asegurar que si alguna vez no he usado la USART ... no lo recuerdo. :D :D :D
No. Es broma.
Una vez no usé la USART en Lo mínimo para comunicarnos vía RS232 Hardware y Software (http://www.todopic.com.ar/foros/index.php?topic=4620.0). De ahí el uso de la palabra mínimo, no la puse porque sí, sino porque es lo mínimo con lo que se puede hacer.
El resto de mis post todos usan la USART, os lo juro por la punta de mi soldador.
Recibiendo del RS232 sobre un Buffer y procesándolo posteriormente. (http://www.todopic.com.ar/foros/index.php?topic=4573.0)
Desde el PC a una EEPROM I2C y viceversa a través de mi PIC (http://www.todopic.com.ar/foros/index.php?topic=4783.0)
Controlando un SERVO con el PIC desde nuestro PC (http://www.todopic.com.ar/foros/index.php?topic=4629.0)
La EEPROM interna puesta a nuestro servicio. (http://www.todopic.com.ar/foros/index.php?topic=4639.0)
Cómo variar un ancho de pulso generado con RTCC mediante la RS232 (http://www.todopic.com.ar/foros/index.php?topic=4813.0)
Analizador lógico de 3 Canales monitorizado en el PC (http://www.todopic.com.ar/foros/index.php?topic=8109.0)
Conectando un PIC a Ethernet vía serie con el EM202 (http://www.todopic.com.ar/foros/index.php?topic=2275.0)
Traductor RS232 a Morse (Sonoro y visual) (http://www.todopic.com.ar/foros/index.php?topic=12717.0)
El RS485, un Relé en la lejanía: Hardware y Software (http://www.todopic.com.ar/foros/index.php?topic=19057.0)
... por ejemplo. :mrgreen:
-
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
-
:-/ :-/ :-/ :-/ :-/ :-/
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 (http://www.lprs.co.uk/)) 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!