TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: RedPic en 29 de Diciembre de 2005, 08:14:00

Título: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: RedPic en 29 de Diciembre de 2005, 08:14:00
En anteriores ejemplitos he utilizado alegremente una conexión con mi PC vía RS232, dando por supuesto que todos teníais el hardware y los conocimientos necesarios para ello.

Y no tiene por qué ser así. Por lo tanto quí tenéis los estrictamente necesario para conectar vuestro PIC 16F876A a un PC vía RS232. Para ello vamos a necesitar un circuito integrado MAX232 (o similar) que es el encargado de convertir la señal serie 0V/+5V a +12V/-12V, que es la que se usa en este tipo de conexión.

Datasheet del MAX232 (http://picmania.garcia-cuervo.net/recursos/redpicdatasheets/rs232-rs485-rs422/max232cpe.pdf)

El hardware mínimo que hay que montar para establecer esta conexión se muestra en el siguiente esquema:

(http://picmania.garcia-cuervo.net/images/uart_test_hardware_16f876a.gif)

Aquí os pego una imagen del MAX232 ya montado en una placa de taladros y listo para recibir y enviar bytes:

(http://picmania.garcia-cuervo.net/images/aux_max232_foto1.jpg)

Y por último el pequeño programa CCS que lo único que hace es presentarse como es debido, y posteriormente se pone a devolver, como eco, cualquier carácter que reciba por el puerto serie.

Codigo:
/************************************************************
 Propósito:  Testea la UART a 9600 baudios
 Procesador: PIC16F876A con un crital de 4 MHz
 Hardware:   MAX232
 Software:  CCS PCM
************************************************************/
#include <16F876a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7)

main() {
   printf("PIC16F876A a la espera" );  // Envío mensaje de "estoy vivo"
   while(true) {
      putc(getc());                          // eco de lo que recibo
   }
}

Para establecer la comunicación con el PC podéis usar el Hyperterminal de Wyndows.

(http://picmania.garcia-cuervo.com/images/aux_max232__hyper.jpg)

¡Ah! y no olvidéis configurar los parámetros del puerto COM tal como muestra la imagen inferior:

(http://picmania.garcia-cuervo.net/images/aux_max232_com1_cfg.jpg)

Con esto el PIC y vuestro PC hablarán hasta por los codos.

Hasta la próxima.  :c)

Título: RE: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: RedPic en 29 de Diciembre de 2005, 08:17:00
Si en lugar de un 16F876A utilizais otro PIC el 90% de lo mostrado en este ejemplito es absolutamente válido.

Por ejemplo, si utilizais un PIC 16F628 podeis ahorraros el cristal, el 16F628 tiene un oscilador interno a 4 Mhz, y además habría que cambiar los pines usados por la UART en este PIC. En el programa CCS  cambiarían las siguientes líneas:

Codigo:


#include <16F628.h>
#fuses INTRC_IO, NOLVP, NOWDT, PUT, BROWNOUT
#use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)




El esquema de conexión para el PIC 16F628 quedaría como sigue:



Título: RE: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: RaDoN en 29 de Diciembre de 2005, 08:18:00
Como has pinchado el conector DB9 en la placa de agujeros? loco

Por cierto, averiguaste algo mas de aquello, de los bits y la paridad y demás?

P.D.: (edito) por si le sirve a alguien, yo suelo añadir unos leds a la interfaz rs232 para monitorizar que emite/recibe, y ademas quedan chulos Avergonzado

Título: RE: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: RedPic en 29 de Diciembre de 2005, 08:38:00
Escrito originalmente por radon

Como has pinchado el conector DB9 en la placa de agujeros? loco



Muchas risasMuchas risasMuchas risas

Cierto, cierto ... La placa de agujeritos tiene los taladros a 2.45 mm en filas y columnas y el DB9 tiene los pines 1 a 5 bien y encajan perfectamente, pero los pines del 6 a 9 están desplazados 1.23 mm con respecto a los otros ... Peeeeroooo .... como solo uso los pines 2, 3 y 5, todos de una sola linea, la primera, lo que hize fue doblar hacia atrás los pines 6 a 9 y solo soldé la primera linea, la de los pines 1 a 5, lo otros los deje sin soldar.

En la foto de mi montaje pueden verse los pines doblados asomando la punta por detrás del conector DB9 Angelito



Muchas risasMuchas risasMuchas risas

Título: RE: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: ENO45 en 16 de Febrero de 2006, 13:54:00
hola entre en esta parte del foro y me gusto la forma de controlar el MAx 232 lo unico que esta programado el pic en C me podes enviar el programa en Asembler, el pic que tengo es el 16F628.
otra pregunta de donde puedo sacar el programa Hyperterminal. tengo WIn 98 en mi PC
desde ya gracias
Título: RE: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: RedPic en 28 de Febrero de 2006, 04:26:00
Aqui tienes el mismo ejemplo en ensamblador.

Si lo quieres descargar lo tienes disponible Aquí


Codigo:

;*******************************************************************
; Programa:  Envia mensaje "Estoy vivo" y eco de lo recibido a 9600 bps
; Processor: PIC16F628 4 MHz usando RC oscilador interno
; Author:    Lars Petersen, oz1bxm@qsl.net
; Website:   www.qsl.net/oz1bxm/PIC/pic.htm
; Credit:    Tony Nixon"s test program at
;            www.piclist.com/techref/microchip/16f877/setup.htm
;*******************************************************************

        LIST P=16F628, R=DEC    ; Use the PIC16F628 and decimal system

        #include "P16F628.INC"  ; Include header file

        __config  _INTRC_OSC_NOCLKOUT & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_ON

        CBLOCK 0x20             ; Declare variable addresses starting at 0x20
          dataL
        ENDC

        ORG    0x000            ; Program starts at 0x000
;
; --------------------------------
; SET ANALOG/DIGITAL INPUTS PORT A
; --------------------------------
;
        movlw 7
        movwf CMCON             ; CMCON=7 set comperators off
;
; ----------------
; INITIALIZE PORTS
; ----------------
;
        movlw b"00000000"       ; set up portA
        movwf PORTA

        movlw b"00000100"       ; RB2(TX)=1 others are 0
        movwf PORTB

        bsf STATUS,RP0          ; RAM PAGE 1

        movlw 0xFF
        movwf TRISA             ; portA all pins input

        movlw b"11110010"       ; RB7-RB4 and RB1(RX)=input, others output
        movwf TRISB

; ------------------------------------
; SET BAUD RATE TO COMMUNICATE WITH PC
; ------------------------------------
; Boot Baud Rate = 9600, No Parity, 1 Stop Bit
;
        movlw 0x19              ; 0x19=9600 bps (0x0C=19200 bps)
        movwf SPBRG
        movlw b"00100100"       ; brgh = high (2)
        movwf TXSTA             ; enable Async Transmission, set brgh

        bcf STATUS,RP0          ; RAM PAGE 0

        movlw b"10010000"       ; enable Async Reception
        movwf RCSTA
;
; ------------------------------------
; PROVIDE A SETTLING TIME FOR START UP
; ------------------------------------
;
        clrf dataL
settle  decfsz dataL,F
        goto settle

        movf RCREG,W
        movf RCREG,W
        movf RCREG,W            ; flush receive buffer
;
; ---------
; MAIN LOOP
; ---------
;
        call message            ; send "16F628 alive"
loop    call receive            ; wait for a char
        call send               ; send the char
        goto loop
;
; -------------------------------------------
; RECEIVE CHARACTER FROM RS232 AND STORE IN W
; -------------------------------------------
; This routine does not return until a character is received.
;
receive btfss PIR1,RCIF         ; (5) check for received data
        goto Receive

        movf RCREG,W            ; save received data in W
        return
;
; -------------------------------------------------------------
; SEND CHARACTER IN W VIA RS232 AND WAIT UNTIL FINISHED SENDING
; -------------------------------------------------------------
;
send    movwf TXREG             ; send data in W

TransWt bsf STATUS,RP0          ; RAM PAGE 1
WtHere  btfss TXSTA,TRMT        ; (1) transmission is complete if hi
        goto WtHere

        bcf STATUS,RP0          ; RAM PAGE 0
        return
;
; -------
; MESSAGE
; -------
;
message movlw  "1"
        call send
        movlw  "6"
        call send
        movlw  "F"
        call send
        movlw  "6"
        call send
        movlw  "2"
        call send
        movlw  "8"
        call send
        movlw  " "
        call send
        movlw  "a"
        call send
        movlw  "l"
        call send
        movlw  "i"
        call send
        movlw  "v"
        call send
        movlw  "e"
        call send
        movlw  0x0D ; CR
        call send
        movlw  0x0A ; LF
        call send
        return

        END



Ya me contarás los resultados.


Título: RE: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: Belmontemarin en 11 de Marzo de 2006, 13:37:00
Yo he tenido malas experiencias con el MAX232

Al final he optado por poner dos optoacopladores; como efecto secundario se llama AISLAMIENTO GALVÁNICO.

dos 4N26 y 4 resistencias

A ver si tengo un hueco y muestro como lo hice.
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: Taro28 en 07 de Junio de 2006, 23:27:15
Buenas

Este es mi primer mensaje en el foro :) , aunque he estado leyendo desde hace bastante tiempo

Estoy desarrollando un simulador de coches y necesito sacar varios integer del pc hacia un interface externa.
Basicamente, un programa residente en el pc leera un puerto UDP que utiza el juego de coches para las partidas online. leyendo este puerto obtendra 3 floats de la aceleracion (X, Y, Z) y 3 angulos de la inclinacion del coche. El programita sumara ambas componentes, y obtendra 3 floats, los transformara a integers y luego los volvera a transformar en 3 caracteres acsii  para transmitirlos al pic mediante el puerto serie (segun he leido el puerto serie transmite caracteres).

Donde tengo mas dudas es en la comunicacion del pic con el puerto serie. He leido varias los ejemplos que hay en este foro sobre comunicaciones por puerto RS232 pero no me aclaro, no acabo de entender como funciona esto del buffer. Quisiera saber como deberia hacer para que el pic leyera los 3 caracteres del puerto RS232 y me los convirtiese en integers (supongo que sera con la funcion Atoi), para luego variar las salidas del pic dependiendo de estos 3 caracteres.

saludos y gracias de antemano
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: piriots en 10 de Julio de 2006, 13:39:55
Buenas!! Ahora que tengo un poco de tiempo he estado enviando informacion del pic al pc y visualizanco don el hiperterminal, hasta aqui ningun problema. El problema esta en enviar informacion del PC al pic ya que no se que programa utilizar, he encontrado muchos en la red pero no me convencen. El único que me ha gustado es uno que se llama advanced serial port monitor pero es una version demo con 15 dias de prueba que ya han pasado. ¿Que programa me recomendais que sea freeware??

Salu2 y gracias
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: RedPic en 10 de Julio de 2006, 13:46:09
El Hyperterminal funciona en los dos sentidos, recibe y envía lo que teclees en él. Y si usas el CCS C tambien tienes diponible en el mismo paquete el Siow.exe que funciona de lujo.  :mrgreen:

Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: piriots en 10 de Julio de 2006, 14:03:23
Muchas gracias Diego!!! No sabia de la existencia del siow de ccs, ahora lo voy a probar a ver que tal funciona.

Salu2
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: Cryn en 17 de Agosto de 2006, 21:54:41
Hola saludos y como puedo realizar un programa de la forma mas facil posible (con botones en vez de usar teclado), que reemplace al hiperterminal??? el siow del ccs es como el hiperterminal que requiere el circuito externo, o puede simularse con en compin del proteus??, como debe ser la configuración en el siow?? dtx cds, creo, esas variables; gracais, chao.
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: carafaelet en 11 de Mayo de 2008, 08:35:48
Hola, yo he estado probando el sencillo programita con el hyperterminal y con el pic 16F877A pero no consigo transmitir del PC al PIC, ademas la cadena de texto la tengo que meter en el bucle para que me salga en el hyperterminal, sino nada de nada. Y con el: putc(getc()); ya os digo, no hay forma de que me funcione, en cambio el CCS me lo compilo sin ningun problema. A que puede ser debido?  :(   
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: carafaelet en 16 de Mayo de 2008, 13:19:19
Despues de mucho pelear he conseguido que la cadena "PIC16F876A a la espera" me aperezca en el hyperterminal sin necesidad de ponerla dentro del bucle while, pero sigo sin poder transmitir ningun caracter al pic. Creo que el problema puede estar en la configuración del hyperterminal, por ejemplo he activado la opción de hacer un eco de los caracteres pulsados de forma que te aparezca en la pantalla del hyperterminal (Archivo --> propiedades --> configuración --> configuración ASCII --> Eco de los caracteres escritos localmente), pero como digo sigo sin que el pic me haga un eco de lo pulsado.

Nota: Junto al integrado max 232 esta un led multicolor que se enciende en rojo cuando transmites hacia el hyper y en verde cuando recibes, de ahi que piense que el problema este en el hyper ya que el led en verde no llega a encenderse, lo qual hace sospechar que no le llega nada..  :(
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: carafaelet en 17 de Mayo de 2008, 08:22:22
Una cosa que no habia dicho es que utilizo un conversor de 232 a usb, ya que trabajo con un portatil, ¿puede tener esto algo que ver?, es decir: ¿puede que el conversor me permita enviar datos al pc pero en canvio se "coma" los datos del pc al Pic? A ver si alguien me puede ayudar please.. no se ya que puede ser..  :(
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: carafaelet en 23 de Mayo de 2008, 11:58:20
Tras usar un Pc de sobremesa y realizar la conexión serie-serie, vi que tampoco habia forma de comunicarme del Pc al pic. Buscando información de otra cosa, di en el foro con este hilo, donde encontré la solucion: http://www.todopic.com.ar/foros/index.php?topic=5723.msg31747#msg31747 y me baje el "Advanced Serial Port Monitor" y este si que me transmite desde el portatil al Pic, por lo que el fallo esta en el Hyperterminal que no hay forma de que transmita..  :-/
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: MLO__ en 24 de Mayo de 2008, 23:21:14
Hola.

A mi siempre me ha funcionado el hyperterminal del guindous para transmision y recepcion PIC-PC y PC-PIC. Lo unico que si tuve que hacer para que el PIC me recibiera los datos del PC fue conectar el pin 1 (DCD) al pin 6 (DSR) en el conector DB9, si no hacia esta conexion, el PIC no recibia nada.

Saludos
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: carafaelet en 25 de Mayo de 2008, 12:59:35
 :-/ Muchas gracias MLO porque yo estos dos pines los tengo "al aire" en mi conector y quiza sea este el problema, cuando tenga tiempo lo pruebo y os cuento.. Aun asi resulta curioso como softwares ("Hyperterminal" y "Advanced Serial Port Monitor") con la misma función y el mismo estandar no funcionan igual y requieren una modificación hardware.  :-)
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: carafaelet en 31 de Mayo de 2008, 11:56:09
Nada MLO_.. no hay forma.. ni uniendo estos dos pins consigo transmitir del Hyperterminal al Pic,a continuación pongo el esquema eléctrico del interfaz 232 que tiene el laboratorio PichSchool (de Microsystems Engineering), que aunque difiere un poc de los esquemas puestos arriba no creo que sea este el problema puesto que como he dicho con el "Advanced Serial Port Monitor" si que consigo transmitir, además de que este interfaz se encuetra dentro de una placa de aprendizaje, comercializada por MSE, que habrá sido probada y testeada adecuadamente. De todas formas aqui pongo dicho esquemático por si alguien ve algo:

Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: firepic en 31 de Mayo de 2008, 12:01:58
Maestro Redpic, has le has violado las patas a un db9?  :D  :D  :D
Bienvenido al foro, taro28!  :-/
Qué raro carafaelet, a mí también me ha funcionado de lujo el hyperterminal.
Sigue probando y ya nos contarás.
Nos leemos!  :mrgreen:
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: carafaelet en 31 de Mayo de 2008, 12:13:37
(http://mural.uv.es/osarsan/Imatges/esq_serie232.JPG)
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: firepic en 31 de Mayo de 2008, 12:51:14
Saludos carafaelet! Pues deberías colocar cómo lo estás conectando al pic... supongo que el db9 es la parte que va a la pc y el que dice AP5 es el que va al pic no? Pero lo veo extraño... tienes conectados los TXIN y TXOUT de un mismo lado, e igual sucede con los RXIN y RXOUT  :shock:
Trata de montar el esquema como lo tienes montado, con todo y pic, a ver si se te puede ayudar mejor.
Nos leemos!  :mrgreen:
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: MLO__ en 31 de Mayo de 2008, 13:24:59
Hola.

Los condensadores que yo utilizo son los recomendados por la datasheet del MAX232, 1uF/25v, son electroliticos y hay que tener cuidado con la polaridad. Has probado la configuracion de cable Null Modem? ( o modem null ).

Saludos
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: firepic en 31 de Mayo de 2008, 13:35:17
Tienes razón MLO, yo también uso electrolíticos... aunque la ds del max232 menciona que los no polarizados también son aceptables.
El valor que ellos recomiendan es de 1uF, aunque yo he colocado de 10uF y también me ha funcionado perfecto.
Aquí está la conexión recomendada según la datasheet de Texas Instrument:

(http://img515.imageshack.us/img515/875/max232qj1.jpg)

Nos leemos!  :mrgreen:
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: carafaelet en 01 de Junio de 2008, 11:36:08
Efectivamente firepic el conector db9 es el que va al pc, mientras que el ap5 al pic, la conexión con el pic y todo es bien sencilla pues simplemente se unen con un par de cables el Rx y Tx del conector ap5 con otro conector que los une a los pines del pic RC7 y RC6 (que quedan definidos como bit de recepción y transmisión por software). Respecto a TXIN, TXOUT, RXIN y  RXOUT, yo tampoco lo entendí cuando me paré a ver el esquema.. pero como con el "Advanced Serial Port Monitor" si que funcionaba y ademas se trata de un montaje comercializado pues lo atribuí a ignorancia mia.. De todas formas voy a ver si monto uno de los esquemas propuestos en una protoboard y os comento.

Saludos!!
Título: Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
Publicado por: estebanfolcher en 09 de Agosto de 2018, 16:02:53
Nada MLO_.. no hay forma.. ni uniendo estos dos pins consigo transmitir del Hyperterminal al Pic,a continuación pongo el esquema eléctrico del interfaz 232 que tiene el laboratorio PichSchool (de Microsystems Engineering), que aunque difiere un poc de los esquemas puestos arriba no creo que sea este el problema puesto que como he dicho con el "Advanced Serial Port Monitor" si que consigo transmitir, además de que este interfaz se encuetra dentro de una placa de aprendizaje, comercializada por MSE, que habrá sido probada y testeada adecuadamente. De todas formas aqui pongo dicho esquemático por si alguien ve algo:
buenas tardes a todos.
intenta probar  quitando los led. es tontería pero tu prueba te lo comento por algo que me paso una ves.

saludos