Programación Específica > Microcontroladores
Rs-232
crbrs:
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 ORGdTx RES 1 ;Registro del dato a transmitirdRx RES 1 ;Registro del dato entrantecont1 RES 1 ;Variables aux. para retardoldato RES 1 ;Regist. aux. para contar los bits; ORG 0 ;Vector RESETINI 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 STARTBirx 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 startBitx 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 STARTRetaRx 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 :blink: :blink: 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.
Huguen_aus_Tirol:
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 STARTBirx 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 :rolleyes:
--- 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 masLOOP_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 llenoNO_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:
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:
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 :P
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 :hola:
Kain589:
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
Navegación
[#] Página Siguiente
Ir a la versión completa