Comunicacion serial multiple

Hola necesito saber si hay algun C.I. que pueda usar como demultiplexor que me permita comunicarme con 8 microcontroladores en forma serial, no necesito comunicarme al mismo tiempo con los microcontroladores. yo creo que seria algo mas como un switch para cambiar el envio de información de un microcontrolador a otro.
 
Hola, me podrias decir si los controladores estan en la misma placa o estan en placas separadas?.
Que tipo de controlador usas?
Gracias
 
Hola:
No conosco bien los PIC porque suelo tabajar con ATMEL, pero las bases deben ser las mismas.
El asunto es que lo que podes hacer es usar RS485 con esa norma podes conectar los controladores en formato de cadena.Todos los micros estan conectados a la misma linea y todos reciben el mismo mensage.Debes ver como haces, si pones un solo master y los demas esclavos(esta es la opcion mas recomendada y la mas simple) o haces multy master(mas complicado).
Si usas master-slave todos los controladores estan siempre en escucha y solo salen a transmitir cuando el master los interroga.
Para que cada micro sepa cuando el mensage es para el lo mas usal es hacer un encabezado en el protocolo de comunicacion, por ejemplo:
0,direccion,3,4,mensaje.
todos reciben el mensaje pero solo el que tenga esa direccion procesa el mensaje.
El integrado que usamos para el RS485 es SN75176B, es realmente facil de usar, pero si usas otro, te recomiendo usar el que ya conoces.
Si queres te puedo dar una rutina recepcion hecha en C , usada en un ATMEGA8 de atmel, para que tengas una referencia.
Espero que esto te sea de ayuda.
Gracias
 
Hola, con mucha atención leí tus comentarios acerca de este tema y me interesaría saber si todavía tienes la rutina a la cual haces referencia. Yo trabajo con ATMega8 Board myAVR. Me alegraría mucho si pudieras ayudarme.
Muchos saludos desde Alemania

Ramon

Carontre dijo:
Hola:
No conosco bien los PIC porque suelo tabajar con ATMEL, pero las bases deben ser las mismas.
El asunto es que lo que podes hacer es usar RS485 con esa norma podes conectar los controladores en formato de cadena.Todos los micros estan conectados a la misma linea y todos reciben el mismo mensage.Debes ver como haces, si pones un solo master y los demas esclavos(esta es la opcion mas recomendada y la mas simple) o haces multy master(mas complicado).
Si usas master-slave todos los controladores estan siempre en escucha y solo salen a transmitir cuando el master los interroga.
Para que cada micro sepa cuando el mensage es para el lo mas usal es hacer un encabezado en el protocolo de comunicacion, por ejemplo:
0,direccion,3,4,mensaje.
todos reciben el mensaje pero solo el que tenga esa direccion procesa el mensaje.
El integrado que usamos para el RS485 es SN75176B, es realmente facil de usar, pero si usas otro, te recomiendo usar el que ya conoces.
Si queres te puedo dar una rutina recepcion hecha en C , usada en un ATMEGA8 de atmel, para que tengas una referencia.
Espero que esto te sea de ayuda.
Gracias
 
Hola Ramon:
Esto es un ejemplo de rutina para comunicacion con multiples unidades
El tuco es cada una tiene una direccion especifica y acepta el mensaje solo si es dirigido a esta.
Al final se usa una forma de check sum, puede ser la forma que vos quieras. la idea es que
despues de recibir el mensaje si todo esta bien seteas una bandera, esta bandera activa una
parte en tu programa principal y asi inicias el tratamiento del mensaje recibido.

// esto es en la rutina de interrupcion de la UASRT

DataIn = UDR; // lee el regidtro de la USART

switch(SerStatus) // byte de status declarado static en la misma subrutina
{
case 0: // Sync
if(DataIn == 0x00)
{
CHK = 0x00;
contador = 0x00;
p_RxBuf = rxbuf;
SerStatus++;
}
else
SerStatus = 0x00;
break;
case 1: // direccion
if(DataIn == Address) // aca compara con la direccion guardada en el micro
{ // cada micro tiene diferente direccion a va a aceptar el mensage cuando sea
SerStatus++; // dirigido a este
CHK ^= DataIn;
}
else
SerStatus = 0x00; // si no esta dirigodo a esta unidad retorna el comienzo
break;
case 2:// final de encabezado
if(DataIn == 4)
{
SerInpStatus++;
CHK = CHK ^ DataIn;
}
else
SerStatus = 0x00;
break;
case 3:
*p_RxBuf++ = DataIn;
if(contador < 10) // recibe 10 caracteres - podes hacerlo tan largo como quieras
contador++;
else
SerInpStatus++;
CHK = CHK^DataIn;
break;
case 4:
if(DataIn == CHK) // si el mensaje fue correcto setea una variable global
SerFlag = 0xFF; // SerFlag es declarado en forma global;
else
SerFlag = 0xFF;
SerInpStatus = 0x00;
break;
};


// en tu loop principal
while(1)
{
if(SerFlag)
{
SerFlag = 0x00;
// aca procesas la información que recibiste en p_RxBuff;
// y de acuerdo a esto envias la respuesta a la unidad Master
}
};
 
Hola Mayckher:

Basicamente esta rutina puede ser implementada en cualquier micro, lo que tenes que ver es el registro de la USART, o sea el nombre del registro para leer el dato de entrada. Lo demas es solo como tratas la información que llega al uP.

Saludos Caronte
 
Carontre, estoy empezando en esto y la verdad que me gustaría saber si puedes darme algunos ejemplos en ASM acerca del tema.
¿cuando dices que el maestro interroga a los esclavos, haces referencia a utilizar TokenRing?
Disculpa mi ignorancia desde ya gracias.
 
Atrás
Arriba