Autor Tema: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software  (Leído 43309 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5538
    • Picmania by Redraven
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

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



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



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.



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



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

Hasta la próxima.  :c)

« Última modificación: 10 de Abril de 2009, 05:58:14 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5538
    • Picmania by Redraven
RE: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #1 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:



Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #2 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

Si juegas contra el mejor, pierdes como los demás.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5538
    • Picmania by Redraven
RE: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #3 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

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado ENO45

  • PIC10
  • *
  • Mensajes: 42
RE: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #4 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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5538
    • Picmania by Redraven
RE: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #5 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.


Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Belmontemarin

  • PIC10
  • *
  • Mensajes: 6
RE: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #6 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.

Desconectado Taro28

  • PIC10
  • *
  • Mensajes: 1
Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #7 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

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #8 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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5538
    • Picmania by Redraven
Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #9 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:

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #10 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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #11 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.
« Última modificación: 17 de Agosto de 2006, 22:39:56 por Cryn »
.

Desconectado carafaelet

  • PIC12
  • **
  • Mensajes: 61
Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #12 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?  :(   
En esta vida hay 10 clases de personas, las que saben binario y las que no.

Desconectado carafaelet

  • PIC12
  • **
  • Mensajes: 61
Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #13 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..  :(
En esta vida hay 10 clases de personas, las que saben binario y las que no.

Desconectado carafaelet

  • PIC12
  • **
  • Mensajes: 61
Re: Ejemplito 16F876A: Lo mínimo para comunicarnos vía RS232 Hardware y Software
« Respuesta #14 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..  :(
En esta vida hay 10 clases de personas, las que saben binario y las que no.