TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: cheapekt 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
-
Fijate que el pin 2/3 del transceiver RS485 necesita estar en ALTO (output high) para habilitar el envío.
Saludos
-
Maunix, muchas gracias. Lo pruebo y te comento
-
Lo he probado y sigue sin funcionar, por favor alguien me puede echar una mano
Gracias de antemano!
-
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
}
}
-
Pero de acuerdo a tu esquematico tu manejas la habilitacion con B5 y NO C5, entonces deberias reemplazar la linea
por
-
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
}
}
-
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?
-
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
-
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?
-
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)
-
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=21810.0;attach=6980)
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
-
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
-
Lo he probado con las resistencias pero sigue sin llegarme nada después del MAX......algo mal hago y no logro averiguar el que.
-
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
-
Una cosa más, en el esquema original la habilitación la manejabas por el pin B5 pero ahora hablas del pin C5, ¿cambiaste el esquema original?. Si es así, checkeaste que la habilitación que utilizas en el prg sea la misma que utilizas en el hardware
Saludos, Sergio
-
Muchas gracias IOIO por todas tus sugerencias
He realizado todas las conexiones y pruebas que se han dicho, creo que el problema está en la programación del programa ya que no se me enciende el led ni parpadea, el Led lo eh colocado en el PIN B1. Los leds de comunicación de el rx y el tx tampoco se me encienden, pero en la salida del PIC en el pin C7 (RX) tengo un voltaje de 5 voltios,
en el C6 (TX) tengo 0 voltios
y en el C5(activación) tengo 0 voltios
el oscilador funciona a 20 Megahercios.
Al MAX la patilla de recibir la tengo a 5 voltios,
Las de activación y la de enviar las tengo a 0 voltios.
los cables de transmisión de datos A y B me dan el A 2.47 y el B 2.23voltios
y sigue sin pasarme datos .....
El programa no se debe ejecutar bien porque el LED del pin B1 nunca se llega a enchufar.
#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_C5,errors) //enable=PIN_C5 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,
output_HIGH(PIN_B1); // 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_B1); // se apaga el led
delay_ms(250); // esperas otros 0,25 seg para enviar nuevamente el dato,
}
}
Muchas gracias
Saludos!
-
Hola cheapekt, en principio por lo que dices el programa no está corriendo!. Pero en el mplab lo simulé y al menos el led debería parpadear, por lo que descartaría un error en el programa.
Nos queda el hardware.
¿Estas seguro que el cristal o micro funcionan, como sabes que estas grabando correctamente el micro, que grabador usas?
Si sabes que el grabador funciona y graba correctamente al micro, prueba de dejar en el programa solo la rutina de parpadeo del led.
Comienza por lo muy básico y agregale el resto luego de cerciorarte que está ok.
Saludos y cuentame que pasó.
Sergio
-
Utilizo el PIC star PLUS,
Y si que funciona, ya que he hecho otro programa que enciende un led y ese si que me funciona,
Sin embargo el que esta hecho para enviar los datos a traves del MAX485 no se me encienden los leds. Qizas el programa hay algo que no esta bien declarado alguna funcion, nolose.... :( pero no logro encontrar el motivo. :(
SAludos!
-
Viendo que según los dichos de cheapekt el código funciona y tu dices que no, yo intuyo que del otro lado (algo está tirando el bus abajo y se te está bloqueando el max485). Porque no pruebas conectarlo a RS232?
-
Puede ser lo que dice Maunix, porque aunque sea no quitas el max485 y dejas los leds. El que esta en B1 deberá parpadear y el de TX tambien dado que por el pin de TX el micro sacará los datos aunque no esté el max485
saludos
-
Muy buenas de nuevo... he estado un tiempo de vacaciones y ahroa reprendo mi menester,
Para situarme he montado el circuito siguiente y he puesto un codigo que tansolo enciende y para un led:
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,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5,errors) //enable=PIN_C5 hace que el C maneje el pin de habilitación
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)
{
output_HIGH(PIN_B1);
delay_ms(250);
output_LOW(PIN_B1);
delay_ms(250);
}
}
EL problema esque no se me ha encendido el LED..... ya no estoy en el laboratorio, mañana volvere a montar el circuito de nuevo y con el tester vere si puede ser la conexion fisica, por lo que respecta a la programacion creo que es buena ya que es la misma que tenia anteriormente.
Un saludo, os ire informando!
Muchas gracias
-
Perfecto amigos!!!!1
Ya me funciona este miniprogramilla ..... ahora iré a por el siguiente paso!!! ya os informaré!!! que ilusión!!!!!!!!!!!!!!!!!!!
-
Me parece que no me funciona el programa debido a al conexión física de el max485,
leyendo el datasheet he llegado a una duda, si alguien me pudiese echar una mano se lo agradecería.
Salen 2 conexiones físicas diferentes y realmente no se cual he de utilizar. las conexiones se pueden ver en el fichero adjunto, alguien me podría indicar cual es la qu tengo que utilizar. Muy amables.
Gracias de antemano
-
Dale un vistazo a este proyecto por si te sirve para aclarar las ideas. Lo tengo montado alrededor de un DS75176 que es un Clon del MAX485. El RS485, un Relé en la lejanía: Hardware y Software (http://www.todopic.com.ar/foros/index.php?topic=19057.msg135398#msg135398)
(http://picmania.garcia-cuervo.net/images/Profesional - RELE485 - 01 - Schema - Thumb.GIF) (http://picmania.garcia-cuervo.net/images/Profesional - RELE485 - 01 - Schema.GIF)