Sábado 21 de Diciembre de 2024, 19:51
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación Específica
»
Microcontroladores
(Moderador:
© Jonathan ©
) »
Rs-232
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Rs-232 (Leído 3003 veces)
crbrs
Nuevo Miembro
Mensajes: 18
Rs-232
«
en:
Miércoles 4 de Enero de 2006, 15:09 »
0
Buenas, de nuevo.
Tngo implementado un protocolo RS-232 con el PIC16F84A, en realidad, es un ECO, lo que envio por teclado, el PIC me lo devuelve. En cuanto al hardware (ya que es en lo q suelo fallar) pues he mantenido el esquema que tiene el datasheet del MAX232 (adjunto archivo).
Expongo el soft:
Código: Text
;Habilita un Puerto Serie con el protocolo:9600N81
;PB.0 como salida (Tx) y PB.1 como entrada (Rx)
;Half Duplex. El programa hace la funci¢n "ECO"
;Todo caracter recibido es devuelto autom ticamente.
;** OJO ** caracter por caracter, si se transmite m s de un
;caracter a la vez, se perder el que coincida con la transm.
LIST P=PIC16C84, R=HEX; XTAL=4MHz
INCLUDE pic16f84.inc
;Variables en RAM
ORG 0C
;La directiva "RES", reserva posiciones de memoria a partir del ORG
dTx RES 1 ;Registro del dato a transmitir
dRx RES 1 ;Registro del dato entrante
cont1 RES 1 ;Variables aux. para retardo
ldato RES 1 ;Regist. aux. para contar los bits
;
ORG 0 ;Vector RESET
INI BSF STATUS,RP0 ;Selecc. banco 1
BCF TRISB,0 ;PB.0 como salida Tx y PB.1 = Rx
BSF TRISB,1
BCF STATUS,RP0 ;Selecciona banco 0
;********** Rutina de lectura ****************
Ndato BTFSC PORTB,1 ;Espera Bit START?
GOTO Ndato
MOVLW 8 ;Datos de 8 bits
MOVWF ldato
CLRF dRx ;Borra registro de dato entrante
CALL RetaRx ;Retardo para fijar lectura en punto medio
;de cada bit, despues de detectar el START
Birx BCF STATUS,C ;Borra carry
RRF dRx ;Por defecto el primer bit a "0"
BTFSC PORTB,1 ;Es un "0"?
BSF dRx,7 ;Es un 1
CALL RetaTx ;Retardo de 104 us. => 9600 baudios
DECFSZ ldato ;Ultimo bit?
GOTO Birx
MOVF dRx,w ;Copia registro del dato entrante en W y
MOVWF dTx ;lo transfiere al registro de salida
;***********Rutina de transmisi¢n *********+
MOVLW 8
MOVWF ldato ;Datos de 8 bits
BCF PORTB,0 ;Saca bit de start
Bitx CALL RetaTx ;Retardo para generar 9600 baudios
RRF dTx ;Rota a la derecha para TX, prim. el
BTFSC STATUS,C ;bit menos sig. ¨Es un "1" o un "0"?
BSF PORTB,0 ;Es un 1
BTFSS STATUS,C
BCF PORTB,0 ;Es un 0
DECFSZ ldato ;Ultimo bit?
GOTO Bitx
CALL RetaTx
BSF PORTB,0 ;Bit de STOP
CALL RetaTx
GOTO Ndato
;Retardo de TX de 104 ug. para 9600 baudios
RetaTx MOVLW d'31' ;(1) Para lograr 104 ug, se repite el
MOVWF cont1 ;(1) bucle (104-4-2)/3 veces
L2 DECFSZ cont1 ;(1) VA con 30,31 y 32!
GOTO L2 ;(2)
RETURN ;(2)
;Retardo para leer aprox. en la mitad de cada bit, despues del bit START
RetaRx MOVLW d'43' ;43 = 31 + 12
MOVWF cont1
L3 DECFSZ cont1
GOTO L3
RETURN
END
En realidad, está bien, SEGURO, porque a veces funciona y otras veces NO
No me lo explico, he probado el ENVIAR y el RECIBIR aparte.. y del PIC al PC (transmite) si me funciona siempre, en cambio desde el PC al PIC (no siemrpe)... porq? Hau alguna explicación?
Felicidades por el foro, nunca me habia dado por mirar en foros, pero se aprende, solucionas tus dudas y ayudas a los demas.
Muchas gracias de antemano.
Salu2.
Tweet
Huguen_aus_Tirol
Miembro MUY activo
Mensajes: 318
Re: Rs-232
«
Respuesta #1 en:
Miércoles 4 de Enero de 2006, 21:48 »
0
Hola! Estuve comparando tu programa con una rutina de recepción que utilizé con un 16F84 y me funcionó.
Código: Text
;********** Rutina de lectura ****************
Ndato BTFSC PORTB,1 ;Espera Bit START?
GOTO Ndato
MOVLW 8 ;Datos de 8 bits
MOVWF ldato
CLRF dRx ;Borra registro de dato entrante
CALL RetaRx ;Retardo para fijar lectura en punto medio
;de cada bit, despues de detectar el START
Birx BCF STATUS,C ;Borra carry
RRF dRx ;Por defecto el primer bit a "0"
BTFSC PORTB,1 ;Es un "0"?
BSF dRx,7 ;Es un 1
CALL RetaTx ;Retardo de 104 us. => 9600 baudios
DECFSZ ldato ;Ultimo bit?
GOTO Birx
MOVF dRx,w ;Copia registro del dato entrante en W y
MOVWF dTx ;lo transfiere al registro de salida
Está casi todo igual, salvo... A continuación dejo el código de esta rutina que utilizé; fijate, y con unas pocas modificaciones debería funcionar
Código: Text
;-------------------------------------------------------------------------------
; RECEPCION DE UN BYTE
; El byte se detecta por interrupcion, es decir el bit de start.
;
RECEIVE_232
BTFSC RXBF ;
GOTO NO_232 ;
BCF GIE ;inhabilito todas las interrupciones
CLRF RXBUF ;borro buffer de recepcion
MOVLW .8 ;son 8 bits
MOVWF CNT232 ;a contar
CALL HALF_BIT;espero medio bit
CALL ONE_BIT ;y espero un bit mas
LOOP_232RX
BCF C ;supongo que llega un 0
BTFSC RX232 ;veo si es asi
BSF C ;no, llego un 1
RRF RXBUF,1 ;acomodo bit en el buffer
CALL ONE_BIT ;y espero un tiempo de bit
DECFSZ CNT232,1;decremento contador de bits
GOTO LOOP_232RX;si no llegaron 8 busco siguiente
BSF RXBF ;indico buffer lleno
NO_232
BCF INTF ;
BSF INTE ;habilito interrupcion de puerto serie
BSF GIE ;habilito interrupciones en general
GOTO IVEND ;y salgo.
Yo utilizé la línea RB0, entonces el bit de start me generaba interrupción y activaba así la recepción. Esta bien leer el bit a la mitad
Prueba y nos cuentas!
Saludos
crbrs
Nuevo Miembro
Mensajes: 18
Re: Rs-232
«
Respuesta #2 en:
Jueves 5 de Enero de 2006, 00:27 »
0
Hola!
Huguen_aus_Tirol, lo q m quieres decir es que lo que falla es el bit d start q tngo q leerlo a la mitad? No se... pero eso influye en q aveces si, y otras veces no? Bueno.. a ver si m explico.. no es que resetee, y m funcione y q no resetee y no funcione.. sino.. pruebo.... me da mal (ya reseteee, espere.. haga lo que haga)... a las 2 horas vuelvo y si funciona.. SIN TOCARLO. jajajaj. Es así.
Pero weno, probaré lo que me dices, a ver. Muchas gracias. Salu2.
Huguen_aus_Tirol
Miembro MUY activo
Mensajes: 318
Re: Rs-232
«
Respuesta #3 en:
Jueves 5 de Enero de 2006, 01:04 »
0
Hola!
A ver si me explico:
* Pongo a 1 el bit de carry
* Veo si el pin de entrada es 1
* Si es cero pongo el bit de carry a cero
* roto a la derecha una posición el registro de entrada
* Espero el tiempo de un bit (ya está desfazado en medio tiempo de bit)
* Repito hasta completar 8 veces
En tu rutina es algo distinto; te dejo el trabajito de verlo. Con gusto te lo diría exactamente ahora, pero en esos casos pasa el tiempo y uno se olvida... Cuando nos rompemos el coco no nos olvidamos facilmente
Creo que el hard está bien. El MAX232 (ó ICL o alguna de sus variantes) solo tiene 4 capacitores. Si estan bien conectados no hay problema; por otro lado, si transmites bien por RS232, deberías recibir bien (en lo que respecta al RS232). Salvo que esté mal la conexión de alguno de los pines, cosa que no creo
Saludos
Kain589
Miembro activo
Mensajes: 53
Re: Rs-232
«
Respuesta #4 en:
Jueves 5 de Enero de 2006, 01:36 »
0
Esto se aleja un poco del mensaje, pero creo que ya es mucho mas facil y seguro ademas de standar usar pic que tiene habilitado un modulo para la comunicacion serie. Unos pics muy similares podrian ser el 16f828a o 16f848a, que poseen el mismo numero de patillas y cuyo precio es igual y en algunos caso menos, ademas de poseer dos puertos de 8 bits, y 3 temporizadores
Huguen_aus_Tirol
Miembro MUY activo
Mensajes: 318
Re: Rs-232
«
Respuesta #5 en:
Jueves 5 de Enero de 2006, 02:01 »
0
Hola Kain589! Estoy de acuerdo en lo que dices! Personalmente, creo que ya el 16F84 está jubilado, y con todos los honores
Actualmente consigues micros con más periféricos y mucho más baratos... Pero la idea de crbrs no está mal; aparentemente está experimentando y eso es bueno. Seguramente, después buscará la solución con algún micro que tenga el módulo incorporado; pero entonces la experiencia ya la ha vivido... Y posiblemete le sirva para solucionar algún otro tipo de problema
De cualquier manera, estoy muy de acuerdo contigo; y el 16F84 ya está totalmente descartado de mis proyectos: A pesar de ello, sigue siendo el "maestro" de mi experiencia con los PIC´s
Un abrazo, y saludos
Kain589
Miembro activo
Mensajes: 53
Re: Rs-232
«
Respuesta #6 en:
Jueves 5 de Enero de 2006, 11:34 »
0
Entiendo lo que dices, y es bueno experimentar y seguir aprendiendo sobre este gran mundo de los pic's, ademas me parece una buena salida en el caso de no disponer de ningun pic con modulo usart.
Para casos que requieran seguridad y velocidad en el envio, estos modulos permiten al micro hacer otras tareas durante la comunicacion mientras tambien se encargan de la recepcion, transmision y de verificar si existieron errores,todo ellos solitos lo que si se hace por software nunca se conseguira al 100% o complicara demasiado y limitara el software.
El F84 ha sido y será mitico, ese cacharrito sigue dando guerra y creo que casi todos hemos pasado por el para el aprendizaje; y en casos en lo que no se requieran conversores ni comunicaciones o muy poca comunicacion, sigue siendo un gran pic. Yo he empezado hace poco en esto de los pic's y empece con el, y ahora estoy peleandome con el 16F876 que presenta nuevos modulos y tipos de comunicaciones
Huguen_aus_Tirol
Miembro MUY activo
Mensajes: 318
Re: Rs-232
«
Respuesta #7 en:
Jueves 5 de Enero de 2006, 12:52 »
0
Hola!
Y pensar que yo empezé en el mundo de los PIC´s con el 16C54
Tengo algo de experiencia con el 16F876, asi que si puedo ayudarte en algo, con gusto!
Saludos!
Kain589
Miembro activo
Mensajes: 53
Re: Rs-232
«
Respuesta #8 en:
Jueves 5 de Enero de 2006, 18:05 »
0
Pues muchas gracias, ahora estoy con el ccp1 y con el timer1, el timer creo que se usarlo pero se me presenta un problema al recargarlo, si me tienes algo de informacion te lo agradeceria. Tambien si lo creeis conveniente se podia abrir un hilo sobre el 16f876 con ejemplos de sus nuevas funciones con respecto al f84, yo tengo rutinas para usar el adc y la usart
Huguen_aus_Tirol
Miembro MUY activo
Mensajes: 318
Re: Rs-232
«
Respuesta #9 en:
Jueves 5 de Enero de 2006, 21:28 »
0
Hola!
Cuentanos más de tu problema con el timer 1, asi te damos una mano. De todas formas, te adelanto que el timer 1 posee dos registros, es decir que hay que tomar algunas precauciones al leerlos. Puedes encontrar buena información en el Data Sheet (sección 6.4.1). Antes de leerlos podrías poner el timer en stop (T1CON,0), y luego no olvides volver a arrancarlo! Cuéntanos más...
Saludos!
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación Específica
»
Microcontroladores
(Moderador:
© Jonathan ©
) »
Rs-232