hola,
objetivo: mandar dato desde pc al pic 16f877 - via uart asincrona, que procese el dato y lo devuelva pro la uart al pc
he elaborado el siguiente programa en leng. ensamblador, y me gustaria que algún alma caritativa lo revisara antes de implementarlo.
Muchas Gracias
Código:
LIST P=16F877
RADIX HEX
INCLUDE "P16F877.INC"
dato EQU 20
reg9bit EQU 21
ORG 0x00
goto INICIO
ORG 0x04
INTER bcf STATUS,RP0
btfss PIR1,RCIF ; se ha recibido datos en RSR register
goto VOLVER
btfss RCSTA,FERR ;si FERR=1 habrá error de frame y no se ejecutara la siguiente instrucción
goto NOEF
goto VOLVER ;existe error de frame y no ejecutamos recepción
NOEF btfss RCSTA,OERR ;si OERR=1 habrá error de overrun y no se ejecutara la siguiente instrucción
goto NOEO
goto VOLVER ;existe error de overrun y no ejecutamos recepción
NOEO movlw D'0' ; no habria ni overrun ni error de frame,
btfsc RCSTA,RX9D ; si el 9th bitRX9D=1 ejecuta siguiente instrucción
movlw D'1'
movwf reg9bit ;meto o bien el 0 o el 1 que haya llegado como noveno bit
movf RCREG,W
movwf dato ;meto el resto de 8 bits en el reg dato
DECFSZ dato,1 ;una vez rx los 9 bits, para reenviarlo invierto el noveno bit y sumo 1 al octeto
INCFSZ reg9bit,1 ; si el bit 0 era 1 se pondrá a 0 y si es 0 se pondrá a 1 al sumarle '00000001'
bsf STATUS,RP0 ; banco 1 , ahora vamos a transmitir
bsf PIE1, TXIE ;TXIE=1 permito interrupciones por tx
bsf TXSTA,TX9D ;supongo que bit 9 es 1
btfss reg9bit,0 ;si fuera un 1 se salta siguiente instrucción
bcf TXSTA,TX9D ; es un 0 y lo pongo a 0
bcf STATUS,RP0 ; banco 0 para tarbajar con TXREG
movf dato,TXREG
bsf STATUS,RP0 ; banco 1 , para trabajar con TXSTA
FINTX btfss TXSTA,TRMT
goto FINTX
bcf PIE1, TXIE ;TXIE=0 quito permito interrupciones por tx
VOLVER retfie
INICIO clrf PORTC ; limpio puerto C que se utilizará en entrada y salida
movlw b '11000000'
iorwf INTCON,F ; OR con INTCON para activar GIE=PEIE=1 permitir interrupciones
bcf STATUS,RP0 ; banco 0
movlw b'11010000'
movwf RCSTA ; SPEN=1 serial port enable, RX9=1 9 bits, CREN=1 continuous receive
; ADDEN=0 enables interrupt and load of the receive buffer when RSR<8> is set
bsf STATUS,RP0 ; banco 1 , para trabajar con TXSTA
movlw b '01100100'
movwf TXSTA ; TXE=1 se tx 9 bits, TXEN=1 tx enable, BRGH=1 high speed (pendiente)
movlw D '207'
movwf SPBRG ; fosc = 4MHZ, 1200 baudios
bcf PIE1, TXIE ; TXIE=0 no permito interrupciones por tx hasta que no reciba datos
bsf PIE1, RCIE ; RCIE=1 permito interrupciones por rx
BUCLE goto BUCLE