# Comunicacion serial multiple



## kukoc (Jun 19, 2006)

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.


----------



## Carontre (Jun 27, 2006)

Hola, me podrias decir si los controladores estan en la misma placa o estan en placas separadas?.
Que tipo de controlador usas?
Gracias


----------



## kukoc (Jun 27, 2006)

los microcontroladores estan en placas separadas y es el PIC16F877A


----------



## Carontre (Jun 28, 2006)

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


----------



## Carontre (Jun 28, 2006)

Hola:
Otra solucion si es que ya tenes todo armado o el sistema ya esta funcionando podes usar algo como este MUX.
Visita
http://pdfserv.maxim-ic.com/en/ds/MAX398-MAX399.pdf.
Creo que esto tambien te puede ayudar.
Gracias


----------



## RamonL (Mar 3, 2008)

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.
> ...


----------



## Carontre (Mar 3, 2008)

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
		}
	};


----------



## Mayckher (Abr 4, 2008)

saludos carontre esta subrutina tambien sirve para el Atmega169? que tendria que cambiar


----------



## Carontre (Abr 6, 2008)

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


----------



## hackrock (Jun 10, 2008)

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.


----------

