# PIC16F87X comunicación serie PIC-PC en ensamblador



## sangreaztk (Dic 12, 2008)

Saludos kamaradas!
Quise aprender a usar la comunicación serie en un sistema PIC-PC, buscando por muchas horas en internet y revisando los datasheet de microchip, pero todo fue inútil para mi caso, no encontré nada que me sirviera, a lo mejor porque no sé buscar. 
Pero entonces que me meto a la biblioteca de mi escuela y a buscar entre paginas de papel, y lo chido es que encontré justo lo que necesitaba, un código de ejemplo para la transmisión y recepción en el PIC16F87X en ensamblador.
Era para el 16F873 y tenia un errorsillo además de que usaba el perroguardian, pero con unas ligerisimas modificaciones, ya poseía el código para empezar a experimentar.
Disculpen tanto bla bla bla, el objetivo de este tema es compartir el código, espero no tener problemas al haberlo sacado de un libro, pero en el código esta la bibliografía.

El código lo que hace es esperar un dato del PC, cuando lo tiene lo imprime en el PORTB y lo envía de nuevo al PC, hace un eco.


```
processor	16f877
	include 	<p16f877.inc>
	__CONFIG	0x3F71

; ------------------------------Código modificado por aztk-------------------------------------
; inicio
          org     0x00
          goto    inicio
          org     0x04
          goto    INTER

; Se transmite via Serie el dato que esta en el registro W
TX_DATO   bcf     PIR1,TXIF      ; Restaura el flag del transmisor
          movwf   TXREG          ; Mueve el byte a transmitir al registro de transmision
          bsf     STATUS,RP0     ; Bank01
          bcf     STATUS,RP1

TX_DAT_W  btfss   TXSTA,TRMT     ; ¿Byte transmitido?
          goto    TX_DAT_W       ; No, esperar
          bcf     STATUS,RP0     ; Si, vuelta a Bank00
          return

; Tratamiento de interrupción
INTER     btfss   PIR1,RCIF      ; ¿Interrupción por recepción?
          goto    VOLVER         ; No, falsa interrupción
          bcf     PIR1,RCIF      ; Si, reponer flag
          movf    RCREG,W        ; Lectura del dato recibido
          movwf   PORTB          ; Visualización del dato
          call    TX_DATO        ; Transmisión del dato como eco
VOLVER    retfie

; Comienzo del programa principal
inicio    clrf    PORTB          ; Limpiar salidas
          clrf    PORTC
          bsf     STATUS,RP0     ; Bank01
          bcf     STATUS,RP1
          clrf    TRISB          ; PORTB como salida
          movlw   b'10111111'    ; RC7/RX entrada,
          movwf   TRISC          ; RC6/TX salida
          movlw   b'00100100'    ; Configuración USART
          movwf   TXSTA          ; y activación de transmisión
          movlw   .25            ; 9600 baudios
          movwf   SPBRG
          bsf     PIE1,RCIE      ; Habilita interrupción en recepción
          bcf     STATUS,RP0     ; Bank00
          movlw   b'10010000'    ; Configuración del USART para recepción continua
          movwf   RCSTA          ; Puesta en ON
          movlw   b'11000000'    ; Habilitación de las
          movwf   INTCON         ; interrupciones en general

BUCLE     nop
          goto    BUCLE

          end

; --------Código original en:
;
;	MICROCONTROLADORES <<PIC>>
;	Diseño práctico de aplicaciones
;	SEGUNDA PARTE: PIC 16F87X
;	José M. Angulo, Susana Romero, Ignacio Angulo
;	Editorial: McGrawHill
```

Otra cosa, se que ya hay temas en el foro relacionados con el tema, pero preferí hacer uno nuevo para -según yo- facilitar la búsqueda.
Buena Vibra!


----------



## HASBLEYDER (Dic 26, 2008)

Gracias por la información. 

pero no entiendo como ingresa la información y como se distribuye. por ejemplo poder encender 4 led's y apagar los otros 4.


Gracias.


----------



## sangreaztk (Dic 26, 2008)

La configuración está para una transmisión asíncrona a 9600 Bauds. Este programa lo que hace es estar esperando una interrupción por recepción de un dato, cuando pasa esto lee el dato recibido que se encuentra en el registro 'RCREG', lo imprime en el PORTB y lo carga al registro 'TXREG' para retransmitirlo a la PC. Si quieres que en el PORTB el nibble bajo este en alto y el nibble alto este en bajo tienes que enviar desde el PC al PIC el dato 0x0F.
Te dejo otro link que te puede servir:
https://www.forosdeelectronica.com/about29457.html


----------



## fofo almarales (Dic 27, 2008)

Ya lo demas seria hacer pruebas con el hiperterminal


----------



## Dianiss_ca (Feb 6, 2009)

este codigo lo puedo compilar tal cual con el Mplab?, es que yo necesito usar la usart del pic 16f877 y el unico compilador que tengo es el MPLAB, lo que yo quiero hacer es mandar una serie de 6 bit al Pic para que segun eso me encienda una serie de luces, pero lo que no secomo hacer es el progama interno del pic, por que nunca he usado interrupciones ninada de eso, mejor dicho estoy mas perdida que la mama del chavo....


----------



## sangreaztk (Feb 6, 2009)

Si, el código está en assembly (ensamblador) por lo que puede ser ensamblado con MpLab para obtener el *.hex

Para tu programa, entiendo que no vas a transmitir del PIC al PC, solamente recibir, entonces no te será necesaria la subrutina TX_DATO y ya solo bastaría modificar la subrutina INTER para obtener lo que quieres.

Buena Vibra!


----------



## irandys (Jul 21, 2012)

soy nuevo en esto y lo que quiero es mostrar lo que se envia desde la pc en un display y tambien enviar datos a la pc desde un teclado matricial podrias ayudarme te lo agradeceria !!


----------



## alexisrubio (Nov 30, 2013)

Buenas. Resulta que tengo un problema.
Siguiendo más o menos el ejemplo expuesto arriba, hice un programa para comunicar dos pic entre sí.
El problema resulta q*ue* en proteus funciona sin falla y en físico no.
*H*e probado varios pic por si eran daños en el mismo y nada, sigue sin funcionar.
Un profesor me dijo q*ue* se debía a la palabra de configuración y no a la programación.
*¿*Alguno sabe q*ue *palabra de configuración se debe utilizar en la implementación del usart*?*


----------



## D@rkbytes (Nov 30, 2013)

alexisrubio dijo:


> *¿*Alguno sabe q*ue *palabra de configuración se debe utilizar en la implementación del usart*?*


Si es para un PIC16F87X/A trabajando a una frecuencia inferior o igual a 4MHz, puedes usar esta.

    list    p=16f877a
    include    p16f877a.inc
    __config    _XT_OSC & _WDTE_OFF & _PWRTE_ON & _LVP_OFF

Si es superior a 4MHz, debes usar _HS_OSC

La palabra de configuración depende mucho sobre el programa que quieras realizar.

Lee más sobre los fuses en la hoja de datos del PIC que uses.
Para el PIC16F877A esa información la encuentras en la página 146 como *CONFIGURATION WORD*


----------



## alexisrubio (Nov 30, 2013)

gracias man probare con lo que me dices disculpa por la forma de escribir.


----------

