bueno,de momento estoy realizando las pruevas para la utilizacion de la usart de un 16f876.
he podido hacer dos programas separados para la transmision y recepcion de datos.
aqui:http://www.todopic.com.ar/foros/index.php?topic=24397.0ahora estoy haciendo una mezcla de los dos programas para que se pueda recivir y transmitir al mismo tiempo.pero dando prioridad a los datos que se hayan enviado o recivido antes.
este programa utiliza la interrupcion por recepcion de datos.y solamente se utilizara el envio de datos cuando se llame a la subrutina de envio de datos.
el programa de prueva,se basa en el envio continuo de datos del puerto A,hacia el hiperterminal de windows.
y la recepcion de datos en el puerto B del pic, al pulsar cualquier tecla del pc.
los caracteres son recividos perfectamente en el hiperterminal.pero el problema esta en que al pulsar una tecla del pc.
el pic solo saca el dato por el puerto B si desconectamos el cable que va al pin Tx del pic.
he intentado deshabiltar este pin por software.para que cuando se reciva un dato por el pin Rx,la interrupcion salte y deshabilite Tx.pero no encuentro la forma.de que funcione.no se si es problema de que el hiperterminal no puede hacer dos cosas a la vez o el pic no lo admita.
aqui pongo el asm por si alguien ve algun fallo.;******************************************
http://www.ingeniopic.com *******
; PROGRAMA : usart_rx_tx.asm
; Funcion : visualizar datos recividos de la usart por el puerto B y transmitir el valor del puerto A.por la usart interna del pic. .
; Serial port config: 9600 baudios,8 bits,paridad = none
;
; Revision : 1.0 6/1/2009 Programa para : PIC16F876
; CPU Clock : 4 MHz Reloj instruccion : 4 MHz = 0.25 us
; WDT : Deshabilitado Tipo de reloj : XT
; Code Prot : OFF velocidad usart: 9.600 Kbps
;******************************************
http://www.ingeniopic.com *******
LIST P=16F876 ;Se indica el modo de procesador
RADIX HEX ;Sistema de numeracion hexadecimal
INCLUDE <P16f876.inc> ;se incluye la definicion de los registros
;registros internos
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF &_WRT_ENABLE_OFF
ERRORLEVEL -302 ;para que no se notifiquen los errires por los registros fuera del banco de ram.
CounterA EQU 20h ;registros para retardo
CounterB EQU 21h
CounterC EQU 22h
W_TEMP EQU 23h
STATUS_TEMP EQU 24h
PCLATH_TEMP EQU 25h
BANK0 MACRO ;macro para la seleccion del banco 0
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO ;macro para la seleccion del banco 1
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
PUSH MACRO
movwf W_TEMP ;SALVO EL REGISTRO W
swapf STATUS,W
movwf STATUS_TEMP ;SALVO EL REGISTRO STATUS
clrf STATUS ;TRABAJO EN BANK 0
movfw PCLATH ;SALVO EL REGISTRO PCLATH
movwf PCLATH_TEMP
clrf PCLATH
ENDM
POP MACRO
movfw PCLATH_TEMP
movwf PCLATH
swapf STATUS_TEMP,W
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W
ENDM
#define GIE_ON bsf INTCON,GIE
#define GIE_OFF bcf INTCON,GIE
#define RX_ON bsf RCSTA,4
#define RX_OFF bcf RCSTA,4
#define TX_ON bsf TXSTA,5
#define TX_OFF bcf TXSTA,5
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
ORG 0x00 ;Inicio en el Vector de Reset
goto INICIO ;Va a la primera instruccion del programa
;<<<<<<------------------- VECTOR DE INTERRUPCION -------------------->>>>>>>
ORG 0x04 ;Vector de interrupcion
goto INTER ;salta a la linea INTER
;<<<<<<----------------- CONFIGURACION DE LOS REGISTROS GENERALES ------------------->>>>>>>
INICIO BANK0 ;Cambio al banco 0
clrf PORTA
movlw b'10010000' ;Configuracion de la usart
movwf RCSTA ;para recepcion continua y habilitacion de la usart
movlw b'11000000' ;Habilitacion para las
movwf INTCON ;interrupciones generales
BANK1
movlw 0x06 ;configura PORTA como entradas digitales
movwf ADCON1
movlw 0xff
movwf TRISA ;PORTA como entrada de datos
clrf TRISB ;Puerto B como salida
bsf TRISC,7 ;RC7/Rx como entrada
bcf TRISC,6 ;RC6/Tx como salida
movlw .25 ;valor para seleccionar 9600 baudios
movwf SPBRG
movlw b'00100100' ;Configuracion USART modo alta velocidad 9600 baud y activacion de transmision
movwf TXSTA ;carga valor anterior en registro asociado al generador del baud rate
bsf PIE1,RCIE ;Habilitacion interrupcion RX
BANK0
clrf PORTB ;borra las salidas del puerto b
;<<<<<<<<-----------------------------PROGRAMA PRINCIPAL--------------------------->>>>>>>>>>>>>>>>>>>>>>>>
nop ;aqui se pondra el programa principal y cuando queramos mandar un datos,
nop ;solo tendremos que hacer un salto al programa de envio de datos "ESCRIBEDATO"
PRINCIPAL call ESCRIBEDATO
GOTO PRINCIPAL
;<<<<<<<<-------------------------------ENVIO DE DATOS--------------------------->>>>>>>>>>>>>>
ESCRIBEDATO GIE_OFF
BANK0
RX_OFF
movfw PORTA
movwf TXREG
BANK1
COMP_TX btfsc TXSTA,TRMT ;comprueba si el shift register(TSR)esta lleno.y si es asi salta.
goto COMP_TX
BANK0
RX_ON
GIE_ON
call RETARDO ;pausa para el envio de datos
return
;<<<<<<<<-------------------COMPROVACION DE TIPO DE INTERRUPCION------------>>>>>>>>>>>>>>
INTER GIE_OFF
PUSH
BANK0
btfsc PIR1,RCIF ;comprueba si el shift register(RSR)esta lleno.y si es asi salta
goto LEEDATO
POP
retfie ;retorno de interrupcion si no se ha dado la circunstancia anterior
;<<<<<<<<-------------------------VISUALIZACION DE DATO RECIVIDO------------>>>>>>>>>>>>>>
LEEDATO BANK0
TX_OFF
movf RCREG,W ;Lectura dato recibido
movwf PORTB ;Visualiza dato recibido
TX_ON
retfie ;retorna de la interrupcion.
;<<<<<<----------------------- RUTINAS DE RETARDO ------------------------->>>>>>>
RETARDO
movlw D'6'
movwf CounterC
movlw D'24'
movwf CounterB
movlw D'168'
movwf CounterA
loop decfsz CounterA,1
goto loop
decfsz CounterB,1
goto loop
decfsz CounterC,1
goto loop
return
END