TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jnavarro en 25 de Febrero de 2008, 17:26:26
-
Hola Expertos,
Necesito ayuda de alguien experimentado en el tema.
Trato de comunicar un PIC por rs232 con varios dispositivos, en un principio con 3 diferentes (puede que mas adelante sean mas) donde cada dispositivo funciona a una velocidad diferente. Mi problema está al detectar por donde me viene la informacion, de que dispositivo. El pic se encuentra haciendo sus cosas, y en un determinado momento me vendrán datos de uno de los dispositivos y he de tratarlos.
En un principio habia pensado hacerlo por interrupciones, pero segun he leido en numerosos post, a lo maximo que llego es a tratar dos interrupciones, una por (#int_rda) asginandola a un pueto serie, y el otro puerto serie a una interrupcion externa (#int_EXT) por RB0. Pero... ¿Y el tercer puerto que necesito que hago?
He intentado hacer el programa sin interrupciones, (tal y como esta abajo), pero no me termina de funcionar bien. En un principio me recibe el dato, el puerte correspondiente por donde venga, pero al enviar el segundo, por el mismo puerto o por otro, no hace caso, necesito enviar dos o tres veces para que reaccione, y encima, al estar haciendolo asi, no puedo tener al PIC haciendo otras cosas mientras no vengan datos.
Entre los diferentes dispositivos se comunicaran con tramas "largas" (15 ó 20 bytes cada una), donde el primer byte de cada trama me dira que debo hacer en cada caso con el resto de esa trama.
¿Se os ocurre alguna idea?
#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#include <stdio.h>
#include <string.h>
//________________________________________________________________________________________________
#use rs232(baud=115200,parity=N,xmit=PIN_C6,bits=8, ERRORS, stream=Canal_PC_TX)
#use rs232(baud=115200,parity=N,rcv=PIN_C7,bits=8, ERRORS, stream=Canal_PC_RX)
#use rs232(baud=9600,parity=N,xmit=PIN_B6,bits=8, ERRORS, stream=Canal_WC_TX)
#use rs232(baud=9600,parity=N,rcv=PIN_B7,bits=8, ERRORS, stream=Canal_WC_RX)
#use rs232(baud=38400,parity=N,xmit=PIN_B4,bits=8,stream=Canal_GP_TX)
#use rs232(baud=38400,parity=N,rcv=PIN_B5,bits=8, ERRORS, stream=Canal_GP_RX)
#define Enciende Output_High
#define Apaga Output_Low
//________________________________________________________________________________________________
void main(){
unsigned int miBuffer[10];
unsigned int16 miCrc;
int i=0, j=0;
Enciende(PIN_A1);
delay_ms(500);
Apaga(PIN_A1);
fprintf(Canal_PC_TX,"\r\nINICIO");
while(TRUE){
if(kbhit(Canal_PC_RX) == TRUE && getchar(Canal_PC_RX) == 0x01){
fprintf(Canal_PC_TX,"\r\nRecibido comando 1 de PC");
}else if(kbhit(Canal_PC_RX) == TRUE && getchar(Canal_PC_RX) == 0x02){
fprintf(Canal_PC_TX,"\r\nRecibido comando 2 de PC");
}else if(kbhit(Canal_WC_RX) == TRUE){
fprintf(Canal_PC_TX,"\r\nRecibo por WC");
}else if(kbhit(Canal_GP_RX) == TRUE){
fprintf(Canal_PC_TX,"\r\nRecibo por GP");
}
}
}
Esto es un pequeño ejemplo de lo que pretendo. Esto me funciona, pero como os he dicho, aveces me falla, se queda atascado y necesito enviar varias veces para que se entere de que le estoy enviando.
A ver si alguien me podeis hechar un cable, salu2 a tod@s
-
Hola jnavarro
el problema es que no puedes usar la directiva #use rs232 mas de una vez en tiempo de ejecución.
mira estos link:
http://www.todopic.com.ar/foros/index.php?topic=16369.msg107672#msg107672
http://www.todopic.com.ar/foros/index.php?topic=19026.msg134894#msg134894
-
Gracias PalitroqueZ,
Habia leido ya uno de los post, el otro no, gracias por él. Pero lo que se explica en ellos no me acaba de aclarar. Yo quiero definir 3 "canales de comunicacion" (Cada uno con su Tx y RX) en diferentes pines a diferentes velocidades, en estos post se habla de acerlo sobre un mismo par de pines e ir variando la velocidad.
Si te fijas, en un principio yo me planteado definirme:
Canal_PC_TX --> Pin Tx=C6 y Pin RX=C7
Canal_WC_TX --> Pin Tx=B6 y Pin RX=B7
Canal_GP_TX --> Pin Tx=B4 y Pin RX=B5
Tras esto, lo que trato es asignarle una interrupcion diferente a cada Canal. El PIC andará haciendo sus cositas, hasta que en uno de los momentos, algún canal le envie algo (por sus respectivos pines), el ese momento el pic lo gestionará, y le contestará por su canal.
¿He conseguido explicarme mejor? ¿Le ves solución a lo que trato de hacer?
Salu2 y gracias por contestar
-
Hola
Y al final jnavarro o palitroquez,tuvo solucion?? porque justo voy a implementar algo similar
-
thegame!
Por lo que veo el post es algo antiguo :D
Pero segun veo puedes usar varios stream para cada rs232 y puedes enviar por cada canal (stream), por asi decirlo, sin problemas; el problema se te presentara es cuando te lleguen mensajes, ya que, deberas utilizar rutinas por software y estas no poseen un buffer que te permitan guardar un dato o utilizar una interrupcion que te indique que a llegado un dato. Eso solo se puede hacer es por hardware y la mayoria de los pic tienen uno o dos puertos seriales por hardware los cuales possen bufferes de recepcion.
Lo que deberias entonces es sincronizar en cada momento un transmisor con un receptor que tengan el mismo stream, para que no te falle la comunicacion.
De lo contrario deberias utilizar otra tecnica :shock: que podria ser asignar una direccion a cada pic luego utilizar un pic que antes de enviar una data envie primero la direccion del pic con que se quiere comunicar y luego la data, de esta manera solo el pic que contenga la misma direccion que se envio primero reciba la data.
-
Aunque como comento RALF2 es un post viejo, soluciones por software son complicadas cuando tenes varias canales series y de diferente baud-rates. Si los devices series son más de dos, te recomiendo usar algún micro que tenga las misma cantidad de uarts x hardware integradas, se que Atmel y Freescale tiene micros así. Buscando en la web de microchip encontré este:
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en559357
Saludos !
-
Existen muchos pics con 4 uart por hardware, pic24 y pic32, en tu caso me decantaria por pic24 que segun veo usas CCS, pero te recomiendo hacer el uso del hard a "mano" por interrupciones, es decir, gestiona tu mismo tanto la transmision como la recepcion y no se lo dejes a CCS.
saludos.
-
ok muchachos muchas gracias por las sugerencias,estuve buscando por el foro y encontre este tema:
http://www.todopic.com.ar/foros/index.php?topic=27195.0 (http://www.todopic.com.ar/foros/index.php?topic=27195.0)
que para mi caso podria funcionar,como menciona el compañero en el post,le funciono bien a bajas velocidades y yo realmente no requiero altas velocidades.igual lo pruebo en proto y chequeo si va bien.
el problema se te presentara es cuando te lleguen mensajes,
eso precisamente amigo RALF2 es lo que creo me llevara mas tiempo y me dara mas dolores de cabeza.
Ahora la otra opcion que comentan los compañeros RICHI777 y KALLITOS tambien la considere,de echo utilice el seleccionador de PICS que posteo Nocturno y si efectivamente me encontre con varios,solo que por ahora me cortaron los recursos un poco y tendre que implementar algo mas economico y ya que el CD4052 me costaria 7.8 pesos mas lo de los MAX que valen como 11 pesos y como ya tengo el PIC jeje (todo en pesos mexicanos),creo que me aventare a probar si me sale.
Gracias y se aceptan sugerencias para lo de la recepcion asi como la que se tomara en cuenta del compañero RALF2
Saludos
-
Te comento mi experiencia. Tengo desarrollado un producto que atiende 3 series, mi micro solo tiene 2, nome quedo otra que colocar un 4052 para multiplexar los canales. Esto sirve si los canales externos unicamente responden en modo encuesta ( Polling ) porque si los canales se ponen a transmitir al mismo tiempo vas a perder caracteres. La solucion de implemntar uart por soft y encima varios, se puede pero no creo que funcione bien. La solucion creo que tirarse por un micro que tenga 4 uarts x hardware. Con respecto a lo de microchip encontre que existen pic24, dspic y pic32 pero elegui uno no tan potente. Com respecto a perder de datos, esto se soluciona con colas o buffer circulares. Cuantos bytes vas a recibir por mensaje por cada dispositivo, te digo por el tema de la ram.
Saludos !