Hola a todos!!!
He estado buscando y encontré bastante información, con la cual hice mi programa para recibir un dato y mostrarlo en una pantalla LCD.
Estoy usando un 16F88 como transmisor y un 16F873A como receptor, los datos son transmitidos vía USART en modo asíncrono, el hecho es que a pesar de haber seguido todos los pasos del data sheet no he conseguido la transmisión
Aquí les dejo el programa q he hecho. Espero q puedan ayudarme ya q no se en q estoy fallando. desde ya muchísimas gracias!!!
TX
;==================================================================================================
;========================== Programa que realiza la transmisión ===================================
;================================== serie via USART ===============================================
;==================================================================================================
List P=16F88 ;Tipo de PIC
#include "P16F88.INC" ;Registros internos
errorlevel -302
__CONFIG _CONFIG1, _WDT_OFF & _CP_OFF & _BODEN_OFF & _PWRTE_ON & _MCLR_OFF & _XT_OSC
;··································································································
;······················ Registros auxiliares ······················································
;··································································································
Aux1 equ 0x20
Aux2 equ 0x21
Dato equ 0x22
;==================================================================================================
org 0x00
goto Inicio ;Se envia al inicio del programa
org 0x05
;==================================================================================================
;**************************************************************************************************
;********************************Envio por USART***************************************************
;**************************************************************************************************
Tx
bsf PORTA,1 ;Enciendo LED para comprobar q ha comenzado a enviar dato
call Retardo
movf Dato,0
movwf TXREG ;Cargo el dato a ser enviado
bsf STATUS,RP0
bcf STATUS,RP1 ;Banco de memoria 1
Seguir
btfss TXSTA,TRMT ;verifico si terminó la transmisión del dato
goto Seguir ;No
bcf STATUS,RP0 ;Banco de memoria 0
bcf PORTA,1 ;Apagoo el LED para comprobar q ha terminado el envío del dato
return
;**************************************************************************************************
;**************************************************************************************************
;**************************************************************************************************
;__________________________________________________________________________________________________
Retardo
movlw 0xFF
movwf Aux1
Uno
movlw 0xFF
movwf Aux2
Dos
decfsz Aux2,1
goto Dos
decfsz Aux1,1
goto Uno
return
;--------------------------------------------------------------------------------------------------
Inicio
clrf PORTA
clrf PORTB
bsf STATUS,RP0
bcf STATUS,RP1 ;Bacno de memoria 1
movlw 0x01
movwf TRISA ;Puerto A como salidas menos A0
movlw b'11011100' ;Configuro el puerto B poniendo a RB5 como salida para Tx
movwf TRISB ;en la transmision USART
clrf OPTION_REG ;Configuro el registro option
clrf ANSEL ;Entradas y salidas digitales
movlw b'00100100'
movwf TXSTA ;Configuro el registro para alta velocidad y lo habilito
movlw .25
movwf SPBRG ;Configuro el baude rate a 9600
bcf STATUS,RP0 ;Banco cero
movlw b'10000000'
movwf RCSTA ;Habilito el USART
;--------------------------------------------------------------------------------------------------
Principal
bsf PORTB,0 ;Enciende y apaga un LED para comprobar q el programa corre
call Retardo
call Retardo
call Retardo
bcf PORTB,0
clrf Dato ;Pongo a cero el registro a se enviado
call Tx ;Envio el dato
Main
btfsc PORTA,0 ;Compruebo el estado de un pulsador
goto Main ;Continuo esperando a sea presionado
incf Dato,1 ;Incremento el registro
call Tx ;Envio el dato
goto Main ;Continuo enviando el dato
end
Rx
;//////////////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////// Programa que recibe un dato vía USART ///////////////////////////////////
;/////////////////////////////// y lo muestra en un LCD ///////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////////////////////////////
List P=16F873A ;Tipo de pic
Include "p16F873A.INC" ;Registros internos
errorlevel -302
__CONFIG _WDT_OFF & _XT_OSC & _LVP_OFF & _PWRTE_ON & _BODEN_ON & _CP_OFF & _DEBUG_OFF
;////////////////////////////////////////////////////////////////////////////////////////
Aux equ 0x24
aux1 equ 0x23
aux2 equ 0x25
Dato1 equ 0x28
Dato2 equ 0x2A
Bit9 equ 0x2B
Adresh equ 0x1E
adresl equ 0x9E
Unidad equ 0x20
Decena equ 0x21
Centena equ 0x22
decimal equ 0x29
Cociente_H equ 0x26
Cociente_L equ 0x27
Cmcom equ 0x9c
#define Irp STATUS,7
#define Rp1 STATUS,6
#define z STATUS,2
#define c STATUS,0
#define LCDModo PORTB,2
#define LCDE PORTB,1
;==================================================================================================
org 0x00
goto Inicio ;Se envía al inicio del programa
; org 0x04 ;Dirección de reset
; goto Rx ;Interrupción por recepción de dato vía USART
org 0x07 ;Direccion donde comienza el programa
;==================================================================================================
Retardo
movlw 0x0E
movwf aux2
Loop4
movlw 0xff
movwf aux1
Loop1
decfsz aux1,1
goto Loop1
decfsz aux2,1
goto Loop4
return
Delay
movlw .200
movwf aux2
Loop2
movlw .250
movwf aux1
Loop3
decfsz aux1,1
goto Loop3
decfsz aux2,1
goto Loop2
return
;==================================================================================================
;**************************************************************************************************
;*****************************Rutinas para el LCD**************************************************
;**************************************************************************************************
Control
bcf LCDModo ;Indico q se va a transmitir comandos de control
goto Enviar
Dato bsf LCDModo ;Indico q se va a transmitir datos
Enviar
bsf LCDE
movwf Aux
movlw 0x0f
andwf PORTB,1
movf Aux,w
andlw 0xF0
iorwf PORTB,1 ;Envío la parte alta del byte
call Retardo
bcf LCDE
call Retardo
bsf LCDE
movlw 0x0f
andwf PORTB,1
swapf Aux,w
andlw 0xf0
iorwf PORTB,1 ;Envío la parte baja del byte
call Retardo
bcf LCDE
call Retardo
return
;///////////Inicializa LCD a 4bits////////////////////////////////////////////////////////////////
IniLCD
movlw 0x02 ;Se indica q la comunicacion es a 4 bits
call Control
movlw 0x28 ;Com a 4 bits y 2 líneas
call Control
movlw 0x0c ;Activo display
call Control
movlw 0x06 ;Mensaje sin desplazamiento
call Control
movlw 0x01 ;Borra el LCD
call Control
call Delay
return
;//////////////////////////////////////////////////////////////////////////////////////////////////
Write
movlw 0x30
addwf Unidad,1
addwf Decena,1
addwf Centena,1
movlw 0xc5
call Control
movf Centena,0
call Dato
movf Decena,0
call Dato
movf Unidad,0
call Dato
return
;**************************************************************************************************
;**************************************************************************************************
;**************************************************************************************************
;--------------------------------------------------------------------------------------------------
;--------------------- BCD de 8 bits a decimal---------------------------------------------------
;--------------------------------------------------------------------------------------------------
Decimal
movf Dato,0
movwf Unidad
clrf Centena
clrf Decena
Uno
movlw .10
subwf Unidad,0
btfss STATUS,C
goto Fin
Dos
movwf Unidad
incf Decena,1
movlw .10
subwf Decena,0
btfss STATUS,C
goto Uno
Tres
clrf Decena
incf Centena,1
goto Uno
Fin
return
;--------------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------------
;==================================================================================================
Inicio
clrf STATUS
clrf PORTA
clrf PORTB
clrf PORTC
bsf STATUS,RP0 ;Cambio de banco de memoria
bcf STATUS,RP1
movlw 0x01
movwf TRISA ;Configuro el puerto A
movlw 0x00
movwf TRISB ;configuro el purto B
movlw b'10000000'
movwf TRISC ;Configuro a RC6=Tx y RC7=Rx
clrf OPTION_REG ;configuro el registro option
movlw 0x07
movwf Cmcom ;Des habilito los comparadores
movlw .25
movwf SPBRG ;Configuro la velocidad del USART a 9600 baudios
movlw b'00010100'
movlw TXSTA ;Comfiguro al USART como asíncrono y alta velocidad
bcf STATUS,RP0 ;Cambio de banco de memoria
bcf STATUS,RP1
; movlw b'10000000'
; movwf INTCON ;Habilito las interrupciones
; movlw b'00100000'
; movwf PIE1
bsf RCSTA,CREN ;Habilito la recepción
bsf RCSTA,SPEN ;Habilito el puerto serie
call Delay
;==================================================================================================
Loop
bsf PORTB,0 ;Encinede y apaga un LED para comprobar q el programa corre
call Delay
call Delay
call Delay
call Delay
call Delay
call Delay
bcf PORTB,0
Lazo
clrf Decena ;Limpio registros
clrf Centena
clrf Unidad
call IniLCD ;Sub rutina para inicializar el LCD
Mostrar
Call Write ;sub rutina q envía los datos al LCD
call Delay
clrf RCREG ;Limpio registro de recepción
bsf PORTC,5 ;Enciendo un LED, éste se va a apagar despues de recibir y mostrar
;el dato recibido en el LCD
Test
bcf RCSTA,OERR ;Borro bandera de error de desborde
bcf RCSTA,FERR ;Borro bandera de error de trama
btfss PIR1,RCIF ;Compruebo si he recibido un dato
goto Test ;No, continuo esperando
bcf PIR1,RCIF ;Si, Borro bandera
btfsc RCSTA,FERR ;Hubo erro de trama?
goto Test ;Si, vuelvo a esperar otro dato
btfsc RCSTA,OERR ;Hubo error de desborde?
goto Test ;Si, vuelvo a espetar otro dato
movf RCREG,0 ;Muevo el dato recibido a otro registro
movwf Dato
call Decimal ;Rutina q hace la conversion binario a BCD
bcf PORTC,5 ;Apago el led esto me indica q terminó la recepción
goto Mostrar ;Vuelvo y muestro el dato en un LCD
end