Problemas de comunicacion serial

Que tal soy nuevo en el manejo del pic 16f877 y tengo un problema con la comunicación serial con la pc, aunque todo esta programado como lo indica el fabricante no logro establecer una comunicación correcta con el dispositivo ya que ala hora de la comunicación faya, tratatre de explicarme.
por medio de la hipertermial de windows envío un dato la hiperterminal se encuentra configurada a 9600 baudios, 8 bits, sin paridad, y sin manejo de flujo, dicho dato es recibido por el pic. el cual si lo recibe pero no de forma correcta es decir si mando el da to 5 en binario recibo otra cosa por decir el 34 en binario, esto su pongo que es debido a que no hay sincronía en las velocidades de transmisión y recepcion, el pic trabaja con un cristal de 10 MHz y dos capacitores de 22pF y están cerca del pic (a unos 4 ó 5 mm) pienso que esa pudiera ser la causa de mi problema ya que el generador de baudios esta configurado a baja velocidad y a 65 en la constante k si algien pudiese darme in consejo se los he de agradeser ops:
 
hola
disculpa que te conteste con otra pregunta

pero

tienes que especificar un poco mas el asunto es comunicación sincrona o asíncrona ?

se supone que también debiste configurar el pic para que trabaje ha esa velocidad 9600bps, o porque mencionas que las velocidades son distintas ,

escribe una parte del código, donde verificas la llegada del dato correcto al pic....

como lo visualizas que el dato lo ha recibido y no este enviando algo que no has escrito..
por lo de mal funcionamiento del cristal y capacitores no creo que este el problema


PD. también son un poco novato en esto de la comunicación serial así que también estoy aprendiendo
suerT
 
Gracias por el inters mostrado en mi problema les mando el codigo de mi programa no antes de comentarles que el dato lo estoy exiviendo por el puerto b y lo bisualiso en una serie de led's el programa tiene que mostrar los datos guardados en su memoria eeprom al terminar de exivir los datos enciende una cecuencia de luces(las salida del puerto b se encienden uno tras otro) indicando que queda esperando la recepcion de los datos por el puerto serial, una vez que recibe el dato lo exibe y lo guarda en la memoria eeprom, cuando termina la ecritura de la embia la direccion donde se guardo el dato a la pc esto lo repite 10 veces y regresa al inicio para mostrar losdatos y volver a empezar

codigo de programa
Código:
LIST P=16F877
		INCLUDE	<P16F877.INC>


CONT0   EQU     0X20
CONT1   EQU     0X21
CONT2   EQU     0X22
CONT3   EQU     0X23
ADRES	EQU		0X24
DATO	EQU		0X25
SUM1	EQU		0X26
SUM2	EQU		0X27
DATOX	EQU		0X28
DIRX	EQU		0X29
DIR		EQU		0X2A
		
		ORG		0X00
		
		BSF		STATUS,5	;IR A BANCO 1
		
		MOVLW	B'00000000'
		MOVWF	PORTA	;SE CONFIGURAN LAS PUERTAS COMO SALIDAS
		MOVLW	B'00000000'
		MOVWF	PORTB		
		MOVLW	B'10000000' ;SE CONFIGURA LA RC7/TX COMO  SALIDA  DETRASMICION
		MOVWF	PORTC		;Y RC6/RX COMO ENTRADA DE RESEPCION	
		MOVLW	B'00000000'
		MOVWF	PORTD
		MOVLW	B'00000000'
		MOVWF	PORTE
	
					; COMIENSA CONFIGRUACION DE LA USART

		MOVLW	D'63'		;TRASMICION A 9600 BAUDIOS A 10MHz
		MOVWF	SPBRG		;SE CARGA BALOR AL BAUD RATE
		BCF		TXSTA,BRGH	;TRASMICION EN BAJA VELOCIDAD
		BCF		TXSTA,SYNC	;TRASMICION ASINCRONA
		
		BCF		STATUS,5	;IR A BANCO 0
		
		BSF		RCSTA,SPEN	;ABILITA EL PUERTO SERIE
		
		BSF		STATUS,5	;IR AL BANCO 1
		
		BCF		TXSTA,TX9	;8 BITS DE DATOS
		BSF		TXSTA,TXEN	;AVILITA LA TRASMICION SERIAL, TXIF=1
		
		BCF		STATUS,5	;IR A BANCO 0

		BCF		RCSTA,RX9	;8 BITS DE DATOS
		BSF		RCSTA,CREN	;AVILITA RESEPCION CONTINUA

INICIO	MOVLW	D'10';'127'
		MOVWF	DIR

             INICIO	 GOTO       READ ;MUESTRA EL DATO GUARDADO EN LA MEMORIA EEPROM
             BEGIN	NOP
             INICIO1	MOVLW	B'00000001'
		MOVWF	PORTB
		CALL	PAUSA
		MOVLW	B'00000000'
		MOVWF	PORTB
		MOVLW	B'00000010'
		MOVWF	PORTB
		CALL	PAUSA
		MOVLW	B'00000000'
		MOVWF	PORTB
				
				
	               CLRF	PORTB

		;pROCESO DE COMUNICACION DE LA USART
		;PROCESO DE RESEPCION

LEE		BTFSS	PIR1,RCIF	;PREGUNTA SI EL RX ES FULL RCIF=1
		GOTO	LEE			;NO VE A LEE
		MOVFW	RCREG	;SI	W=RCREG Y PONE A CERO EL RCIF
		MOVWF	PORTB		;ESIBE EL DATO RECIVIDO
		MOVWF	DATO		;EL DATO RECIVIDO SE CARGA EN DATO
		CALL	PAUSA
		CALL	WRITE		;GUARDA EN LA EEPROM EL DATO
		
		;PROCESO DE TRASMICION

ESCRIBE	MOVFW	DIR
		MOVWF	TXREG	;SE TRASMITE EL DATO

TRDATA	                BTFSS	PIR1,TXIF	    ;ESPERA HASTA QUE TERMINE LA TRASMICION
		GOTO	TRDATA	;NO VE A TRDATA
		
		
		CLRF	TXREG
		DECFSZ	DIR,1
		GOTO	LEE		;VE A INICIO
		GOTO	READ
		
;ESCRITURA EN LA MEMORIA EEDATA

WRITE	
		MOVFW	DIR 		;CARGA LA DIRECION DONDE SE GUARDARA
		MOVWF	ADRES		;EL DATO

		;MOVFW	DATOX
		;MOVWF	DATO		;CARGA EL DATO A GUARDAR

		BCF 	STATUS,RP0 	;Ir banco 0
		BCF 	STATUS,RP1
		MOVFW 	ADRES   	;EEADR = ADDR_L
		BCF 	STATUS,RP0 	;Ir banco 2
		BSF 	STATUS,RP1
		MOVWF 	EEADR
		BCF 	STATUS,RP0 	;Ir banco 0
		BCF 	STATUS,RP1
		MOVFW 	DATO  	 	;EEDATA = DATA_L
		BCF 	STATUS,RP0 	;Ir banco 2
		BSF 	STATUS,RP1
		MOVWF 	EEDATA
		BSF 	STATUS,RP0 	;Ir banco 3
		BSF 	STATUS,RP1
		BCF 	EECON1,EEPGD;Apuntar a la memoria EEPROM
		BSF 	EECON1,WREN	;Habilitar escritura
		BCF 	INTCON,GIE 	;Deshabilita interrupciones
		MOVLW	55h
		MOVWF 	EECON2 		;Escribe 55 hexadecimal
		MOVLW 	0xAA
		MOVWF 	EECON2 		;Escribe AA hexadecimal
		BSF 	EECON1,WR 	;Habilita el bit de escritura
		BSF	INTCON,GIE 	;Habilita interrupciones
ESPERA
		BTFSC 	EECON1,WR 	;Espera el final de grabación
		GOTO 	ESPERA 		;Si no termina la grabación: Ir _bucle
		BCF 	PIR2,EEIF 	;Si termina Borra bandera de interrupción
		BCF 	EECON1,WREN ;Deshabilitar escritura
		BCF 	STATUS,RP0 	;Ir banco 0
		BCF 	STATUS,RP1
		RETURN 				;Retorno

		;PROCESO DE LECTURA DE LA EEPROM

READ
		MOVLW	D'10';127'
		MOVWF	DIRX
LOOP1	MOVFW	DIRX
		MOVWF	ADRES

		BCF		STATUS,RP0 	;Ir banco 0

		BCF		STATUS,RP1
		MOVFW 	ADRES		;Cargar dirección a leer
		
		BCF 	STATUS,RP0 	;Ir banco 2
		BSF	 	STATUS,RP1
		MOVWF 	EEADR
		
		BSF 	STATUS,RP0 	;Ir banco 3
		BSF 	STATUS,RP1
		BCF 	EECON1,EEPGD;Apunta a la memoria EEPROM
		BSF 	EECON1,RD 	;Habilita ciclo de lectura
		
		BCF 	STATUS,RP0 	;Ir banco 2
		BSF 	STATUS,RP1
		MOVFW 	EEDATA		;W = EEDATA (leer dato de EEPROM)
		
		BCF 	STATUS,RP0 	;Ir banco 0
		BCF 	STATUS,RP1
		MOVWF 	DATO	 	;DATA_L = W (almacena dato de EEPROM)				
		MOVWF	PORTB		;EXIBE EL DATO LEIDO
		CALL	PAUSA
		MOVLW	B'00000000'
		MOVWF	PORTB
		CALL	PAUSA
		DECFSZ	DIRX,1
		GOTO	LOOP1
		GOTO	INICIO

		;PAUSA ENTRE DESTELLOS

PAUSA	MOVLW   D'150'
        MOVWF   CONT2
LOOP23  MOVLW   D'30'
        MOVWF   CONT1
LOOP21  MOVLW   D'50'
        MOVWF   CONT0
LOOP20  DECFSZ  CONT0,1
        GOTO    LOOP20
        DECFSZ  CONT1,1
        GOTO    LOOP21
        DECFSZ  CONT2,1
        GOTO    LOOP23
     	RETURN

		
		END
 
Atrás
Arriba