TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: dawaherjesus en 06 de Julio de 2008, 01:52:36

Título: Interfaz RS-232
Publicado por: dawaherjesus en 06 de Julio de 2008, 01:52:36
hola a todos, como les va? estoy haciendo un proyectico pero estoy estancado en un punto de comunicacion entre 4 pic

lo que quiero es ver si alguien tendra algo de informacion sobre el RS-232 que lo voy a usar para comunicar los pic pero no se como usar esa interfaz
lo pienso hacer en CCS que es lo que conosco y primero hacerlo entre dos pic para probar y luego ir aumentando la cantidad de pic hasta llegar a los 4



Título: Re: Interfaz RS-232
Publicado por: Azicuetano en 06 de Julio de 2008, 05:53:53
Hola  dawaherjesus.

Has tenido en cuenta la opción de utilizar RS485?

Creo que es lo que mejor se adapta para lo que quieres hacer. Pégale un vistazo y valora la posibilidad.

Cuando te decidad postea. Es un tema muy tocado en el foro, no te va a costar mucho hacerlo.


Un saludo desde Alicante.
Título: Re: Interfaz RS-232
Publicado por: dawaherjesus en 06 de Julio de 2008, 12:28:36
en si el que pienso usar es el RS-485 que se adacta mas al proyecto pero como no se nada del tema quiero empesar por el RS-232
Título: Re: Interfaz RS-232
Publicado por: gera en 06 de Julio de 2008, 16:14:23
Buenas dawaherjesus. Cual es tu problema especificamente? Aca te dejo algo de informacion sobre rs232 para q leas un poco:
http://www.iearobotics.com/proyectos/cuadernos/ct1/ct1.html
(en tu caso la electronica no va a ser problema ya que no hay q adaptar niveles de tension)

Con respecto al software, es muy simple, ya que el CCS incluye librerias que implementan RS232. En el foro hay muchos ejemplos.
Aca te dejo uno q hice yo hace un tiempo:
Código: [Seleccionar]
#include <16F84A.h>
#fuses XT, NOWDT, NOPROTECT
#use delay(clock=4000000)
#define Tx PIN_A0 // PIN de Transmisión
#define Rx PIN_A1 // PIN de Recepción

#use fast_io (a)
#use fast_io (b)
#use rs232(baud=9600, xmit=Tx, rcv=Rx)

void main(void)
{
   set_tris_b(0x00);
   set_tris_a(0b00000010);
 
   printf("pic a la espera\n");
   while(true)
   {
      putc(getc());              // eco de lo que recibo
   }
}

Lo que si, tendrias q implementar conceptos de redes, ya que tendrias q establecer una topologia, un protocolo de capa de enlace, etc... Para esto podrias utilizar un ucontrolador de maestro, y que todos los demas se conecten a el; o hacer algo parecido a ethernet, donde todos se comunican con todos.

Cualquier duda, pregunte.
Título: Re: Interfaz RS-232
Publicado por: odukec en 07 de Julio de 2008, 02:23:03
Hola..

Basicamente la especificación RS232, solo permite comunicación entre dos dispositivos, para esto seria mejor utilizar RS485, si los dispositivos estan retirados una gran distancia, para ello debes conseguir un driver para cada micro, como lo es el max485... en otro caso si estan cercanos, una buena opcion es usar i2c.

Saludos
Título: Re: Interfaz RS-232
Publicado por: gera en 08 de Julio de 2008, 13:20:31
no me habia dado cuenta, es cierto lo q dicen aca arriba. No vas a poder hacer una red de pics con rs232... asiq anda pensando en otra cosa. La idea de i2c esta piola... yo apuntaria por ese lado
saludos!
Título: Re: Interfaz RS-232
Publicado por: dawaherjesus en 08 de Julio de 2008, 14:13:26
bueno yo pense en hacerlo con i2c pero me sirve por que voy a usar mucha distancia, ya idee en si como lo voy a hacer, voy a usar RS-485 para comunicar los pic
y voy a usar un pic maestro y 2 o 3 esclavos, lo que quiero es que cuando yo pise un pulsador que esta conectado al pic maestro, el mande la orden a uno de los esclavos 1  y active un rele y asi con cada esclavo

la electronica como tal no me preocupa pero el programa si por que no se como hacerlo
Título: Re: Interfaz RS-232
Publicado por: dawaherjesus en 08 de Julio de 2008, 14:16:04
se me olvido decir, la distancia entre el pic maestro y los esclavos es de una distancia maxima de 100 metros y una minima de 20 metros
Título: Re: Interfaz RS-232
Publicado por: dawaherjesus en 09 de Julio de 2008, 15:08:41
como les va e estado buscando en la web y en el foro y encontre este ejemplito en CCS C par trabajar con el RS-485 a ver si alguien me lo puede
explicar que no lo entiendo muy bien

Código: [Seleccionar]
#include <16F628A.h>
#device *=16
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, stream=PC)

#define  RS485_RX_BUFFER_SIZE 64
#define  RS485_USE_EXT_INT    TRUE

int8 OUR_RS485_ID = 0;
#define RS485_ID OUR_RS485_ID

#include <rs485.c>
#include <stdlib.h>

int8 in_char = 0;
int8 next_in = 0;
int8 next_out = 0;
int8 msg[64];

#INT_RDA
void serial_isr()
{
   in_char = fgetc(PC);
}

#INT_TIMER1
void timer1_isr()
{
   int8 i;

   if(rs485_get_message(msg, FALSE))
   {
      printf("\n\r%d: ", msg[0]);

      for(i=0; i < msg[1]; ++i)
         putc(msg[i+2]);

      printf("\n\r");
   }
}

void RS485send(char* s, int8 id)
{
   int8 size;

   for(size=0; s[size]!='\0'; ++size);

   rs485_wait_for_bus(FALSE);

   while(!rs485_send_message(id, size, s))
      delay_ms(OUR_RS485_ID);
}

char PCgetc()
{
   in_char = 0;

   while(!in_char);

   return in_char;
}

int8 PCgetInt()
{
   int8 i, s[3];

   for(i=0; (s[i]=PCgetc()) != '\r' && i<3; ++i);

   return atoi(s);
}

char* PCgetMsg()
{
   int8 i;

   for(i=0; (msg[i] = PCgetc()) != '\r' && i<64; ++i);

   msg[i] = '\0';

   return &(msg[0]);
}

void main()
{
   int8 i, send_addr = 0;
   char command;

   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);

   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   rs485_init();

   while(OUR_RS485_ID == 0 || OUR_RS485_ID >= 255)
   {
      printf("Please choose a network ID (1-255): ");
      OUR_RS485_ID = PCgetInt();
   }

   printf("\n\rYour ID is: %d\n\r\n\rIf you require assistance, press h.\n\r", OUR_RS485_ID);

   while(command != 'Q')
   {
         enable_interrupts(INT_TIMER1);

         command = toupper(PCgetc());

         disable_interrupts(INT_TIMER1);

         switch(command)
         {
            case 'S':
               if(send_addr == 0 || send_addr > 255)
               {
                  printf("\n\r\n\rEnter send address (1-255): ");
                  send_addr = PCgetInt();
               }

               printf("\n\r%d:>", send_addr);
               RS485send(PCgetMsg(), send_addr);
               printf("\n\r");
               break;

            case 'C':
               send_addr = 0;

               while(send_addr == 0 || send_addr > 255)
               {
                  printf("\n\r\n\rEnter send address (1-255): ");
                  send_addr = PCgetInt();
                  printf("\n\r");
               }
               break;

            case 'I':
               OUR_RS485_ID = 0;

               while(OUR_RS485_ID == 0 || OUR_RS485_ID >= 255)
               {
                  printf("\n\rPlease choose a network ID (1-255): ");
                  OUR_RS485_ID = PCgetInt();
               }
               printf("\n\rYour ID is: %d\n\r\n\r", OUR_RS485_ID);
               break;

            case 'H':
               printf("\n\rCommands: (S)end message, (C)hange Send Address, ");
               printf("Change (I)D, (H)elp, (Q)uit.\n\r");
               break;

            default:
               if(command != 'Q')
                  printf("\n\rInvalid command!\n\r");
         }
   }
}

muchas gracias de ante mano espero me puedan ayudar
Título: Re: Interfaz RS-232
Publicado por: dawaherjesus en 29 de Marzo de 2009, 00:20:56
como les va e retomado el proyecto, ya e aclarado muchas cosas y tengo casi todo listo pero tengo una ultima duda como hago para la programación del pic master me refiero a esto:

*como pongo en la programación que el pic va a ser master
* como hago para que cuando pise el pulsador comience la transmisión de datos

la parte de los resectores o slaves ya la tengo lista
Título: Re: Interfaz RS-232
Publicado por: ASTROCAR en 29 de Marzo de 2009, 20:03:06
Oye lo que entiendo es esto que quieres establecer comunicacion con una red de pic que estan a 100m pero no dices a que distancia estan entre si esa red de pic porque el enlace lo pudieras hacer via rf y luego si los pic estan cerca entre si haces un codigo que envie la informacion al pic que quieras y asi tendrias todo listo.

Atten.
Alexander Santana.
Barcelona-Venezuela.
Título: Re: Interfaz RS-232
Publicado por: dawaherjesus en 29 de Marzo de 2009, 21:23:20
no puede ser con rf; por q el proyecto es para manejar fuegos artificiales y el rf es muy inseguro. la distancia entre un pic y otro no va hacer mayor a 100mts; si quieres dame tu correo y te explico mejor.
Título: Re: Interfaz RS-232
Publicado por: ASTROCAR en 30 de Marzo de 2009, 06:00:21
Hola buenos dias no tendria problema en pasarte mi msn para estar en contacto mas directo pero igual recuerda que esto es una comunidad y a los demas tambien le gustaria saber  bien tu explicacion para asi poder ayudarte asi que en lo posible manejemos el tema aca y con seguridad entre todos aportamos.

Atten.
Alexander Santana.
Barcelona-Venezuela.
Título: Re: Interfaz RS-232
Publicado por: MLO__ en 30 de Marzo de 2009, 15:22:32
Podria ser algo asi:

Código: C#
  1. if(input(pin_a1))//Suponiendo que el pulsador esta en RA1
  2. {
  3.  delay_ms(50);//antirrebotes
  4.  if(input(pin_a1))
  5.  {
  6.   printf(.....);//Aqui colocas el comando que tu has definido para que los SLAVES lo entiendan
  7.  }
  8. }

Saludos
Título: Re: Interfaz RS-232
Publicado por: dawaherjesus en 31 de Marzo de 2009, 15:55:10
Como les va me alegra mucho que me estén ayudando y tienes razón ASTROCAR te dije eso es porque de verdad quiero aprender a manejar el rs 485 y quiero hacer mi proyecto que lo tengo en mente desde hace mucho.

Les explico lo que quiero hacer: se trata de prender fuegos artificiales a distancia, por rf no lo puedo hacer ya que me parece inseguro (e visto algunos accidentes con rf nada normales ya que los radios que usa la policía o algún aficionado los activa porque no se) por eso decidí hacerlo en RS 485 usando un MAX 485

La consola consiste en un panel de pulsadores que seria el master y otros paneles de relés y otras cosas que serian los slaves
El funcionamiento es fácil cuando se toca uno de los pulsadores el rele asignado a ese pulsador se activa y prende un fósforo eléctrico, ese seria la función principal.

Hay algunas consolas más avanzadas que tienen temporizadores, conexión usb etc. pero aun no quiero meterme con eso hasta no manejar bien el 485.

Ya la parte del slave la tengo lista teóricamente claro nada mas me falta la parte del master que no se bien como hacer la programación
Aquí les dejo algunas fotos de algunas consolas profesionales para que tengan una idea de más o menos que es lo que quiero

ASI ES LA QUE ME GUSTARIA HACER

(http://img18.imageshack.us/img18/472/watermark751.jpg)

ESTE ES EL MASTER PERO CON RF
(http://img9.imageshack.us/img9/8388/64133011.jpg)

ESTE ES EL SLAVE CON RF
(http://img9.imageshack.us/img9/9708/64133012.jpg)
Título: Re: Interfaz RS-232
Publicado por: MGLSOFT en 31 de Marzo de 2009, 16:55:38
Creo que deberias inclinarte por el BUS CAN.
Tiene opciones mucho mas solidas en cuanto a comunicacion que cualquier bus de campo, y ademas hay modulos como el MCP25050 con 8 I/O incorporadas que permiten hacer un manejo rapido de salidas a buen precio.
En cuanto a robustez seguramente supera a RS485, donde hay que escribir un protocolo o usar algun otro, mientras CAN lo tiene implementado en el hardware...

Si quieres saber mas, date una vuelta en Proyectos >> Mis experiencias con el BUS CAN y podras ver si te sirve o no.
Como dato, los aros olimpicos de los juegos de Beijin y los manejos de fuegos de artificio (en el que los Chinos son maestros), fueron hechos con este tipo de buses de campo. :mrgreen:
Título: Re: Interfaz RS-232
Publicado por: MLO__ en 31 de Marzo de 2009, 23:55:52
Hola.

Pues si ya esta el del slave, el del master es tan solo enviar los comandos con un printf(); tal como te lo indique en el anterior post.

La trama a enviar podria ser: S11! en donde S indicaria que el mensaje es para algun Slave, 1 que es para el Slave1 (por si hay mas), 1 para indicar que debe encender el switch y ! para indicar el final de la trama.

Como te digo, si los slaves ya saben que hacer con los comandos que reciben, el Master solo debe enviarlos en funcion del pulsador que se persione.

Saludos.
Título: Re: Interfaz RS-232
Publicado por: dawaherjesus en 02 de Abril de 2009, 00:08:58
lo del BUS CAN esta muy bueno, MGLSOFT me gusto esa placa de desarrollo podrías pasarme los planos si no es mucha molestia.

con respecto a mi proyecto de verdad prefiero hacerlo en rs 485 porque ya medio lo conozco, con lo de la programación a ver si es así:

Código: [Seleccionar]
if(input(pin_a1))//Suponiendo que el pulsador esta en RA1
{
delay_ms(50);//antirrebotes
if(input(pin_a1))
{
printf(USART_activa_tx());//Aqui colocas el comando que tu has definido para que los SLAVES lo entiendan
}
}
Título: Re: Interfaz RS-232
Publicado por: MLO__ en 02 de Abril de 2009, 00:15:42
Hola.

No, no es asi como te decia. Seria mas o menos asi:

Código: C#
  1. if(input(pin_a1))
  2. {
  3.  delay_ms(50);
  4.  if(input(pin_a1))
  5.  {
  6.   printf("S11!");//Envio el comando
  7.  }
  8. }

El modulo esclavo va a recibir esa trama: S11! y la procesará adecuadamente asi:
S: Reciben los modulos Slaves
1: Recibe el modulo Salve1 -si hay mas, los otros ya no podran procesar el comando siguiente-.
1: Enciende el switch -esto solo lo hace el modulo Slave 1.
!: Final de la trama.

Saludos
Título: Re: Interfaz RS-232
Publicado por: dawaherjesus en 02 de Abril de 2009, 01:08:54
disculpa pero nada mas con el printf() comienza la transmisión de datos por el rs485 o tengo que colocar algo mas en el programa
no entiendo muy bien :(
Título: Re: Interfaz RS-232
Publicado por: MLO__ en 02 de Abril de 2009, 01:18:15
Hola.

No. Logicamente los Slaves deben tener habilitada la recepcion y el Master la transmision. Pero supongo que en tu caso la comunicacion es en modo simplex.
Título: Re: Interfaz RS-232
Publicado por: MGLSOFT en 02 de Abril de 2009, 16:50:59
lo del BUS CAN esta muy bueno, MGLSOFT me gusto esa placa de desarrollo podrías pasarme los planos si no es mucha molestia.

con respecto a mi proyecto de verdad prefiero hacerlo en rs 485 porque ya medio lo conozco, con lo de la programación a ver si es así:

Código: [Seleccionar]
if(input(pin_a1))//Suponiendo que el pulsador esta en RA1
{
delay_ms(50);//antirrebotes
if(input(pin_a1))
{
printf(USART_activa_tx());//Aqui colocas el comando que tu has definido para que los SLAVES lo entiendan
}
}


Esta todo publicado en el hilo.
Igual puedes encontrar el archivo en :
http://rs258.rapidshare.com/files/75629129/Placa_CAN_ETH.pdf (http://rs258.rapidshare.com/files/75629129/Placa_CAN_ETH.pdf)

Suerte y saludos!! :mrgreen:
Título: Re: Interfaz RS-232
Publicado por: dawaherjesus en 03 de Abril de 2009, 01:43:41
de verdad estoy medio tapado con la programación del rs 485 no entiendo como hacerlo :(

MGLSOFT esta medio complicado de armar pero voy a hacerla pero primero quiero terminar con este proyecto rl tuyo lo hiciste en eagle o en que programa
Título: Re: Interfaz RS-232
Publicado por: MGLSOFT en 03 de Abril de 2009, 08:30:12
En realidad al nodo A podrias quitarle todo lo de ethernet y se simplifica mucho.
Esta hecho en Protel99
Título: Re: Interfaz RS-232
Publicado por: dawaherjesus en 31 de Mayo de 2009, 17:36:36
Como están amigo ya e logrado resolver muchas cosas en este tema pero aun tengo una duda como hago para que el pic Slave reciba varios comandos osea cuando reciba S11 active RA1 cuando reciba S12 active RA2 me entienden?