Programación Específica > Microcontroladores

 Rs-232

(1/2) > >>

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            &#59;Registro del dato a transmitirdRx    RES    1            &#59;Registro del dato entrantecont1  RES    1            &#59;Variables aux. para retardoldato  RES    1            &#59;Regist. aux. para contar los bits;        ORG    0            &#59;Vector RESETINI    BSF    STATUS,RP0   &#59;Selecc. banco 1       BCF    TRISB,0      &#59;PB.0 como salida Tx y PB.1 = Rx       BSF    TRISB,1       BCF    STATUS,RP0   &#59;Selecciona banco 0 ;**********  Rutina de lectura   ****************Ndato  BTFSC  PORTB,1      &#59;Espera Bit START?       GOTO   Ndato       MOVLW  8            &#59;Datos de 8 bits       MOVWF  ldato       CLRF   dRx          &#59;Borra registro de dato entrante       CALL   RetaRx       &#59;Retardo para fijar lectura en punto medio                           &#59;de cada bit, despues de detectar el STARTBirx   BCF    STATUS,C     &#59;Borra carry       RRF    dRx          &#59;Por defecto el primer bit a "0"       BTFSC  PORTB,1      &#59;Es un "0"?       BSF    dRx,7        &#59;Es un 1­       CALL   RetaTx       &#59;Retardo de 104 us. => 9600 baudios       DECFSZ ldato        &#59;Ultimo bit?       GOTO   Birx       MOVF   dRx,w        &#59;Copia registro del dato entrante en W y       MOVWF  dTx          &#59;lo transfiere al registro de salida ;***********Rutina de transmisi¢n *********+       MOVLW  8       MOVWF  ldato        &#59;Datos de 8 bits       BCF    PORTB,0      &#59;Saca bit de startBitx   CALL   RetaTx       &#59;Retardo para generar 9600 baudios       RRF    dTx          &#59;Rota a la derecha para TX, prim. el       BTFSC  STATUS,C     &#59;bit menos sig. ¨Es un "1" o un "0"?       BSF    PORTB,0      &#59;Es un 1­       BTFSS  STATUS,C       BCF    PORTB,0      &#59;Es un 0­       DECFSZ ldato        &#59;Ultimo bit?       GOTO   Bitx       CALL   RetaTx       BSF    PORTB,0      &#59;Bit de STOP       CALL   RetaTx       GOTO   Ndato ;Retardo de TX de 104 ug. para 9600 baudios RetaTx MOVLW  d'31'        &#59;(1) Para lograr 104 ug, se repite el       MOVWF  cont1        &#59;(1) bucle (104-4-2)/3 veces L2     DECFSZ cont1        &#59;(1)  ­VA con 30,31 y 32!       GOTO   L2           &#59;(2)        RETURN              &#59;(2) ;Retardo para leer aprox. en la mitad de cada bit, despues del bit STARTRetaRx MOVLW  d'43'        &#59;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     &#59;Espera Bit START?      GOTO   Ndato      MOVLW  8           &#59;Datos de 8 bits      MOVWF  ldato      CLRF   dRx         &#59;Borra registro de dato entrante      CALL   RetaRx      &#59;Retardo para fijar lectura en punto medio                         &#59;de cada bit, despues de detectar el STARTBirx   BCF    STATUS,C    &#59;Borra carry      RRF    dRx         &#59;Por defecto el primer bit a "0"      BTFSC  PORTB,1     &#59;Es un "0"?      BSF    dRx,7       &#59;Es un 1­      CALL   RetaTx      &#59;Retardo de 104 us. => 9600 baudios      DECFSZ ldato       &#59;Ultimo bit?      GOTO   Birx      MOVF   dRx,w       &#59;Copia registro del dato entrante en W y      MOVWF  dTx         &#59;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  &#59;  GOTO  NO_232  &#59;  BCF  GIE  &#59;inhabilito todas las interrupciones  CLRF  RXBUF  &#59;borro buffer de recepcion  MOVLW  .8  &#59;son 8 bits  MOVWF  CNT232  &#59;a contar  CALL  HALF_BIT&#59;espero medio bit  CALL  ONE_BIT  &#59;y espero un bit masLOOP_232RX  BCF  C  &#59;supongo que llega un 0  BTFSC  RX232  &#59;veo si es asi  BSF  C  &#59;no, llego un 1  RRF  RXBUF,1  &#59;acomodo bit en el buffer  CALL  ONE_BIT  &#59;y espero un tiempo de bit  DECFSZ  CNT232,1&#59;decremento contador de bits  GOTO  LOOP_232RX&#59;si no llegaron 8 busco siguiente  BSF  RXBF  &#59;indico buffer llenoNO_232  BCF  INTF  &#59;  BSF  INTE  &#59;habilito interrupcion de puerto serie  BSF  GIE  &#59;habilito interrupciones en general  GOTO  IVEND  &#59;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

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa