Problema con PIC16F876A RS232 Proteus Assembler

Hola a todos, vengo con un nuevo problema, me estoy metiendo en el tema del rs232, he leido bastante ya y puedo decir que comprendo mas o menos el asunto. Estoy haciendo un pequeño programa con un 16F876A y pues decidí ir probado el modulo USART de una vez, este es el codigo hasta ahora:

Código:
LIST	P=16F876A
	RADIX	HEX
	#INCLUDE <P16F876A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF& _DEBUG_ON & _CPD_OFF 

	CBLOCK	0X20
RET_A
RET_B
RET_C
	ENDC
	
RESET	ORG		0X00
		GOTO	INICIO
		;ORG		0X04
		;GOTO	ISR
		ORG		0X05


;-------------INICIALIZACIONES------------------

INICIO	BSF		STATUS,RP0			;PASO AL BANK1
		MOVLW	0X1F				;00011111
		MOVWF	TRISA				;PTO A TENDRÁ 4 ENTRADAS ANALOGICAS Y RA4 DIGITAL
		MOVLW	0X1F				;00011111
		MOVWF	TRISB				;PTOB TENDRÁ 5 ENTRADAS
		MOVLW	0XC0				;11000000
		MOVWF	TRISC				;ENABLE TX,RX EN USART/ASYNC.
		MOVLW	0X68				;CONFIGURO EL OPTION_REG PARA 000 PRESCALER
		MOVWF	OPTION_REG			;ASIGNADO AL WDT Y TOCS EN RA4
		MOVLW	0XA0				;INTERRUPCIONES HABILITADAS SOLAMENTE
		MOVWF	INTCON				;PARA EL TMR0
		CLRF	PIE1				;NO INTERRUPCIONES
		CLRF	PIE2				;NO INTERRUPCIONES
		MOVLW	0X24				;CONFIGURACION DEL REGISTRO DE TX USART
		MOVWF	TXSTA				;HIGH SPEED, ASYNC, ENABLE, 8 BIT
		MOVLW	0X8D				;CONFIGURACION DEL REGISTRO DE CONTROL DEL ADC
		MOVWF	ADCON1				;A/A/VREF-/VREF+/D Y RIGHT JUSTIFIED
		MOVLW	0X67				;DECIMAL 103 PARA ESTABLECER
		MOVWF	SPBRG				;9600 BAUDIOS CON 0.16% DE ERROR A 16 MHz
		BCF		STATUS,RP0			;PASO AL BANK0
		MOVLW	0X90				;CONFIGURACION DEL REGISTRO DE RX USART
		MOVLW	RCSTA				;NO ADD, CONTINUOS, 8 BIT, ENABLE
		MOVLW	0X80				;CONFIGURACION DEL REGISTRO DE CONTROL DEL ADC
		MOVWF	ADCON0				;POWER DOWN, CH000, TAD=(1/32)*FOSC
		CLRF	PORTA
		CLRF	PORTB
		CLRF	PORTC
		CLRF	PIR1
		CLRF	PIR2

;------------FIN DE LAS INICIALIZACIONES-----------

;------------COMIENZO DEL PROGRAMA-----------------
;PRIMERO UN RETARDO DE 20mS PARA ASEGURAR QUE TODOS LOS COMPONENTES
;ESTEN CARGADOS (EN EL CASO DE LOS CAPACITORES) Y LISTOS !!

		CALL	RETARDO_20MS

;AHORA TRASNMITO UN CARACTER DUMMY PARA VERIFICAR
;LA CONECTIVIDAD ENTRE EL MODULO USART Y LA PC

		MOVF	RCREG,W				;ESTO ES PARA GARANTIZAR
		MOVF	RCREG,W				;EL CORRECTO FUNCIONAMIENTO
		MOVF	RCREG,W				;DEL MODULO USART (FLUSHING THE FIFO)
		
ENVIAR	
		MOVLW	'A'					;ENVIAR UN CARACTER (CUALQUIERA)
		MOVWF	TXREG				;PONE EL TXIF EN ALTO PARA FUTURAS TX'S
		NOP							;ESTO LO RECOMIENDA MICROCHIP
		BTFSS	PIR1,TXIF
		GOTO	$-1
		MOVLW	'B'					
		MOVWF	TXREG
		NOP
		BTFSS	PIR1,TXIF
		GOTO	$-1
		CALL	RETARDO_20MS
		GOTO	ENVIAR

		
;-------------RETARDOS--------------
RETARDO_20US	MOVLW	0X05		
				GOTO	RETARDO_US
RETARDO_50US	MOVLW	0X10
				GOTO	RETARDO_US
RETARDO_200US	MOVLW	0X41
				GOTO	RETARDO_US
RETARDO_2MS		MOVLW	0X02
				GOTO	RETARDO_MS
RETARDO_5MS		MOVLW	0X05
				GOTO	RETARDO_MS
RETARDO_20MS	MOVLW	0X14
				GOTO	RETARDO_MS
RETARDO_10SEG	MOVLW	0X0A
				GOTO	RETARDO_L

RETARDO_US		MOVWF	RET_A
BUCLE0			DECFSZ	RET_A
				GOTO	BUCLE0
				RETURN

RETARDO_L		MOVWF	RET_C
CONT_RET		MOVLW	0XFA
				CALL	RETARDO_MS
				DECFSZ	RET_C
				GOTO	CONT_RET
				RETURN
				

RETARDO_MS		MOVWF	RET_A		;C+2A+AB+(B-1)*A+2A+(B-1)*2A+(A-1)*3 = X
BUCLE			MOVLW	0XF9		;C+4A+4AB+3A-3A = X
				MOVWF	RET_B		;C+4A+4AB = X
BUCLE1			NOP					;4A(1+B) = X-C
				DECFSZ	RET_B		;A = (X-C)/4(1+B)
				GOTO	BUCLE1		;PARA B=249, A={2,5,20}
				DECFSZ	RET_A
				GOTO	BUCLE
				RETURN

		END							;FIN

Es algo sencillo y solo pretendo chequear en el proteus si en realidad va a funcionar, pues en la terminal virtual del proteus deberia recibir las secuencias ABABABABAB..... pero no recibo nada. Ademas la pata RC6 (tx) en el proteus se colora gris, creo que significa que está desconectado?? :confused:

Como pueden ver en la imagen en el proteus tengo conectado un COMPIM ya que estaba probando con los puertos virtuales, logre transmitir desde el hyperterminal (siow) hacia la terminal virtual del proteus pero no desde el pic hacia afuera ni hacia la propia terminal del proteus. Alguna ayuda??
 

Adjuntos

  • rs232.png
    rs232.png
    22.2 KB · Visitas: 8
Ya lo solucioné.

Haciendo un debug con el MPLAB SIM, me doy cuenta que el registro RCSTA no estaba siendo modificado con el valor 0x90 que yo le meto, intenté hacerlo dos veces y nada seguia siendo cero, esto causaba que el modulo quedara inactivo y por eso es que no me transmitia.

Busqué la libreria p16f876a.inc a ver si alli estaba el problema pero al parecer todo esta en orden, al final lo solucione usando bsf para modificar los bit 4 y 7 del registro RCSTA y ahora funciona de maravilla.

Es raro que este bug no esté en los errata de microchip. Espero que esto le evite dolor de cabeza a alguien algun dia...
 
Ya lo solucioné.

Haciendo un debug con el MPLAB SIM, me doy cuenta que el registro RCSTA no estaba siendo modificado con el valor 0x90 que yo le meto, intenté hacerlo dos veces y nada seguia siendo cero, esto causaba que el modulo quedara inactivo y por eso es que no me transmitia.

Busqué la libreria p16f876a.inc a ver si alli estaba el problema pero al parecer todo esta en orden, al final lo solucione usando bsf para modificar los bit 4 y 7 del registro RCSTA y ahora funciona de maravilla.

Es raro que este bug no esté en los errata de microchip. Espero que esto le evite dolor de cabeza a alguien algun dia...

No se trata de ningún bug, son errores en tu programa.
Los errores que tiene tu programa tan solo son dos, y son los siguientes:

1.- La configuración del puerto C no es correcta. Tienes 0xC0 (11000000)
Necesitas configurar el pin RC6 como salida, pues es el pin Tx y está configurado como entrada.

2.- Tienes MOVLW RCSTA en vez de MOVWF RCSTA
Por eso no lograste la configuración del registro RCSTA

Suerte.
 
Hola D@rkbytes. Donde estabas hace unas horas?? Que veguenza de error! :oops: y yo diciendo que es un bug y estupideces por el estilo... jajaja, bueno a veces no vemos lo que está frente a nuestras narices.

Respecto a lo de salida y entrada, me estoy guiando po el datashet del 16F876A (pag 113):

"Bit SPEN (RCSTA<7>) and bits TRISC<7:6> have to be
set in order to configure pins RC6/TX/CK and RC7/RX/DT
as the Universal Synchronous Asynchronous Receiver
Transmitter."

Gracias.
 
Atrás
Arriba