Programación Específica > Microcontroladores
Envio De Datos Por El Puerto Serial Pic-pc
LexCorp:
Hola a todos, soy nuevo en el foro y he leido sobre lo que han hecho con el pic16F877, yo estoy en un proyecto con ese pic, pero mi duda es que si es necesario tener un convertidor a rs232, com por ejemplo el MAX232, o si solo conectando las salidas TX, RX del USART del pic puedo hacer el envio y recepcion de datos con una pc, ya que he tenido problemas probando con la pc, es decir le envio cualquier dato a la pc por medio del pic, pero me lo recibe como caracteres raros, no saben si se deba a la velocidad de transmision, o si necesita el MAX o podrian enviarme un programa de ejemplo de envio de datos que si funcione, que ya halla sido probado para guiarme, y que cristal utilizaron. Su ayuda va a ser de gran valor para mi.
karen81:
primero si es necesario usar un circuito como la max232 para comunicar PC-PIC, porque los niveles de voltaje del puerto no son como los del pic, yo use el circuito que enuncie antes (con el cambio respectivo) en lugar de la max232 y funciona perfecto.
tambien utilice como guia las rutinas de envio y recepcion que estan en la siguiente pagina web, solo que ellos han utilizado el pic 16f873, solo es de que te fijes en los bits de configuracion ya que pueden variar.
la pagina es :
<a href='http://www.x-robotics.com/' target='_blank'>http://www.x-robotics.com/ </a> (se va a RUTINAS y luego a comunicaciones rs232)
:) espero sea de ayuda, cualquier duda aqui estamos :comp:
LexCorp:
Hola disculpen la otra vez ya habia ecrito al foro por lo de un problema con un pic, en especifico el 16F877, pero hice una configuracion con el pic y sigue sin funcionar, nose si podrian decirme si tiene un error el codigo fuente, o tal vez sea la forma en que hago las conexiones del pic a la pc, podrian ayudarme, y por cierto karen81, a el circuito que esta en la pagina de pablin, dijiste que le quitaste la resistencias de 4.7k, solo se la quitaste o dejaste la union del circuito en lugar de la resistencia???
Bueno aqui esta mi programa, alguien podria ayudarme diciendome si he configurado mal???
Utilizo el pic 16F877 con un crystal de 4MHz y capacitores de 22p, con un boton conectado a una patita del pic, mando una señal para que en vie el siguiente dato, envio datos en hexadecimal, si los envia pero los envia de una forma muy rara.
CUAL SERA EL PROBLEMA?????
Include "p16f877.inc"
dato EQU 0x21
cont EQU 0x20
N EQU 0xA5
contT EQU 0x22
org 0x0000
trans BSF STATUS,RP0 ;banco 1
MOVLW 0x80 ;Todos los bits del puerto C como salidas
MOVWF TRISB ;y el MSB como entrada
BSF TXSTA,BRGH ;pone bit BRGH=1 (velocidad alta)
MOVLW .25 ;valor para 9600 Bauds (Fosc=4.000 Mhz)
MOVWF SPBRG ;configura 9600 Bauds
BCF TXSTA,SYNC ;limpia bit SYNC (modo asíncrono)
BSF TXSTA,TXEN ;pone bit TXEN=1 (habilita transmisión)
MOVLW 0xbf ;RC7/Rx entrada,
MOVWF TRISC ;RC6/Tx salida
BCF STATUS,RP0 ;regresa al banco 0
BSF RCSTA,SPEN ;pone bit SPEN=1 (habilita puerto serie)
CLRF cont ;Inicializa contador en cero
CLRF contT ;Inicializa contador en cero
MOVWF dato ;lo guarda en dato
CALL envia
tecla BTFSS PORTB,7 ;checa botón
GOTO tecla ;Si no se ha presionado espera
CALL d20ms ;pausa de 20 milisegundos
BTFSS PORTB,7 ;checa nuevamente el botón
GOTO tecla ;tecla falsa, espera de nuevo
INCF cont,1 ;tecla válida, incrementa contador
CALL codigo ;obtiene código para desplegar el contador
MOVWF dato ;lo guarda en dato
CALL envia
suelt BTFSC PORTB,7 ;checa de nuevo el botón
GOTO suelt ;si sigue presionado espera
GOTO tecla ;si ya se soltó espera nueva presión.
;*************************************************
;Subrutina para enviar un dato por el puerto serie
;*************************************************
envia BSF STATUS,RP0 ;banco 1
esp BTFSS TXSTA,TRMT ;checa si el buffer de transmisión
GOTO esp ;si está ocupado espera
BCF STATUS,RP0 ;regresa al banco 0
MOVF dato,W ;rescata dato a enviar
MOVWF PORTB
MOVWF TXREG ;lo envía
RETURN
;*************************************************
;Subrutina para obtener dato
;*************************************************
codigo
MOVLW 0x1f ;carga máscara
ANDWF cont,0 ;enmascara el contador y lo deja en W
ADDWF PCL,1 ;Salta W instrucciones adelante
RETLW 0x20
RETLW 0x21
RETLW 0x22
RETLW 0x23
RETLW 0x24
RETLW 0x25
RETLW 0x26
RETLW 0x27
RETLW 0x28
RETLW 0x29
RETLW 0x2A
RETLW 0x2B
RETLW 0x2C
RETLW 0x2D
RETLW 0x2E
RETLW 0x2F
RETLW 0x30
RETLW 0x31
RETLW 0x32
RETLW 0x33
RETLW 0x34
RETLW 0x35
RETLW 0x36
RETLW 0x37
RETLW 0x38
RETLW 0x39
RETLW 0x3A
RETLW 0x3B
RETLW 0x3C
RETLW 0x3D
RETLW 0x3E
RETLW 0x3F
RETLW 0x40
RETLW 0x41
RETURN
;*****************************************
;Rutina de Pausa que dura 20 milisegundos
;*****************************************
d20ms
MOVLW N ;Carga dato que controla la duración
MOVWF contT ;inicializa contador con el dato
rep DECFSZ contT,1 ;Decrementa contador y escapa si cero
GOTO rep ;si no es cero, repite
esc RETURN ;regresa de esta subrutina
end
karen81:
:) Primero, con respecto al circuito, si le quite completamente la resistencia de 4.7K y no puse nada ahi.
con respecto a la configuracion me parece que esta bien, pero deberias inicialmente probar con un programa mas sencillo solo para ver si te envia los datos.
del resto del programa solo me llamo la atencio lo siguiente
--- Código: Text ---CLRF contT;Inicializa contador en ceroMOVWF dato;lo guarda en dato ¿que pones en dato aqui? el ultimo valor de W aqui es bf ¿eso es lo que quieres enviar?
--- Citar ---envio datos en hexadecimal, si los envia pero los envia de una forma muy rara.
--- Fin de la cita ---
los datos llegaran a la PC en ASCII, no en hexadecimal asi se mandas 41 recibes "A", si mandas 35 recibes "5"
LexCorp:
Bueno hola Karen81 :hola: , mira en el codigo que te escribi, el programa lo que hace es enviar los numeros que ahi aparecen, es decir envio el codigo en hexadecimal de una secuencia de numeros, es decir, en hexadecimal envio 0x20 que en decimal es 32, lo cual en ASCII es el caracter espacio, hasta el 0x41 que en ASCII es el caracter " ) " el programa envia los datos pero no estoy muy seguro de que los haga de la forma correcta, y tienes razon el cachito de codigo que mencionas:
--- Código: Text --- CLRF contT;Inicializa contador en ceroMOVWF dato;lo guarda en dato
Esta de mas la instruccion, no es necesaria, sin embargo si manda datos.
Bueno continuando, yo utilice la hiperterminal de windows y no recibo nada, mi configuracion ya la viste, utilizo el cristal de 4MHz y los capacitores de 22p pero no se si tenga que ver algo la configuracion de mi programa, es decir, yo quiero utilizar la velocidad de transmision a 9600 Bauds.
Mis preguntas son las siguientes:
1.-Que sistema operativo utilisaste para la comunicacion??, lo que pasa es que he oido que windows XP desabilita el puerto paralelo.
2.-Que pic fue el que utilisaste para tu programa?
3.- Podrias pasarme la configuracion que utilisaste, que cristal, capacitores de cuanto, para que yo lo pueda reproducir, y asi salir de dudas, mas que nada por que en verdad quiero saber en que estoy mal. Utilizaria la hiperterminal para probarlo, pero anda pasame la configuracion.
Utilisas ensamblador igual que yo para el codigo, solo eso quiero, un ejemplo que ya alla funcionado para corregir mis errores.
He probado tambien mi circuito con un programa en java pero nada mas no me recibe nada, solo pura basura, eso me da a entender que los datos estan siendo enviados mal, pero no se si manejo mal la velocidad de transmision.
Si es que no quieres postear tu programa me lo podrias manda a mi mail???
P.D. En verdad necesito ese favor... :D
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa