Autor Tema: conexion rs485  (Leído 7578 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
conexion rs485
« en: 19 de Mayo de 2008, 16:31:45 »
Buenas compañeros!

LLevo 1 mesecillo intentando comunicar un pic16f877 con mi PC a través del protocolo rs 485,

He creado un programa muy simple que envia un dato al ordenador: es el siguiente

#include <16F877.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES PROTECT                  //Code protected from reads
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay(clock=20000000)

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
static int y=5;

 
void main (void)

{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   //set_tris_c(0b000000);
   output_LOW(PIN_C5);
while(TRUE)
{
printf("temperatura=%u ", y);
}
   
}


Y he realizado la siguiente conexión física, ando un poco desesperado, alguien podría indicarme que error he cometido,
creo que el error está en la conexión pero no logro encontrarlo.

gracias de antemano

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: conexion rs485
« Respuesta #1 en: 19 de Mayo de 2008, 18:53:19 »
Fijate que el pin 2/3 del transceiver RS485 necesita estar en ALTO (output high) para habilitar el envío.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: conexion rs485
« Respuesta #2 en: 20 de Mayo de 2008, 02:20:59 »
Maunix, muchas gracias. Lo pruebo y te comento

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: conexion rs485
« Respuesta #3 en: 20 de Mayo de 2008, 08:41:27 »
Lo he probado y sigue sin funcionar, por favor alguien me puede echar una mano

Gracias de antemano!

Desconectado IOIO

  • PIC10
  • *
  • Mensajes: 46
Re: conexion rs485
« Respuesta #4 en: 20 de Mayo de 2008, 20:17:21 »
Prueba el programa con las siguientes modificaciones (las que están comentadas en negrita).
Si agregas " enable=PIN_B5 " a la definición del " #use rs232 " el C se encarga de agregar código que maneje el PIN B5 para enviar y recibir datos, aunque por el momento solo envías conviene preveer una ampliación del programa 8)

Al HardWare no le encuentro ningún problema, pero en el programa que posteaste antes, estaba el pin B5 siempre a 0, por lo que nunca se transmitiría ningún dato, como te sugirió Maunix.
Si modificas el programa como te indiqué, puedes olvidarte de la habilitación del driver 485.

Cualquier duda pregunta y vemos que podemos hacer  :)
Saludos y espero haberte ayudado.
Sergio

#include <16F877.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES PROTECT                  //Code protected from reads
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay(clock=20000000)

#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7,enable=PIN_B5,errors)
//enable=PIN_B5 hace que el C maneje el pin de habilitación


static int y=5;

 
void main (void)

{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   //set_tris_c(0b000000);

//   output_LOW(PIN_C5);    //esta línea no es necesaria dado que el C maneja el pin de habilitación
while(TRUE)
{
   printf("temperatura=%u ", y);
   delay_ms(500);                  // espera por ejemplo 0,5 seg para enviar nuevamente el dato,
                                           //  sino puedes generar un overflow en el buffer de recepción de la PC

}
   
}
Desde Avellaneda, Buenos Aires. Argentina

Saludos,
Sergio

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: conexion rs485
« Respuesta #5 en: 21 de Mayo de 2008, 00:51:21 »
Pero de acuerdo a tu esquematico tu manejas la habilitacion con B5 y NO C5, entonces deberias reemplazar la linea

Código: C
  1. output_LOW(PIN_C5)
por
Código: C
  1. output_HIGH(PIN_B5)

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: conexion rs485
« Respuesta #6 en: 21 de Mayo de 2008, 02:20:40 »
Muchas gracias,

IOIO me dices que si pongo la función enable=PIN_B5   no hará falta indicar cuándo quiero enviar y cuando quiero recibir datos. Es decir el código quedará tal y como me lo has dicho tu?

#include <16F877.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES PROTECT                  //Code protected from reads
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay(clock=20000000)

#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7,enable=PIN_B5,errors)
//enable=PIN_B5 hace que el C maneje el pin de habilitación

static int y=5;

 
void main (void)

{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);



while(TRUE)
{
   printf("temperatura=%u ", y);
   delay_ms(500);                  // espera por ejemplo 0,5 seg para enviar nuevamente el dato,
                                           //  sino puedes generar un overflow en el buffer de recepción de la PC
}
   
}

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: conexion rs485
« Respuesta #7 en: 21 de Mayo de 2008, 08:38:22 »
cheapekt el integrado que usas, si le pones 5V (o un alto porque algunos de esta familia funcionan a 3,3v) sacará hacia el bus rs485 los datos que tu le envíes por el pin  4 (Transmisión).

Si lo pones en bajo (0V) habilitará la recepción. 

No puedes enviar y recibir al mismo tiempo, por eso el RS485 es 'half duplex'.  Si necesitas algo en simultáneo con niveles RS485 entre 2 dispositivos solamente puedes usar un MAX485 o equivalente para cada señal (TX y RX) y esto tanto para la PC como para el PIC.

Aparte de todo esto,  ¿el circuito del lado de la PC funciona? Tienes un osciloscopio?
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: conexion rs485
« Respuesta #8 en: 22 de Mayo de 2008, 02:21:05 »
En principio el circuito del lado de la PC si que tiene que funcionar ya que es comercial, es un convertidor de rs485 a usb.
Que lo conecto al max mediante un cable rj11 de 4 cables, para tan solo usar 2.

Pero no me comunica con el PC. Y ya no se que probar, tiene que ser fallo de las conexiones, pero le doy vueltas y vueltas y no se lo encuentro. Vosotros que tenéis más experiencia ¿qué posibilidad hay de alguna conexión que no esté realizando bien?

Gracias de antemano

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: conexion rs485
« Respuesta #9 en: 22 de Mayo de 2008, 13:10:21 »
Pero tienes osciloscopio? puedes ver si realmente sacas datos por el pic en modo rs485??

Y si esto es así, el conversor que usas no tiene un pin para GND?
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado IOIO

  • PIC10
  • *
  • Mensajes: 46
Re: conexion rs485
« Respuesta #10 en: 22 de Mayo de 2008, 19:30:32 »
Con respecto a tu pregunta sobre el programa, es así, te puedes olvidar del pin B5 que lo manejará el C. Por otro lado como te sugieren los amigos del foro debes ver si salen los datos del micro y desde la pc. Te sugiero que como dice Maunix utilices un osciloscopio y si no tienes puedes colocar unos leds a +5V como te sugiero en la imagen (en el ejemplo utilizo como habilitación el pin C5, pero puedes utilizar el B5 como en tu caso). Estos leds te permitirán ver cuando se envían o reciben datos.
Las resistencias de la derecha son para adaptar la impedancia (R27=120R y R20 y R30=1K2 son para fijar un nivel de tensión en el caso que la linea esté desconectada; los jumpers son para el caso en que quieras o no utilizar estas características)
Desde Avellaneda, Buenos Aires. Argentina

Saludos,
Sergio

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: conexion rs485
« Respuesta #11 en: 22 de Mayo de 2008, 22:27:43 »


Hola, otra prueba simple es colocar un diodo led bicolor de dos terminales, o 2 dos led en antiparalelo, con una resistencia limitadora de unas 330 0 470 ohm,  entre los pines de comunicacion A-B , y al llegar un dato, etos tendrian que destellar rapidamente, y luego quedar encendido solo uno...  :mrgreen:

Suerte!

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: conexion rs485
« Respuesta #12 en: 23 de Mayo de 2008, 12:22:15 »
Buenas señores,

Os agradezco enormemente la ayuda que me están mostrando.  Ya he montado el circuito, y he compilado el código ta y como se ha dicho en el foro, pero sigue sin llegarme señal al PC. Lo curioso que midiendo voltajes es que el pin C5 me da 0 voltios y el PIN C6 de transmisión me da 5 voltios. Sin embargo en las patillas del MAX 485 A y B no existe voltaje alguno.  EN MI CIRCUITO NO HE PUESTO LA ALIMENTACIÓN DE LOS CABLE A Y B Y LAS RESISTENCIAS DE 1K2. ¿PUEDE SER EL MOTIVO DE EL NO FUNCIONAMIENTO DE LA COMUNICACIÓN?

Es posible que el MAX esté roto?  Cómo puedo saber si es el MAX?

NO veo la luz en este frondoso bosque.

Muchísimas gracias de antemano compañeros

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: conexion rs485
« Respuesta #13 en: 23 de Mayo de 2008, 12:57:16 »
Lo he probado con las resistencias pero sigue sin llegarme nada después del MAX......algo mal hago y no logro averiguar el que.

Desconectado IOIO

  • PIC10
  • *
  • Mensajes: 46
Re: conexion rs485
« Respuesta #14 en: 24 de Mayo de 2008, 10:50:54 »
Hola Cheapekt, organicemos un poco el trabajo realizado hasta el momento, porque sino haremos pruebas deficientes y obtendremos resultados equivocados. :?

Por lo que veo intentas enviar un dato (ej temperatura) a una PC, ¿ con el circuito que te indique (el de los leds) ves salir los datos desde el SN75176 ?, si no ves que se prenda el led de TX hay un error en el programa o en los pines del micro.

Por otro lado ¿estas seguro que el programa esta corriendo, no? si no estas seguro puedes prender un led en forma intermitente y a baja frecuencia dentro del flujo del programa como para asegurarte de que es así, es tonto hacer esto pero puede evitarte perder tiempo hasta que encuentres un problema en el hardware.

{
   printf("temperatura=%u ", y);

   output_HIGH(PIN_C0);        // por ejemplo conectas un led entre el pin C0 y masa y este debe prender
   delay_ms(250);                  // espera por ejemplo 0,25 seg
   output_LOW(PIN_C0);         // se apaga el led
   delay_ms(250);                  // esperas otros 0,25 seg para enviar nuevamente el dato,
                                           //  sino puedes generar un overflow en el buffer de recepción de la PC

}

Si ves salir salir los datos desde el SN75176 y no te llegan a la PC, puede que tengas un problema en el conversor RS485 - USB, no te olvides que este tiene un driver que hay que instalar en el sistema operativo de la PC y puede haber algún error aquí.

Cuentanos cuales fueron los resultado de las pruebas, mas allá de que sigue sin funcionar, cuentanos lo que has probado, como lo probaste, y así juntos intentaremos encontrar el problema.

Saludos Sergio
Desde Avellaneda, Buenos Aires. Argentina

Saludos,
Sergio


 

anything