Ensamblador 5: Comunicación RS232

Ahora vamos a aprender a utilizar el módulo EUSART del PIC para realizar comunicación mediante el protocolo RS232, es importante recordar que todos los datos necesarios siempre están en los datasheets, por lo tanto siempre que queremos utilizar algún recurso podemos buscar la información en las secciones correspondientes, para el caso del módulo EUSART podemos encontrar incluso un paso a paso de como configurarlo tanto para recepción como para transmisión.

Encontraremos que para habilitar el módulo EUSART, será necesario poner el Puerto C como entrada, colocando un 0xFF en el registro TRISC.

RECEPCIÓN DE DATOS

Para esto podemos ir a la sección 20.2.2 de la hoja de datos, donde encontraremos EUSART ASYNCHRONOUS RECEIVER (Recepción asíncrona EUSART).

  1. Inicializa el registro SPBRGH:SPBRG para los baudios adecuados, Activa o limpia los bits BRGH y BRG16, como se requiera, para alcanzar los baudios deseados.
  2. Activa el puerto serial asíncrono limpiando el bit SYNC, y activando el bit, SPEN.
  3. Si la señal del pin RX será invertida, activa el bit RXDTP.
  4. Si deseas interrupciones, activa el bit, RCIE.
  5. Si se dese recepción de 9 bits, activa el bit, RX9.
  6. Activa la recepción activando el bit, CREN.
  7. El bit bandera, RCIF, será activado cuando la recepción esté completa y una interrupción será generada si el bit habilitado, RCIE, que fue activado.
  8. Lee el registro RCSTA para obtener el noveno bit (si fue activado) y determinar si un error ocurrió durante la recepción.
  9. Lee los 8 bits de datos recibidos, leyendo el registro RCREG.
  10. Si un error ocurrió, limpia el error limpiando el bit habilitado, CREN.
  11. Si se están usando interrupciones, asegúrate de que los pines GIE y PEIE en el registro INTCON están activos.

El código hasta antes de la lectura de los datos recibidos, sería el siguiente:

;CONFIGURACIÓN PARA LA RECEPCIÓN DE DATOS
    movlw   D'12'
    movwf   SPBRG	    ;Configuración de baudios adecuada (9600)
    bcf	    TXSTA,BRGH	    ;Low speed
    bcf	    BAUDCON,BRG16   ;Selección de velocidad adecuada (8 bit) Solo SPBRG
    bcf	    TXSTA,SYNC	    ;Puerto serial asíncrono
    bsf	    RCSTA,SPEN	    ;Habilita puerto serial
    bsf	    RCSTA,CREN	    ;Habilitamos la recepción

ENVÍO DE DATOS

Estos pasos los podemos encontrar en la sección 20.2.1.:

  1. Inicializa los registros SPBRGH:SPBRG para los baudios adecuados, activa o limpia los bits BRGH y BRG16, como se requiea, para alzancar los baudios deseados.
  2. Activa el puerto serial asíncrono limpiando el bit, SYNC y activando el bit SPEN.
  3. Si la señal del pin TX será invertida, activa el bit TXCKP.
  4. Si deseas interrupciones, activa el bit, TXIE.
  5. Si deseas transmisión de 9 bits, activa el bit TX9.
  6. Activa la transmisión activando el bit, TXEN, que también activará, el bit TXIF.
  7. Si la transmisión de 9 bits fue seleccionada, el noveno bit debe cargarse en el bit, TX9D.
  8. Carga el dato al registro TXREG (comienza la transmisión).
  9. Si se están usando interrupciones, asegúrate de que los bits GIE y PEIE en el registro INTCON estén activos.

El código, hasta antes del envío de los datos será:

;CONFIGURACIÓN PARA EL ENVÍO DE DATOS
    movlw   D'12'
    movwf   SPBRG		    ;Configuración de baudios adecuada (9600)
    bcf	    TXSTA,BRGH	    ;Low speed
    bcf	    BAUDCON,BRG16   ;Selección de velocidad adecuada (8 bit) Solo SPBRG
    bcf	    TXSTA,SYNC	    ;Puerto serial asíncrono
    bsf	    RCSTA,SPEN	    ;Habilita puerto serial
    bsf	    TXSTA,TXEN	    ;Habilitamos el envío

RECEPCIÓN Y ENVÍO

Lo que realizará nuestro programa, será estar en espera de que llegue información, en el momento de que llega se almacenan los 8 bits recibidos y esos mismos bits se envían por RS232, esto nos servirá para ver si estamos recibiendo y enviando correctamente, ya que la misma información se mostrará en los leds y se recibirá por el dispositivo con el que nos estamos comunicando.

ESPERA
    btfss   PIR1,RCIF	    ;Esperamos a que esté lista la conversión
    goto    ESPERA	    ;Regresamos a espera
    movff   RCREG,recibido  ;Almacenamos el dato recibido
    movff   recibido,PORTB  ;Mostramos el dato recibido en el puerto B
    movff   recibido,TXREG  ;Enviamos por TX el mismo dato recibido
    bsf	    RCSTA,CREN	    ;Habilitamos la recepción de datos
    goto    ESPERA	    ;Regresamos a esperar la recepción de un dato

Nuestro código quedará de la siguiente forma:

LIST    P = 18F4550	;PIC a utilizar
INCLUDE <P18F4550.INC>

;************************************************************
;Configuración de fusibles
CONFIG  FOSC = HS   
CONFIG  PWRT = ON
CONFIG  BOR = OFF
CONFIG  WDT = OFF
CONFIG  MCLRE = ON
CONFIG  PBADEN = OFF
CONFIG  LVP = OFF
CONFIG  DEBUG = OFF
CONFIG  XINST = OFF

;***********************************************************
;Código

CBLOCK  0x080
    recibido
ENDC

ORG 0x00    ;Iniciar el programa en el registro 0x00

    movlw   0x00
    movwf   TRISB	;Puerto B como salida
    movlw   0xFF
    movwf   TRISC	;CONF. PARA HABILITAR EUSART

;CONFIGURACIÓN PARA LA RECEPCIÓN DE DATOS
    movlw   D'12'
    movwf   SPBRG	    ;Configuración de baudios adecuada (9600)
    bcf	    TXSTA,BRGH	    ;Low speed
    bcf	    BAUDCON,BRG16   ;Selección de velocidad adecuada (8 bit) Solo SPBRG
    bcf	    TXSTA,SYNC	    ;Puerto serial asíncrono
    bsf	    RCSTA,SPEN	    ;Habilita puerto serial
    bsf	    RCSTA,CREN	    ;Habilitamos la recepción

;CONFIGURACIÓN PARA EL ENVÍO DE DATOS
    movlw   D'12'
    movwf   SPBRG		    ;Configuración de baudios adecuada (9600)
    bcf	    TXSTA,BRGH	    ;Low speed
    bcf	    BAUDCON,BRG16   ;Selección de velocidad adecuada (8 bit) Solo SPBRG
    bcf	    TXSTA,SYNC	    ;Puerto serial asíncrono
    bsf	    RCSTA,SPEN	    ;Habilita puerto serial
    bsf	    TXSTA,TXEN	    ;Habilitamos el envío

ESPERA
    btfss   PIR1,RCIF	    ;Esperamos a que esté lista la conversión
    goto    ESPERA	    ;Regresamos a espera
    movff   RCREG,recibido  ;Almacenamos el dato recibido
    movff   recibido,PORTB  ;Mostramos el dato recibido en el puerto B
    movff   recibido,TXREG  ;Enviamos por TX el mismo dato recibido
    bsf	    RCSTA,CREN	    ;Habilitamos la recepción de datos
    goto    ESPERA	    ;Regresamos a esperar la recepción de un dato

end
Menú