Problemas para conectar PIC 16f877 con PC via puerto serial.

Buen día a todos los amigos de esta comunidad. Estoy tratando de establecer una comunicación serial entre un PIC 16f877 y mi PC, pero no he podido. He revisado bien el circuito y no he encontrado errores. El programa está en Pic Basic Pro y compilado sin problemas. El programa es el siguiente:

Código:
\'Telecomunicación serial con PIC 16F877.

DEFINE OSC 4

trisb = 0
;Configuración para recibir datos.
txsta.2 = 1
spbrg = 25
pause 100
txsta.4 = 0
rcsta.7 = 1
rcsta.6 = 0
rcsta.4 = 1

;Programa
;Preparación para recibir datos.
symbol Rx1 = rcreg.0
symbol Rx2 = rcreg.1
symbol Rx3 = rcreg.2
symbol Rx4 = rcreg.3
symbol Rx5 = rcreg.4
symbol Rx6 = rcreg.5
symbol Rx7 = rcreg.6
symbol Rx8 = rcreg.7

while rcreg > 0
Rx1 = portb.0
Rx2 = portb.1
Rx3 = portb.2
Rx4 = portb.3
Rx5 = portb.4
Rx6 = portb.5
Rx7 = portb.6
Rx8 = portb.7
;Transmisión simultánea.

txsta.6 = 0
txsta.5 = 1

;Comienza transmisión.
txreg = $48
txreg = $4f
txreg = $4c
txreg = $41
txreg = $20
txreg = $20
txreg = $41
txreg = $53
txreg = $44
txreg = $52
txreg = $55
txreg = $42
txreg = $41
txreg = $4c
txreg = $20
txreg = $20
txreg = $43
txreg = $4f
txreg = $4d
txreg = $4f
txreg = $20
txreg = $20
txreg = $45
txreg = $53
txreg = $54
txreg = $41
txreg = $53
txreg = $20
txreg = $20

wend
;Transmitir si rcreg no tiene datos
txsta.6 = 0
txsta.5 = 1

;Comienza Tx
txreg = $48
txreg = $41
txreg = $42
txreg = $4c
txreg = $41
txreg = $4d
txreg = $45
txreg = $20
txreg = $20
end


Y el circuito está en el siguiente enlace

http://www.mikroe.com/chapters/view...dores-pic-en-basic-capitulo-4-ejemplos/#c4v13

Estoy usando 4 Mhz y estoy usando el programa HyperTerminal en mi PC para el manejo del puerto COM1.

Estoy enviando por el puerto serial del PIC una serie de letras en ASCII y por el programa HyperTerminal estoy mandando un texto del block de notas desde mi PC al PIC. Sin enmbargo no recibo nada ni en el PIC ni en la PC. Agradezco de antemano su colaboración en este caso, muchas gracias. Hasta luego. ...
 
Última edición por un moderador:
Aparte de que ese código está muy mal...
¿Por qué quieres hacerlo de la forma complicada usando los registros?
PicBasic Pro tiene los comandos HSerIn y HSerOut para hacer eso de una forma muy sencilla.
 
Si piensas usar los registros deberías agregar una forma de cargar el valor a TXREG hasta que se cargue el valor en el TSR, ¿al menos recibes el primer byte?.
 
Gracias D@rkbytes y gracias Nuyel. No recibo ni el primer byte. Voy a mejorar el código usando los comandos que me recomendó D@rkbytes. No sabía de esos comandos, sinceramente hablando. Voy a estudiar esos comandos y la forma de cargar al puerto B ya que ahi tengo colocados los led's que indican datos recibidos. Gracias por todo feliz día.
 
Buenos días amigos de esta comunidad. Ya cambié el código. Pero no se donde meter el "HSERIN". No se tampoco si la forma de utilizar el "HSEROUT" sea la correcta. Espero sus comentarios y recomendaciones cosa que agradezco muchísimo. Feliz día. El nuevo código es:

Código:
'Comunicación Serial entre PIC's 16F877

DEFINE OSC 4
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_BAUD 2400
DEFINE HSER_SPBRG 25
DEFINEHSER_SPBRGH 0

trisb = 0        ;Configurar puerto B como salida.

while 1          ;Hacer un lazo infinito
portb = rcreg    ;Trasladar los Bytes recibidos al puerto B para encender led's.
hserout          ;Comienzo de transmisión de caracteres ASCII
41h              ;letra "A"
53h              ;letra "S"
44h              ;letra "D"
52h              ;letra "R"
55h              ;letra "U"
42h              ;letra "B"
41h              ;letra "A"
4ch              ;letra "L"
20h              ;Espacio.
20h              ;Espacio.

wend
end
 
Última edición por un moderador:
Ya cambié el código. Pero no se donde meter el "HSERIN". No se tampoco si la forma de utilizar el "HSEROUT" sea la correcta.
Pues no, esa no es la forma correcta, vamos a hacerlo al modo de PicBasic Pro...
Inicias configurando los registros del módulo USART
Algo así para un Baudrate de 9600 bps.
Define HSER_SPBRG 25
Define HSER_BAUD 9600
Define HSER_TXSTA 36
Define HSER_RCSTA 144

Declaras una variable del tipo Byte, por ejemplo...
bData Var Byte ; Esta variable contendrá los datos que se reciban por el pin Rx del PIC.

Inicio:
HSerOut [0] ; Estabilizar el puerto enviando un 0 al iniciar el programa.
Pause 100 ; Hacer un retardo de 100 Mili segundos.
; Enviamos un mensaje...
HSerOut ["Prueba RS-232 por Hardware",13,10,_
"Parámetros COM: 9600,N,8,1",13,10]

Empezamos el programa con esto por ejemplo, que recibirá los datos por el pin Rx, los retornará por el pin Tx.

Programa:
HSerIn [bdata] ; Recibir el caractér y ponerlo en bData.
HSerOut [bData] ; Retornar el caractér como eco.
GoTo Programa ; Hacer un bucle infinito.

End

¿Lo ves? Así de sencillo se hace con PICBasic Pro.

Saludos.
 
Gracias D@rkbytes. Verdaderamente este foro es una escuela. Tengo unas interrogantes. Imagino que para encender los leds del puerto B solo tendría que hacer portb = bData. Otra interrogante es como puedo saber los valores de HSER_TXTA y HSER_RCSTA para otras velocidades de transmisión en baudios, es una tabla o algo así? Donde lo encuentro. Muy agradecido. Mil bendiciones para ti y familia. Feliz día.
 
Verdaderamente este foro es una escuela.
Cierto! :)
Imagino que para encender los leds del puerto B solo tendría que hacer portb = bData.
Así es, dData debe contener el valor ASCII que leerá el PIC y con ese valor puedes controlar el puerto B.
Es decir, si quieres poner un 1 lógico el pin RB0, no se envía un 1, se envía el equivalente ASCII del número 1
Si quieres poner todos los bits del puerto B en en 1, no debes enviar un 255 sino su equivalente ASCII = ÿ
Otra interrogante es ¿como puedo saber los valores de HSER_TXTA y HSER_RCSTA para otras velocidades de transmisión en baudios, es una tabla o algo así? ¿Donde lo encuentro?
En la hoja de datos del PIC que utilices, si tiene módulos USART ó EUSART.
Ahí viene información sobre como calcular esos valores.
Yo hice un programa para facilitar esa tarea, y lo puedes encontrar sobre este tema en el post #10
Interfaz RS232 PIC PC (Proyecto Completo VB6)
También encontrarás mucha información sobre varios proyectos usando RS-232
Gracias D@rkbytes.
Mil bendiciones para ti y familia. Feliz día.
Igualmente asdurafael. Gracias.

Saludos y suerte.
 
Buen día a esta familia de electrónicos. He logrado la comunicación serial entre dos PIC 16F877, pero todavía no puedo lograr la comunicación con la PC. He revisado el cable RS-232, también el circuito y todo esto está bien. El código ya está bien, pero parece que mi PC no "ve" al PIC. Estoy dudando del programa HyperTerminal instalado en mi PC, que es el que estoy utilizando para la comunicación serial vía COM1, es lo único que me queda. Pero no se como probar si ese programa es el que está fallando. Si me pueden aconsejar como probar el programa HyperTerminal se los agradezco. Ya he revisado los ejemplos de Visual Basic de D@rkbytes, pero no entiendo mucho sobre ese programa y no lo tengo instalado en mi PC, aunque se ve muy bien. Espero me puedan orientar sobre lo que debo hacer. Gracias por todo. Hasta luego y Saludos. :cry:
 
Buen día a esta familia de electrónicos. He logrado la comunicación serial entre dos PIC 16F877, pero todavía no puedo lograr la comunicación con la PC. He revisado el cable RS-232, también el circuito y todo esto está bien. El código ya está bien, pero parece que mi PC no "ve" al PIC. Estoy dudando del programa HyperTerminal instalado en mi PC, que es el que estoy utilizando para la comunicación serial vía COM1, es lo único que me queda. Pero no se como probar si ese programa es el que está fallando. Si me pueden aconsejar como probar el programa HyperTerminal se los agradezco. Ya he revisado los ejemplos de Visual Basic de D@rkbytes, pero no entiendo mucho sobre ese programa y no lo tengo instalado en mi PC, aunque se ve muy bien. Espero me puedan orientar sobre lo que debo hacer. Gracias por todo. Hasta luego y Saludos. :cry:

Hola, para probar la comunicación de tu pc, puedes hacer un puente entre el pin 2 y 3 de tu cable de comunicación y así lo que envias por el puerto lo recibiras directamente, también puedes utilizar otro programa busca "programa terminal rs232".
 
De programas esta bueno el Termite, puede enviar y recibir en modo hexadecimal así puedes ver si recibe datos fuera de las tablas ASCII (mejor dicho, caracteres ilegibles en lenguaje humano como los primeros de la tabla ASCII)
 
Última edición:
Gracias 1024 y gracias Nuyel. Voy a probar con estos programas que me recomendaron. Pero primero voy a puentear los pines 2 y 3 del cable RS-232 para comprobar si hay comunicación. Que buenas recomendaciones. Gracias y hasta luego hermanos.
 
Buenos dias hermanos de esta comunidad de electrónica. Instale el programa Termite e hice un puente con los pines 2 y 3 del Db9 y al tratar de enviar un mensaje la PC se quedaba como colgada. Cambié de computadora a otra auxiliar que tengo e hice igual y funcionó. Pude enviar y recibir el mismo mensaje. Conclusión: Puerto serial de mi computadora dañado y programa Hyperterminal que no funciona. Pero ahora voy a cambiar mi PC por la auxiliar que tengo. Exito. Despues que cambie de computadora voy a probar con el PIC. Gracias a todos por su aporte en este caso muchachos. Estoy muy agradecido. Les deseo mucha salud y bienestar. Gracias Nuyel, gracias 1024 y gracias D@rkbytes. Feliz día.
 
Buenos días hermanos. Ya logré la comunicación serial entre el PIC y mi PC. Pero por cada letra del mensaje enviado al PIC, este responde con [00], por cada letra enviada. Quizás tenga algún error en el código del programa PBP que estoy usando, y por eso se los envío por si encuentran algún error. Gracias por su colaboración y saludos.

Código:
'Nueva Comunicación Serial.

DEFINE OSC 4

Define HSER_SPBRG 25
Define HSER_BAUD 9600
Define HSER_TXSTA 36
Define HSER_RCSTA 144

Trisb = 0
bData Var Byte

Inicio:
HSerOut [0]
Pause 100
HSerOut ["Asdrubal envia datos a PIC",17,77,"Como estas PIC,Aqui bien",17,77]

Programa:
HSerIn [bData]
Portb = bData
HSerOut [bData]
GoTo Programa

End

P.D. El circuito lo envío en el archivo adjunto. He utilizado este circuito, no he considerado necesario el puente entre los pines 7 y 8 del Db9. Todo lo demás está igual.
 

Adjuntos

  • Comunicación Serial COM1.rar
    76 KB · Visitas: 50
Última edición por un moderador:
Buenos días hermanos. Ya logré la comunicación serial entre el PIC y mi PC. Pero por cada letra del mensaje enviado al PIC, este responde con [00], por cada letra enviada. Quizás tenga algún error en el código del programa PBP que estoy usando, y por eso se los envío por si encuentran algún error. Gracias por su colaboración y saludos.
El código no tiene problemas, pero algunos detalles si.
1.- He notado que no incluyes la palabra de configuración. Posiblemente configures los fuses al grabar el PIC.
2.- ¿Por qué usas 17,77? El 17 equivale a (Device Control 1) y el 77 a la letra M (Mayúscula)
Si quieres enviar un CR (Carriage Return) se hace enviando un 13 y un LF (NL Line Feed, New Line) con un 10
3.- Al puerto B hace falta inicilizarlo en 0 --> PortB = 0

P.D. El circuito lo envío en el archivo adjunto. He utilizado este circuito, no he considerado necesario el puente entre los pines 7 y 8 del Db9. Todo lo demás está igual.
Aquí tengo una duda. ¿Que PIC estás utilizando? Durante el tema se ha tratado sobre un PIC16F877
Y en el circuito que adjuntas viene un PIC16F887 :confused: Éste PIC es muy diferente al PIC16F877
Tampoco utilizo los puentes que mencionas, únicamente una conexión básica.

SCH MAX232.gif

Con los cambios al código y con mi interfaz se muestra así...
SPCTRL.JPG
Los números es lo que retorna el PIC al encender los LED's desde RB0 a RB7

Nota:
Después de recibir el mensaje del PIC, la interfaz se configuró para convertir los datos en decimal.

De forma normal se verían así los datos de retorno...
SPCTRL_II.jpg

Si se envía algún texto, se vería el retorno de lo que se escribe...
SPCTRL_III.jpg

Y así quedó el código que usé...
Código:
; Palabra de configuración
@ Device XT_OSC, WDT_OFF, PWRT_ON, BOD_OFF

Define OSC 4                ; Oscilador a 4MHz.

; Configuración del módulo USART
Define HSER_SPBRG    25
Define HSER_BAUD    9600
Define HSER_TXSTA    36
Define HSER_RCSTA    144

TrisB = 0                   ; Puerto B cómo salidas
PortB = 0                   ; Puerto B en 0

bData Var Byte              ; Variable de recepción de datos

Inicio:
    HSerOut [0]             ; Estabilizar puerto
    Pause   100             ; Esperar 100Ms
    ; Enviar mensaje inicial
    HSerOut ["Asdrubal envía datos a PIC",13,10,_
    "¿Cómo estás PIC?",13,10,"-Aquí bien...",13,10]

Programa:
    HSerIn  [bData]         ; Se reciben los datos
    PortB = bData           ; Puerto B = valor de bData
    HSerOut [bData]         ; Se retorna el valor de bData
    GoTo    Programa        ; Se repite el proceso

    End
Cómo ves, funciona, realiza tus conexiones como en el esquema que mostré y nos comentas.

Saludos.
 
Buenos días amigos. Estimado D@rkbytes hice todos los cambios que me recomendaste. Pero el compilador no me acepta la palabra de configuración, ya que da error, que tiene que ver con asembler ya que entre otras palabras dice ASM. Cuando quito la palabra de configuración compila bien sin producir error. Pienso que ahí debe estar el problema, porque todo lo demás está corregido: El resto código está igual al que me enviaste, el Db9 y MAX232 en configuración básica, estoy usando un PIC 16F877, con cristal de 4 MHz y dos condensadores de 22pf. Para el MAX232 estoy usando condensadores de 1uf. Gracias por tu colaboración D@rk. A la espera de una respuesta alentadora me despido por los momentos. :apreton:



Buenos días. Olvidé decir que con los cambios mencionados arriba el funcionamiento sigue igual solo recibo: [00] por cada letra de mensaje enviado, excepto al inicio que recibo un solo: [00]. También omití decir que los números que utilicé en el mensaje del código (17,77) era para probar si podía enviar números decimales en el mensaje. No se que es un Device control 1, ni un CR (Carriage Return). Tampoco sé que son los fuses. En los pocos programas que he compilado hasta ahora no he utilizado la palabra de configuración. Si me pueden orientar sobre esto se los agradezco mucho. Gracias por todas las correcciones que me han realizado. Espero aprender mucho mas todavía. Feliz día. Pásenla bien. Saludos.
 
Última edición:
Posible solución:
Cuando no puedes compilar con la palabra de configuración por código puede ser porque...
1.- Utilizas MPLAB con el plug-in para PICBasic Pro. (Debes compilar desde el programa MicroCode Studio)
2.- Usas MicroCode Studio pero compilas usando una versión inferior a PBP 2.60. (Debes actualizarla)
3.- Verifica la continuidad de los cables y que estés conectando correctamente los pines correspondientes.

La tabla ASCII viene explicada en post #9 del tema Interfaz RS232 PIC PC (Proyecto Completo VB6)


Suerte.
 
Buenos días amigos todos de este maravilloso foro. Con razón el compilador no me aceptaba la palabra de configuración, pues tengo instalado el MPLAB con el PICBasic pro de plug-in. Quizás por eso tuve problemas el año pasado cuando trabajé con el display LCD y tuve que hacer trampas al programa. Voy a ver si hay versiones de MicroCode Studio gratuitas en la web, e instalar una versión de PBP 2.60 ó mayor. Gracias D@rkbytes por tu ayuda. Agradeciendo nuevamente todo el apoyo que me han dado me despido Atentamente, deseándoles todo lo mejor. :aplauso: para todos ustedes.
 
Buenos días amigos del foro. Ya instalé el programa MicroCode Studio con PBP versión 2.60L, pero aún así no me compila la palabra de configuración. Si me pueden ayudar se los agradezco. Que tengan buen día.
 
Atrás
Arriba