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

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:

Código:
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

Código:
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 :D

Carlos Hernández Santes
 
Última edición:
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.

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 :D

Carlos Hernández Santes
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
 
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


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.
 
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.
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

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 :D

Que tal Ric!

Tomare en cuenta al pasar a la placa trabajar con un cristal de cuarzo, gracias bro ;)
 
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 :D
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.

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.:apreton:
 
Última edición:
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
 
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.

Código:
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:

Código:
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 :oops:

Pero seguire y seguire hasta lograrlo :D

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 :cool:
 
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 :oops:
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 :D
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. :apreton:
 

Adjuntos

  • USART 18F4550.rar
    54.5 KB · Visitas: 570
Última edición:
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.
 
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 :D

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 :)
 
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.
 
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. :apreton:
 
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

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.
 
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.
 
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.
 
Atrás
Arriba