# Conexion pic16f876 mediante rs232 al pc



## mikelzuru (Jun 7, 2006)

buenas tengo un problema al conectar un pic16f876 al pc por medio del rs232, la cosa es que consigo mandar caracteres del pic al pc sin ningun problema, en el hyperterminal me aparece todo lo que he mandado, mi problema es al recibir. He configurado el pic para que cuando reciba un dato del pc salte una interrupcion, y en el vector de interrupcion he hecho que envie un caracter al pc, vamos que intento hacer un eco pero mandando un caracter cualquiera que ponga yo manualmente, no el que me mande el pc. La cosa es que cuando pongo el hyperterminal, en la pantalla me recibe el caracter que deberia de mandar yo en el vector de interrupcion, es decir el caracter sale continuamente en pantalla, sin que yo le mande nada no deberia saltar la interrupcion uqe manda el caracter, pero por lo que parece es como si yo estuviera mandando algo constantemente. Aqui va el codigo a ver si alguien puede decirme donde esta el fallo, seguramente estara en la configuracion pero yo no lo veo:


```
;<<<<<<------------------- VECTOR DE INTERRUPCION -------------------->>>>>>>

ORG 04H ;Vector de interrupcion

INTER btfss PIR1,RCIF ;¿Interrupcion por recepcion?
goto VOLVER ;No. Falsa interrupcion
bcf PIR1,RCIF ;Si. Reponer Flag
movlw b'10000000' ;Envia el caracter, valor binario
movwf TXREG ; del codigo ascii
VOLVER retfie

;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>

INICIO clrf PORTB ;Limpia salidas
clrf PORTC

bsf RCSTA,SPEN ;se activa la USART
bsf STATUS,RP0 ;Cambio al banco 1 ------------------
bcf STATUS,RP1
clrf TRISA ;Puerta A como salida
clrf TRISB ;Puerta B como salida
movlw 80H ;RC7/Rx entrada,
movwf TRISC ;RC6/Tx salida y RC5 Salida.
movlw 04H ;Configuracion USART
movwf TXSTA ;y activacion de transmision
movlw .25 ;9600 baudios
movwf SPBRG
bsf PIE1,RCIE ;Habilitacion interrupcion RX
bcf STATUS,RP0 ;Cambio al banco 0 -----------------
;clrf PORTB ;Limpia salidas
;clrf PORTC
bsf RCSTA,SPEN ;se activa la USART

movlw b'10010000' ;Configuracion de la usart
movwf RCSTA ;para recepcion continua

bsf STATUS,RP0 ;Cambio al banco 1 -------------
bcf STATUS,RP1
bsf TXSTA,TXEN ;Habilita la transmision

bcf STATUS,RP0 ;Cambio al banco 0 ------------------
movlw 0C0H ;Habilitacion para las
movwf INTCON ;interrupciones generales

Bukle goto Bukle
```

espero vuestra respuesta gracias, saludos


----------



## Dytronix (Jun 7, 2006)

enviame tu direccion de correo que te mando un programa que tengo y funciona correctamente.
La PC envia un caracter, el pic lo devuelve en forma de eco y lo coloca en un display 2x16.
Se comunica por RS232


----------



## elzorro18900 (Jun 8, 2006)

veo en tu programa que le falta una rutina como la que sigue, despues de poner el dato a transmitir en TXREG de la interrupcion.


```
TATO
	BCF	PIR1,TXIF	
	BANKSEL	TXSTA            ;banco1
ESPERA1:BTFSS	TXSTA,TRMT   ;espera a que se vacie el TSR
	GOTO	ESPERA1
	BANKSEL	PORTB            ;banco0
	RETURN
```
Y así compruebas que se ha enviado el dato del PIC al PC.

Otra cosa; que programa estás manejando para hacer interfaz en el PC, te recomiendo Visual Basic.


----------



## mikelzuru (Jun 9, 2006)

> elzorro18900 Publicado: Jue Jun 08, 2006 12:43 am    Asunto:
> 
> --------------------------------------------------------------------------------
> 
> veo en tu programa que le falta una rutina como la que sigue, despues de poner el dato a transmitir en TXREG de la interrupcion.



bueno si aunque no aparezca ese trozo de comprobacion de transmitir el dato, lo tengo puesto, lo raro es que no deberia mandarlo, ya que la interrupcion en el que se manda el dato solo se activa al recibir un dato del pc, y eso es lo q me pasa q se activa la interrupcion sin que yo mande nada del pc, la interfaz donde estoy visualizando todo el proceso es el hyperterminal de windows, y tambien mediante un programa de conexion en serie hecho en java, que tiene la misma configuracion que el hyperterminal. Yo sigo sin averiguar porque salta la interrupcion, seguire investigando, a ver si alguien puede aclararmelo, gracias y saludos


----------



## mikelzuru (Jun 19, 2006)

gracias ya esta solucionado el problema, despues de corregir algunos fallos en el progrmaa mismo resulta q habia un fallo de conexion en el circuito, gracias por la ayuda, saludos


----------



## Caryub (Jun 19, 2006)

mikelzuru dijo:
			
		

> gracias ya esta solucionado el problema, despues de corregir algunos fallos en el progrmaa mismo resulta q habia un fallo de conexion en el circuito, gracias por la ayuda, saludos



me podriais mandar el programa. os los agradeceria enormemente.


----------



## PHLAKO (Ago 27, 2006)

compadre, no he tenido tiempo para ver tu programa, pero lo mas rapido para ayudarte es pasarte un programa k hice y manda un eco:



este esta de pelos, lo uso constantemente 

chaos 

buuu, no habia visto k ya habias solucionado el problema


----------



## mr.oso (Jul 29, 2009)

Hola soy nuevo en este foro asi que saludos a todos los integrantes!

Aprovechando el tema sobre la transmision de datos mediante el puerto serial yo tengo un problema parecido. Estoy haciendo un programa en donde al recibir un dato la interrupcion por recibir el dato salte y compare el dato obtenido con otro dato para saber si es o no el dato. El problema que tengo es que no se activa la interrupcion al recibir el dato espero puedan ayudarme le anexo mi programa. Por cierto uso el pic 16F873A. 


```
ORG 0
	clrf	PCLATH
	GOTO	MAIN
	ORG	4
	GOTO	INTERRUPCION

INTERRUPCION	
	BTFSC	PIR1,RCIF
	GOTO	PREGUNTA2
	RETFIE
RECIBIR
		BCF		PIR1,RCIF
		BTFSC	ID,0
		GOTO	RESPUESTA1
		BTFSC	ID,1
		GOTO	RESPUESTA2
		BTFSC	ID,2
		GOTO	RESPUESTA3
		BTFSC	ID,3
		GOTO	RESPUESTA4
		BTFSC	ID,4
		GOTO	RESPUESTA5
		BTFSC	ID,5
		GOTO	RESPUESTA6
		BTFSC	ID,6
		GOTO	RESPUESTA7
		BTFSC	ID,7
		GOTO	REGRESAR
		MOVF	RCREG,W
		MOVWF	RECIBO
		CLRF	RCREG
		MOVLW	D'34'
		SUBWF	RECIBO,0
		BTFSC	STATUS,Z
		GOTO	MODID
		GOTO	LOOPA

MAIN
	BSF		STATUS,RP0
	MOVLW	D'23'
	MOVWF	SPBRG
	BSF		TXSTA,BRGH
	BCF		TXSTA,SYNC
	BCF		STATUS,RP0
	BSF		RCSTA,SPEN

	BSF		STATUS,RP0
	BCF		TRISC,6
	BSF		TRISC,7
	BSF		PIE1,RCIE	
	BSF		INTCON,PEIE
	BSF		INTCON,GIE
	BCF		STATUS,RP0
	BSF		RCSTA,CREN
	MOVLW	D'255'
	MOVWF	CONT1
	MOVLW	D'255'
	MOVWF	CONT2
	MOVLW	D'10'
	MOVWF	CONT3
	BSF		PORTB,7


loop
	goto	loop
	END
```

En fin no es todo el programa como pueden ver checo si hay o no en una variable llamada id que bit esta en set y cual no pero eso es solo con cuestiones de ir guardando datos, en fin el problema es la interrupcion muchas gracias por la ayuda.


----------

