• Sábado 21 de Diciembre de 2024, 19:51

Autor Tema:  Rs-232  (Leído 3003 veces)

crbrs

  • Nuevo Miembro
  • *
  • Mensajes: 18
    • Ver Perfil
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
  1.  
  2. ;Habilita un Puerto Serie con el protocolo:9600N81
  3. ;PB.0 como salida (Tx) y PB.1 como entrada (Rx)
  4. ;Half Duplex. El programa hace la funci¢n "ECO"
  5. ;Todo caracter recibido es devuelto autom ticamente.
  6. ;** OJO ** caracter por caracter, si se transmite m s de un
  7. ;caracter a la vez, se perder  el que coincida con la transm.
  8.  
  9.        LIST   P=PIC16C84, R=HEX; XTAL=4MHz
  10.        INCLUDE  pic16f84.inc
  11.  
  12. ;Variables en RAM
  13.        ORG    0C
  14. ;La directiva "RES", reserva posiciones de memoria a partir del ORG
  15. dTx    RES    1            &#59;Registro del dato a transmitir
  16. dRx    RES    1            &#59;Registro del dato entrante
  17. cont1  RES    1            &#59;Variables aux. para retardo
  18. ldato  RES    1            &#59;Regist. aux. para contar los bits
  19. ;
  20.  
  21.        ORG    0            &#59;Vector RESET
  22. INI    BSF    STATUS,RP0   &#59;Selecc. banco 1
  23.        BCF    TRISB,0      &#59;PB.0 como salida Tx y PB.1 = Rx
  24.        BSF    TRISB,1
  25.        BCF    STATUS,RP0   &#59;Selecciona banco 0
  26.  
  27. ;**********  Rutina de lectura   ****************
  28. Ndato  BTFSC  PORTB,1      &#59;Espera Bit START?
  29.        GOTO   Ndato
  30.        MOVLW  8            &#59;Datos de 8 bits
  31.        MOVWF  ldato
  32.        CLRF   dRx          &#59;Borra registro de dato entrante
  33.        CALL   RetaRx       &#59;Retardo para fijar lectura en punto medio
  34.                            &#59;de cada bit, despues de detectar el START
  35. Birx   BCF    STATUS,C     &#59;Borra carry
  36.        RRF    dRx          &#59;Por defecto el primer bit a "0"
  37.        BTFSC  PORTB,1      &#59;Es un "0"?
  38.        BSF    dRx,7        &#59;Es un 1­
  39.        CALL   RetaTx       &#59;Retardo de 104 us. => 9600 baudios
  40.        DECFSZ ldato        &#59;Ultimo bit?
  41.        GOTO   Birx
  42.        MOVF   dRx,w        &#59;Copia registro del dato entrante en W y
  43.        MOVWF  dTx          &#59;lo transfiere al registro de salida
  44.  
  45. ;***********Rutina de transmisi¢n *********+
  46.        MOVLW  8
  47.        MOVWF  ldato        &#59;Datos de 8 bits
  48.        BCF    PORTB,0      &#59;Saca bit de start
  49. Bitx   CALL   RetaTx       &#59;Retardo para generar 9600 baudios
  50.        RRF    dTx          &#59;Rota a la derecha para TX, prim. el
  51.        BTFSC  STATUS,C     &#59;bit menos sig. ¨Es un "1" o un "0"?
  52.        BSF    PORTB,0      &#59;Es un 1­
  53.        BTFSS  STATUS,C
  54.        BCF    PORTB,0      &#59;Es un 0­
  55.        DECFSZ ldato        &#59;Ultimo bit?
  56.        GOTO   Bitx
  57.        CALL   RetaTx
  58.        BSF    PORTB,0      &#59;Bit de STOP
  59.        CALL   RetaTx
  60.        GOTO   Ndato
  61.  
  62. ;Retardo de TX de 104 ug. para 9600 baudios
  63. RetaTx MOVLW  d'31'        &#59;(1) Para lograr 104 ug, se repite el
  64.        MOVWF  cont1        &#59;(1) bucle (104-4-2)/3 veces
  65. L2     DECFSZ cont1        &#59;(1)  ­VA con 30,31 y 32!
  66.        GOTO   L2           &#59;(2)
  67.        RETURN              &#59;(2)
  68.  
  69. ;Retardo para leer aprox. en la mitad de cada bit, despues del bit START
  70. RetaRx MOVLW  d'43'        &#59;43 = 31 + 12
  71.        MOVWF  cont1      
  72. L3     DECFSZ cont1        
  73.        GOTO   L3          
  74.        RETURN              
  75.  
  76.        END
  77.  
  78.  

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

  • Miembro MUY activo
  • ***
  • Mensajes: 318
    • Ver Perfil
    • http://www.erhard-automation.co.cc
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
  1. ;**********  Rutina de lectura   ****************
  2. Ndato  BTFSC  PORTB,1     &#59;Espera Bit START?
  3.       GOTO   Ndato
  4.       MOVLW  8           &#59;Datos de 8 bits
  5.       MOVWF  ldato
  6.       CLRF   dRx         &#59;Borra registro de dato entrante
  7.       CALL   RetaRx      &#59;Retardo para fijar lectura en punto medio
  8.                          &#59;de cada bit, despues de detectar el START
  9. Birx   BCF    STATUS,C    &#59;Borra carry
  10.       RRF    dRx         &#59;Por defecto el primer bit a "0"
  11.       BTFSC  PORTB,1     &#59;Es un "0"?
  12.       BSF    dRx,7       &#59;Es un 1­
  13.       CALL   RetaTx      &#59;Retardo de 104 us. => 9600 baudios
  14.       DECFSZ ldato       &#59;Ultimo bit?
  15.       GOTO   Birx
  16.       MOVF   dRx,w       &#59;Copia registro del dato entrante en W y
  17.       MOVWF  dTx         &#59;lo transfiere al registro de salida
  18.  
  19.  
  20.  

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
  1. ;-------------------------------------------------------------------------------
  2. ;  RECEPCION DE UN BYTE
  3. ; El byte se detecta por interrupcion, es decir el bit de start.
  4. ;
  5. RECEIVE_232
  6.   BTFSC  RXBF  &#59;
  7.   GOTO  NO_232  &#59;
  8.   BCF  GIE  &#59;inhabilito todas las interrupciones
  9.   CLRF  RXBUF  &#59;borro buffer de recepcion
  10.   MOVLW  .8  &#59;son 8 bits
  11.   MOVWF  CNT232  &#59;a contar
  12.   CALL  HALF_BIT&#59;espero medio bit
  13.   CALL  ONE_BIT  &#59;y espero un bit mas
  14. LOOP_232RX
  15.   BCF  C  &#59;supongo que llega un 0
  16.   BTFSC  RX232  &#59;veo si es asi
  17.   BSF  C  &#59;no, llego un 1
  18.   RRF  RXBUF,1  &#59;acomodo bit en el buffer
  19.   CALL  ONE_BIT  &#59;y espero un tiempo de bit
  20.   DECFSZ  CNT232,1&#59;decremento contador de bits
  21.   GOTO  LOOP_232RX&#59;si no llegaron 8 busco siguiente
  22.   BSF  RXBF  &#59;indico buffer lleno
  23. NO_232
  24.   BCF  INTF  &#59;
  25.   BSF  INTE  &#59;habilito interrupcion de puerto serie
  26.   BSF  GIE  &#59;habilito interrupciones en general
  27.   GOTO  IVEND  &#59;y salgo.
  28.  
  29.  

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
    • Ver Perfil
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
    • Ver Perfil
    • http://www.erhard-automation.co.cc
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 :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

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
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
    • Ver Perfil
    • http://www.erhard-automation.co.cc
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 :hola:

Kain589

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
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
    • Ver Perfil
    • http://www.erhard-automation.co.cc
Re: Rs-232
« Respuesta #7 en: Jueves 5 de Enero de 2006, 12:52 »
0
Hola! :hola:
Y pensar que yo empezé en el mundo de los PIC´s con el 16C54 :D
Tengo algo de experiencia con el 16F876, asi que si puedo ayudarte en algo, con gusto!

Saludos!

Kain589

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
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
    • Ver Perfil
    • http://www.erhard-automation.co.cc
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! :hola: