# Comunicacion de PIC a PIC por usart por medio de PBP compiler



## santes (Dic 15, 2011)

Que tal brothers , estoy tratando que mis dos pics 18f4550 se puedan comunicar entre si, los estoy programando con el compilador Picbasic Pro de MELABS. Y estoy simulando la comunicación en el proteus. 

En el programa manda un dato que recojo del puerto B del PIC_Transmisor, una vez hecho esto, mando ese dato por el Bit 6 de puerto C a 9600 baudios. El Pic_Receptor recibe el dato por el bit 7 del puerto C, a la misma velocidad, 9600 baudios. y cuando lo recibe lo envía al puerto D.

El oscilador lo he configurado como interno  a 8Mhz


*Aquí el código:*

*CÓDIGO DEL TRANSMISOR:*


```
Include "modedefs.bas"
LLAVE var BYTE
DEFINE OSC 8  'OSCILADOR 
TRISC=0
TRISB=255
    
    INICIO:
 
      LLAVE=PORTB
    
      serout PORTC.6,T9600,[LLAVE]   

      GOTO INICIO
```

*CÓDIGO DEL RECEPTOR*


```
Include "modedefs.bas"
DEFINE OSC 8  'OSCILADOR 
LLAVE Var BYTE  


TRISD=0

   INICIO:
 
   serin PortC.7,T9600,  LLAVE   
 
   PORTD= LLAVE

   GOTO INICIO
```


El problema es que que el dato enviado no coincide con el que se proyecta en el puerto D del receptor, al cambiar el dato enviado, la salida en el puerto D también cambia, pero no coincide con lo que envió, por ejemplo si mando el dato:

*0b00000000*

recibe el dato:

*0b00000000*

pero si envió:

*0b01010101 *

recibe el dato:

*0b11110000*

si envio:

*0b11111111*

recibo esto:

*0b01111111*


y cosas por el estilo. Sabrían ¿a que se debe?

He cambiado los valores de la transmisión a 2400 bds, 4600 bds, etc, tambien el valor del oscilador interno de 8Mhz a 4Mhz con diferentes valores de velocidad de baudios

_Gracias por su atención y tiempo _
*
Carlos Hernández Santes*


----------



## D@rkbytes (Dic 16, 2011)

santes dijo:


> Que tal brothers , estoy tratando que mis dos pics 18f4550 se puedan comunicar entre si, los estoy programando con el compilador Picbasic Pro de MELABS. Y estoy simulando la comunicación en el proteus.
> 
> En el programa manda un dato que recojo del puerto B del PIC_Transmisor, una vez hecho esto, mando ese dato por el Bit 6 de puerto C a 9600 baudios. El Pic_Receptor recibe el dato por el bit 7 del puerto C, a la misma velocidad, 9600 baudios. y cuando lo recibe lo envía al puerto D.
> 
> ...


Saludos.
No se si sea porque has modificado varias veces el programa, o porque tienes un error en el receptor.
El transmisor lo tienes configurado a 9600 Baudios y el receptor a 9400 Baudios.
La comunicación serial entre PIC's tiene que ser mas modelada que un solo tira y cacha.
Aqui en el foro hay varios ejemplos en PBP del uso de SERIN y SEROUT (Usa el buscador del foro)
Yo personalmente he subido algunos. Escribe SERIN o SEROUT en el buscador y saldran varios Posts.
BYE4NOW


----------



## ricbevi (Dic 16, 2011)

Darkbytes dijo:


> Saludos.
> No se si sea porque has modificado varias veces el programa, o porque tienes un error en el receptor.
> El transmisor lo tienes configurado a 9600 Baudios y el receptor a 9400 Baudios.
> La comunicación serial entre PIC's tiene que ser mas modelada que un solo tira y cacha.
> ...




Hola aprovecho esta acotación para también saludar al amigo Darkbytes que de las recomendaciones que correctamente te hizo es extremadamente recomendable al pasar al proyecto real trabajar con Xtal en vez de osciladores internos(al menos en los PIC viejos así era para 9600bps y mas).

Saludos.

Ric.


----------



## santes (Dic 16, 2011)

Que tal darkbyes gracias por tu respuesta mi hermano



> Saludos.
> No se si sea porque has modificado varias veces el programa, o porque tienes un error en el receptor.
> El transmisor lo tienes configurado a 9600 Baudios y el receptor a 9400 Baudios.
> La comunicación serial entre PIC's tiene que ser mas modelada que un solo tira y cacha.
> ...



Tienes razón, cambie ya el baudrate, pero sigo sin conseguir la comunicación eficiente, aunque no sabia lo de la modelación de la comunicación, me pasare ahora mismo por donde dices, espero encontrar la solución pronto a este bonito reto, muchas gracias por tu conocimiento bro 

Que tal Ric!

Tomare en cuenta al pasar a la placa trabajar con un cristal de cuarzo, gracias bro


----------



## D@rkbytes (Dic 16, 2011)

santes dijo:


> Tienes razón, cambie ya el baudrate, pero sigo sin conseguir la comunicación eficiente, aunque no sabia lo de la modelación de la comunicación, me pasare ahora mismo por donde dices, espero encontrar la solución pronto a este bonito reto, muchas gracias por tu conocimiento bro


Ok. Ya veras que en cuanto empiezes a dominar esas instrucciones conjuntamente con sus demas parametros,
dejara de ser un reto, y así nos pasa a todos cuando por primera vez intentamos usar USART
Si no hay buen enlace entre los dispositivos, el resultado hasta llega a desesperar.
Veras que el reto es comprender como interpreta el PIC lo que le envias.
Eso lo iras viendo con la practica, y con los comentarios y ejemplos que encontraras.
Suerte.



ricbevi dijo:


> Hola aprovecho esta acotación para también saludar al amigo Darkbytes que de las recomendaciones que correctamente te hizo es extremadamente recomendable al pasar al proyecto real trabajar con Xtal en vez de osciladores internos(al menos en los PIC viejos así era para 9600bps y mas).
> 
> Saludos.
> 
> Ric.


Así es tocayo, yo solo he tenido buenos resultados con el oscilador interno
si no excedo la velocidad a mas de 2400 Baudios, ya a mas de eso la comunicación es erratica.
Pero estoy hablando acerca de los 4Mhz del 16F628 ya con el uso de un Xtal a mayor frecuencia
se corrigen muchos problemas, y no solo con el USART
Gracias por el saludo y recomendaciones, igualmente reenvio el saludo.
Suerte.


----------



## biker2k3 (Dic 16, 2011)

Mmm estas seguro que estas usando el usart? Para usar el USART no tenes que poner
Include "modedefs.bas"
Y tenes que poner una configuracion como esta al principio, y fijate porque por ejemplo en el 16f628 solo un pin especifico se puede usar, no cualquiera.

Algo asi seria la configuracion (En Proton eh, en PBP no se si se puede usar el USART)

Hserial_Baud = 9600
Hserial_RCSTA = %10010000 ' Enable serial port and continuous receive
Hserial_TXSTA = %00100000 ' Enable transmit and asynchronous mode
Hserial_Clear = On ' clear buffer


----------



## santes (Dic 16, 2011)

Que tal Darkbytes, pues mira que he buscado algunos programas para la comunicación serial asincrona, asi que descargue una de tus aportaciones que das para usar el serin y el serout.
el programa no es muy grande pero pondre el extracto que código que me esta dando vueltas en la cabeza.


```
SYMBOL  SO  = PORTB.6   'RB6 como salida serial de datos
:
:
:
SEROUT  SO,T9600,["X",I]'X es la clave que el dispositivo espera recibir
' y la variable I es el dato que enviaremos
```

Ahora el programa receptor pusiste:


```
SYMBOL  SI  = PORTA.0
SERIN SI,T9600,["X"],CMD
```


supongo que al poner la "X" entre los corchetes, se le indica al micro que espere a "X" para empezar a recibir los datos, con esto en mente programe de acuerdo a esa sintaxis, no hubo errores de compilación, pero ahora no recibo dato alguno, y como estoy programando con el oscilador interno, baje el baudrate a 2400, pero sigue igual. Seguire tratando, ojala me puedas sar unos tips bro, porque ando muy atascado en esto 

Pero seguire y seguire hasta lograrlo 

Que tal biker!



> Mmm estas seguro que estas usando el usart? Para usar el USART no tenes que poner
> Include "modedefs.bas"
> Y tenes que poner una configuracion como esta al principio, y fijate porque por ejemplo en el 16f628 solo un pin especifico se puede usar, no cualquiera.



Pues estoy usando la comunicación serial asíncrona, entonces seria Uart, no sabia que solo se podia usar un pin  en especifico para esta función,  en el manual no lo menciona, aunque yo estoy usando el Pic 18F4550, y los pines que estoy usando son exactamente los que usa el modulo USART mejorado del pic. 

Aunque según yo, es igual porque no estoy programando por hardware, mas bien por software, pero si me equivoco, les agradecería que me corrigieran.

Y pues bueno, a seguir programando


----------



## D@rkbytes (Dic 17, 2011)

santes dijo:


> Que tal Darkbytes, pues mira que he buscado algunos programas para la comunicación serial asincrona, asi que descargue una de tus aportaciones que das para usar el serin y el serout.
> 
> supongo que al poner la "X" entre los corchetes, se le indica al micro que espere a "X" para empezar a recibir los datos, con esto en mente programe de acuerdo a esa sintaxis, no hubo errores de compilación, pero ahora no recibo dato alguno, y como estoy programando con el oscilador interno, baje el baudrate a 2400, pero sigue igual. Seguire tratando, ojala me puedas sar unos tips bro, porque ando muy atascado en esto


Ok. Bien, aqui les dejo un ensayo con el PIC18F4550
Veras que si funciona, lo de la "X" o cualquier otro caracter viene explicado en el ejemplo que adjunto.
Se que vas a notar ya que veas el ejemplo en que estabas mal, pero eso te lo dejo de tarea 
Con lo referente a el uso especifico del puerto USART, en PBP se puede lograr con cualquier PIN
Ya que por eso la misma instrucción te pide un PIN.
Es recomendable usar INCLUDE "MODEDEFS.BAS"
Esa libreria contiene las definiciones como "Symbols" para el modo serial.
Puede no usarse si a las funciones se les da el valor correspondiente.
Por ejemplo: SEROUT PORTC.6,2,[W] Donde el 2 corresponde a T9600
Viene siendo como en ensamblador usar #INCLUDE <P18F4550.INC> para usar PORTA,TRISA etc.
Se usa por comodidad normalmente.
Bien, pues espero te sirva este ensayo y suerte.


----------



## ricbevi (Dic 17, 2011)

Transcribo algo que ya conteste acá  https://www.forosdeelectronica.com/f24/comunicacion-serial-pic-basic-67274/ 

" RSIN y RSOUT trabajan en cualquier PIC(tenga o no USART ya que esta  implementado por software la comunicación serie) el puerto que le  indiques y pin que quieras dentro del puerto(0...7) mientras que HSERIN y  HSEROUT trabajaran solamente con los PIC y pines de puerto donde tienen  implementado los módulos USART ya que aprovecha estos en vez de hacerlo  por software la comunicación serie y ojo que la polaridad de la entrada  y la salida esta invertida para utilizar algún dispositivo conversor  tipo MAX232. "

A la hora de utilizar velocidades altas de RX/TX y para mejorar la del procesamiento de aplicaciones en el PIC(que para eso se incluyeron dichos módulos) la única que te queda es usar el comando HSERIN y HSEROUT  pero debes definir en la cabecera los comando para el mismo como por ejemplo

    Declare Xtal = 4 
     Declare Hserial_Baud = 9600
     Declare Hserial_RCSTA 144 '90h
     Declare Hserial_TXSTA 36 '20h
     Declare Hserial_Clear = On


Ric.


----------



## santes (Dic 17, 2011)

Que bueno verte de nuevo *Darkbyes*, esta aportacion me dejo alucinado! espero que algún dia llegue a ser asi de bueno como tu . Veo que hiciste los siguientes coambios:

*Configuraste los siguientes registros*

*CMCON=7 *Esto es para configurar los comparadores para que tengan entradas digitales

Sus bits son:
*B7 ------B6---- B5 ---B4--B3--B2--B1--B0*
  C2OUT    C1OUT     C2INV     C1INV    CIS    CM2    CM1    CM0

este registro interviene cuando se usa el puerto A, el puerto E, El modulo de comparadores y no encontré mas intervención, ojala pudieses explicármelo por favor.

*ADCON1 = $F   *               Configuración de las entradas como digitales.

Este si que se me había pasado, tenia mucho que no lo incluía.

*Cambiaste la frecuencia del oscilador*

*DEFINE OSC 20*

Yo usaba el de 8, supongo que con esta nueva velocidad el pic puede enviar y  leer mucho mejor, ademas que esta configurado para trabajar como oscilador externo, lo cual hace mas estable los pulsos.

Muchas Gracias *Darkbyetes*, me has ayudado mucho, estoy en deuda 

Que tal Ric!

Pues al parecer, ya no tendré que usar el Hardware del PIC para la transmisión Usart, *Darkbytes* se ha lucido con la solución, solo queda probarlo en placa y sacar las conclusiones finales. Muchas gracias a todos, sobre todo menciones especiales a *Darkbytes*


----------



## D@rkbytes (Dic 17, 2011)

Saludos a todos, suerte, y como dices, pues a seguir programando...
BYE4NOW


----------



## santes (Abr 5, 2012)

Muchas gracias, darkbytes y a los demás, su colaboración me ayudo mucho a terminar mi tesis, este pequeño programa de comunicación al final ya no fue usado de pic a pic,  si no de una unidad lectora RFID y un pic, y todo lo que implica el protocolo de comunicación, espero un día poder postear Todo el desarrollo del proyecto, sin mas que decir. 

Gracias.


----------



## D@rkbytes (Abr 5, 2012)

santes dijo:


> Muchas gracias, darkbytes y a los demás, su colaboración me ayudo mucho a terminar mi tesis, este pequeño programa de comunicación al final ya no fue usado de pic a pic,  si no de una unidad lectora RFID y un pic, y todo lo que implica el protocolo de comunicación, espero un día poder postear Todo el desarrollo del proyecto, sin mas que decir.
> 
> Gracias.


Pues me da mucho gusto el haberte podido ayudar.
Es grato y reconfortante el hecho de saber que pudiste terminar tu tesis de carrera.
Compartela con tus familiares y amigos, ya que es un logro muy importante en nuestras vidas.

Te deseo mucha suerte.


----------



## terminator (Jun 17, 2012)

D@rkbytes dijo:


> Saludos.
> No se si sea porque has modificado varias veces el programa, o porque tienes un error en el receptor.
> El transmisor lo tienes configurado a 9600 Baudios y el receptor a 9400 Baudios.
> La comunicación serial entre PIC's tiene que ser mas modelada que un solo tira y cacha.
> ...



Hola darkbytes, se que es un tema antiguo, pero para mi es nuevo. Puedes aclararme la diferencia de usar el USART para comunciar dos pic's y la comunicacion serial? Tengo entendido que para comunicar dos pic se usa la comunicacion serial, por software SERIn SEROUT, pero el usar es usado para comunciar pic con PC. estoy en lo cierto o no? gracias por la respuesta.
Terminator.


----------



## D@rkbytes (Jun 17, 2012)

terminator dijo:


> Hola darkbytes, se que es un tema antiguo, pero para mi es nuevo. Puedes aclararme la diferencia de usar el USART para comunciar dos pic's y la comunicacion serial? Tengo entendido que para comunicar dos pic se usa la comunicacion serial, por software SERIn SEROUT, pero el usar es usado para comunciar pic con PC. estoy en lo cierto o no? gracias por la respuesta.
> Terminator.


Saludos terminator.
En PICBasic Pro existen dos formas para lograr establecer comunicación PIC a PIC, PIC a PC o viceversa.
Una es por software, usando las instrucciones SerIn y SerOut.
Estas instrucciones requieren que asignes un pin I/O cualquiera del PIC.
Y las instrucciones HSerOut y HSerIn lo hacen por hardware, (Módulo USART) del PIC
Estas instrucciones solo son validas para los PIC que tienen esa capacidad,
y no requieren la asignación de un pin especifico (Se hace directamente por los pines Tx y Rx)
Cualquiera de los dos métodos se puede usar para establecer comunicación,
ya que el protocolo es el mismo en ambos casos, solo que su programación es diferente.

Para que aclares más tus dudas, te recomiendo que leas el manual de PicBasic Pro en español.

Suerte.


----------



## terminator (Jul 2, 2012)

Muchas gracias d@rkbytes, tu aclaración ha sido muy importante. Ahora entiendo mejor las cosas. Estoy tratando de transmitir por RF y con 6f628 y aún no logro hacerlo. Saludos.
Terminator.


----------

