TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jose374 en 23 de Noviembre de 2008, 08:46:10

Título: Comunicación RS 487
Publicado por: jose374 en 23 de Noviembre de 2008, 08:46:10
Buenos dias estimados amigos del foro!!!

Me dirijo a ustedes porque necesito crear una red de pic basada en RS487, en la que necesito para empezar que un pic 18f4550 pueda tener disponible el estado de las entradas y controlar las salidas de un 16f877a, para ello es necesario que ambos se comuniquen en forma bidireccional. Para empezar estoy utilizando dos codigos el del 18f4550 se llama maestroA y del 16f877A se llama esclavoA1. Basicamente lo que deberian hacer estos sencillos codigo fuentes pero que no hacen, es que desde el 18f4550 se envie el caracter 'S' hacia el 16f877A luego este verifique que es el dato y de una salida por el puerto D (esto si logro conseguirlo), luego despues que el 16f877A realizo esto procede a enviar un caracter 'R' al 18f4550 que igualmente lo comparara y arrojara una salida por el puerto D (este es el inconveniente que no me llega el caracter 'R' al 18f4550).

Aqui adjunto ambos codigos fuentes para que evaluen y me ayuden a detectar en que estoy equivocado y porque no logro hacer la comunicación de esta manera, o si existe otra manera agradeceria me la facilitaran.

Codigo del maestroA
Código: [Seleccionar]
#include <18F4550.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)
#use rs232(baud=9600,bits=8,UART1)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#define bytes_for_USART_buffer 12

int entb,disp=0;
const char Tipo='R';
static char USART_buffer[bytes_for_USART_buffer];
static int8 USART_nextRec;

void enviar(){
output_bit(pin_c0,1);
delay_ms(5);
printf("S");
delay_ms(5);
output_bit(pin_c0,0);
delay_ms(1);
}

void USART_add_to_buffer(char c){
if(c==Tipo)
output_d(0b01010101);
}

#INT_RDA
void serial_isr(){
char USART_nextChar;
   USART_nextChar='\0';
   if(kbhit()){
      USART_nextChar=getc();
      USART_add_to_buffer(USART_nextChar);
   }
}

void main(){
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
set_tris_b(0xff);
set_tris_d(0x00);
set_tris_c(0b10000000);
output_bit(pin_c0,0);
output_d(0x00);
do{
entb=input_b();
if(disp==0){
enviar();
disp=1;
}
}while(true);
}

Codigo del esclavoA1
Código: [Seleccionar]
#include <16F877.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)
#use rs232(baud=9600,bits=8,UART1)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#define bytes_for_USART_buffer 12

const char Tipo='S';
static char USART_buffer[bytes_for_USART_buffer];
static int8 USART_nextRec;

void enviar(){
output_bit(pin_c0,1);
delay_ms(5);
printf("R");
delay_ms(5);
output_bit(pin_c0,0);
delay_ms(1);
}

void USART_add_to_buffer(char c){
if(c==Tipo)
output_d(0b01010101);
enviar();
}

#INT_RDA
void serial_isr(){
char USART_nextChar;
   USART_nextChar='\0';
   if(kbhit()){
      USART_nextChar=getc();
      USART_add_to_buffer(USART_nextChar);
   }
}

void main(){
set_tris_b(0xff);
set_tris_d(0x00);
set_tris_c(0b10000000);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
output_bit(pin_c0,0);
output_d(0x00);
do{
entb=input_b();
}while(true);
}

(http://D:\Mis documentos\Mis imágenes\simulacion)

Y a continuación les adjunto los codigos fuentes asi como la simulacion en proteus!!!

Les agradesco de antemano su respuesta!!! Que tengan un feliz dia!!!
Título: Re: Comunicación RS 487
Publicado por: RedPic en 23 de Noviembre de 2008, 10:39:59
Jose:

Me he copiado los dos programas, los he intentando limpiar de "paja" innecesaria y .... no me aclaro con lo que se supone que tienen que hacer.

¿Puedes poner un poco de orden de ideas y describir de forma estructurada lo que deseas que hagan? A ver si así me aclaro y puedo ayudarte.

1º.- El Maestro espera a recibir ... o que pulsen ...
2º.- Lo indica por el PuertoX y envía "A" por la USART
3º.- Vuelve a 1º

o algo parecido.

Porque dices que "... desde el 18f4550 se envie el caracter 'S' hacia el 16f877A ..." y yo me pregunto ¿cuando lo hace? ¿una vez al comenzar el programa? ¿cuando recibe algo por la USART? ¿cuando alguien pulsa algo? ¿cada cierto tiempo? ¿nunca?

Venga verás como  sale andando.  :mrgreen:
Título: Re: Comunicación RS 487
Publicado por: Nocturno en 23 de Noviembre de 2008, 10:49:25
¿Existe RS487 o es una errata?
Título: Re: Comunicación RS 487
Publicado por: RedPic en 23 de Noviembre de 2008, 10:54:35
La verdad es que ni me he dado cuenta ¿487?  :shock:

Conozco el 232, el 485 y el 422 pero el 487 al menos para mi es nuevo.
Título: Re: Comunicación RS 487
Publicado por: MLO__ en 23 de Noviembre de 2008, 14:49:38
Hola.

Si existe el RS487  :-) pero no he encontrado mucha info acerca de eso, no lo conocia hasta hoy!!!!

http://allshemes.com/diagrams/repair/search/?query=rs485%20rs487&nohistory=1&h=1 (http://allshemes.com/diagrams/repair/search/?query=rs485%20rs487&nohistory=1&h=1)
Título: Re: Comunicación RS 487
Publicado por: jose374 en 23 de Noviembre de 2008, 18:48:41
El MAX RS487 si existe de hecho lo estoy utilizando para mi tesis!!!

Aqui les dejo el datasheet adjunto. Lo que sucede es que uno lo busca en internet con ese nombre y no aparece, pero en este datasheet si, aunque en su titulo se refiere al rs 485 y al rs 422 solo hay que leerlo detenidamente. Lo envio en dos partes porque sobrepasa el tamaño permitido por la pagina.
Título: Re: Comunicación RS 487
Publicado por: jose374 en 23 de Noviembre de 2008, 18:49:56
Parte 2
Título: Re: Comunicación RS 487
Publicado por: jose374 en 23 de Noviembre de 2008, 18:51:13
Parte 3 y ultima!!!
Título: Re: Comunicación RS 487
Publicado por: jose374 en 23 de Noviembre de 2008, 19:12:09
Bueno regresando al tema central que es conseguir la comunicación entre ambos pic!!!

Pero ante todo pedir disculpas a los amigos del foro por no haber sido tan claro en cuanto a la explicación del funcionamiento. Bueno primero los interruptores en ambos pic no hacen nada en este caso. El unico que utilizo es el que se encuentra conectado en el pin mclr o reset del 18F4550. El 18f4550 al inicio envia un unico caracter 'S', luego de alli no hace mas nada solo leer el puerto B y esperar a que el 16f877a le envie un unico caracter, cuando el 16f877a recibe el primer y unico valor proveniente del 18f4550 cuando atiende la interrupcion lee el valor o caracter recibido y lo compara con 'S', de ser verdadera la opción se mostrara por el puerto b del 16f877a el valor 01010101 y envia enseguida el caracter 'R', y queda leyendo el puerto B. Al momento en que el 18f4550 recibe el caracter esperado y lo compara, saba por el puerto B del mismo 01010101. A partir de este momento ambos quedan leyendo innecesariamente los puertos B solo lo agregue para otra aplicación que estaba trabajanddo.
Título: Re: Comunicación RS 487
Publicado por: jose374 en 23 de Noviembre de 2008, 19:17:50
Yo solo quiero es que me ayuden con este pequeño ejemplo y yo me encargo de lo demas!!! en realidad a lo que quiero llegar es a crear una red de varios pics un 18f4550, y 3 16f877a como esclavos en los que el maestro se encargara de controlar las salidas y leer las entradas de los 16f877a, pero  como no quiero que me hagan todo el trabajo solo deseo conseguir la comunicacion de estos 2 pic y les prometo que cuando culmine mi trabajo como agradecimiento llo publicare!!! Estare atento esperando su pronta respuesta amigos!!!
Título: Re: Comunicación RS 487
Publicado por: MLO__ en 23 de Noviembre de 2008, 19:42:39
Hola.

Creo que esto solucionara todos tus problemas
http://www.todopic.com.ar/foros/index.php?topic=19057.0 (http://www.todopic.com.ar/foros/index.php?topic=19057.0)
Título: Re: Comunicación RS 487
Publicado por: jose374 en 23 de Noviembre de 2008, 20:05:14
Bueno gracias por tu ayuda amigo pero de alli mismo fue de donde saque el ejemplo. Y no me funciona!!!
Título: Re: Comunicación RS 487
Publicado por: RedPic en 23 de Noviembre de 2008, 21:58:52
¿Como era esa frase del principio de las novelas? ¡Ah, sí! Cualquier parecido con la realidad es mera coincidencia.  :mrgreen:

Título: Re: Comunicación RS 487
Publicado por: jose374 en 23 de Noviembre de 2008, 22:10:32
Lo que sucede es lo siguiente que en el ejemplo que usted publico la comunicación no se realiza entre dos pic!!! aunque no entiendo porque no me da el resultado que espero!!! por eso mismo recurro a ustedes si supiera la respuesta no les preguntara y lo hago porque no encuentro el motivo por el cual no se realiza lo que espero!!! gracias!!!
Título: Re: Comunicación RS 487
Publicado por: jose374 en 26 de Noviembre de 2008, 00:09:21
Buenas noches estimados amigos amigos de todopic!!!

Bueno le di y le di hasta que logre resolver!!! no era error de programación sino de la forma en que tenia conectado los terminales virtuales!!! Me  pude dar cuenta de este detalle cuando lo desconecte cuando  estaba tanteando haber que error lograba conseguir!!! Bueno estoy disponible para cualquier consulta que requiera cualquier usuario!!! sin estar mandandolo a buscar cosas que no tienen relacion con lo que uno esta haciendo!!! y si no se esta en la disponibilidad de responder mejor no se den respuestas vacias!!! bueno publico este ejemplo ya que de verdad no encontre ninguno por el foro y de ser asi que alguien me corrija!!!

Bueno agradesco de igual forma porque de no ser por la información disponiblle en el foro no hubiese llegado tan lejos!!!

Aqui les dejo el archivo en Rar para que lo prueben!!! funciona correctamente!!!
Título: Re: Comunicación RS 487
Publicado por: MLO__ en 26 de Noviembre de 2008, 00:26:45
sin estar mandandolo a buscar cosas que no tienen relacion con lo que uno esta haciendo!!!

 :D :D :D

Pues menos mal el codigo si estaba bien!!!!!

Bueno gracias por tu ayuda amigo pero de alli mismo fue de donde saque el ejemplo. Y no me funciona!!!

es bueno ser cuidadoso con las conexiones, buena conclusion. A veces los fallos son por descuidos, por falta de atencion, y por estar acostumbrados a encontrar todo hecho para darle ctrl+c ctrl+v.

Felicitaciones por solucionarlo

 :-/ :-/
Título: Re: Comunicación RS 487
Publicado por: jose374 en 26 de Noviembre de 2008, 00:36:52
Ok si lo dice porque modifique el codigo es porque ahora si se puede mostrar mutuamente lo que tienen a sus entradas ambos pic asi como leer sus entradas!!!
Ademas le invito a que prueben los dos primeros codigos en este ejemplo ejemplo en proteus y les funcionara!!! el error era que tenia mal conectado el terminal virtual!!! :shock: :shock: :shock: asi que ojo pelao!!!

Y si estuviera acostumbrado a encontrar todo hecho no hubiese llegado a tanto!!! ademas para que darnolas de sabiondos todos empezamos copiandonos de llos ddemas!!! bueno dichosos loss que nacieron con el pic en la mano!!!
Título: Re: Comunicación RS 487
Publicado por: MLO__ en 26 de Noviembre de 2008, 00:44:28
Hola.

Pues no lo decia por ti  :mrgreen: . Asi que no te sientas aludido.  :D :D :D

Título: Re: Comunicación RS 487
Publicado por: AKENAFAB en 26 de Noviembre de 2008, 00:46:25
Felicitaciones compa jose374


Esos detallitos pasan , pero después de esa pelada que te diste seguro que en las proximas no te pasará pues vas adquiriendo experiencia.


Sí todo quedará a la primera y sin fallos uhhhhhhhhhhhhhhhhhh  :D

A veces me pasa eso  xD cuando estoy mucho tiempo embobado con un proyecto que me atasco tanto que no veo ni mi nariz.

Un saludo y siguele dando!
Título: Re: Comunicación RS 487
Publicado por: jose374 en 26 de Noviembre de 2008, 01:05:48
No bueno lo que trato es que algunos usuarios deben reflexionar porque a ellos tambien les puede tocar que alguna ves esten en aprietos y necesiten resolver rapidamente un inconveniente!!! que seguramente algun otro usuario conectado este mas claro pueda ayudarlo y guiarlo hasta lograr conseguir el objetivo!!!
Título: Re: Comunicación RS 487
Publicado por: MLO__ en 26 de Noviembre de 2008, 01:25:58
Pues, creo q si recibiste ayuda ... tu aludiste a un codigo mal hecho, con fallas ... y por ahi se fue la ayuda ... me parece muy complicado que otros se den cuenta de un error de conexion si tu mismo inicias el hilo asumiendo el fallo en otra parte (mira el titulo y la seccion en la que posteaste tu inquietud: Lenguaje C para microcontroladores).

Cabe anotar, sin animo de polemizar las cosas, que muchos de los grandes de aca, son gente muy ocupada y que el solo hecho de merecer una respuesta de ellos es ya un halago.

Saludos.
Título: Re: Comunicación RS 487
Publicado por: jose374 en 26 de Noviembre de 2008, 01:31:53
 :D :D :D :D :D
Ok entonces lo tomare en cuenta!!! y bueno igualmente me pongo a la disponibilidad de otro usuarios para guiarlos a la solución de algun problemita!!!
Título: Re: Comunicación RS 487
Publicado por: jose374 en 26 de Noviembre de 2008, 02:59:15
Bueno amigos aqui les publico la versión mejorada de la publicación anterior, pero ahora con 3 pics!!! En la que el pin a0 del 18f4550 (maestro) permiitira seleccionar por medio de esta entrada con quien comunicarse si con el esclavoa1 si es 0 y con el esclavoa2 si es 1!!!
Título: Re: Comunicación RS 487
Publicado por: RedPic en 26 de Noviembre de 2008, 07:37:43
Me alegra que lo hayas solucionado.  :mrgreen: :mrgreen: :mrgreen:

Y perdona si alguno de nosotros te hemos defraudado y no hemos podido o sabido encontrar el error, al menos lo hemos intentado.  :(

La próxima vez seré mas cuidadoso y si no veo cual es la solución directamente es probable que no lo intente siquiera.  :|

Un saludo.
Título: Re: Comunicación RS 487
Publicado por: Nocturno en 26 de Noviembre de 2008, 08:42:18
Espero que no seas tan cuidadoso cuando yo pregunte algo. Yo prefiero que me lleguen 1000 respuestas y encontrar la solución en alguno de ellos, a que no me contesten hasta estar seguros de tenerla. Seguro que en la multitud de respuestas se encuentran otras ideas que pueden servir para esto o aquello.


Título: Re: Comunicación RS 487
Publicado por: MLO__ en 26 de Noviembre de 2008, 13:17:09
Pues maestro Diego ... yo apoyo a Nocturno en su opinion ... fue asi que mi proyectico de controlar el ascensor de carga fue un exito!!!!! y me sirve mas tu disposicion a la ayuda  :mrgreen: :mrgreen:

Saludos
Título: Re: Comunicación RS 487
Publicado por: RedPic en 26 de Noviembre de 2008, 13:23:56
No, amigos, no os preocupéis que voy a seguir colaborando con todos los amigos que lo necesiten  :mrgreen: :mrgreen: :mrgreen:

Aunque no sepa dar con las soluciones, aunque tarde mas tiempo del que nuestros amigos crean prudente esperar, aunque no me entere de cual es el problema concreto y yerre el diagnóstico, aunque me caliente tontamente cuando recibo críticas que creo injustas porque en el fondo mi naturaleza me empuja a ayudar, aunque a veces no lo consiga o no lo consiga a tiempo. Pero por lo menos lo seguiré intentando.  :D :D :D