Autor Tema: AYUDA PIC16F877 Comunicación RS232 Con Multiples Puertos y Velocidades  (Leído 4331 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado zascandil

  • PIC10
  • *
  • Mensajes: 2
Hola ke tal  !!!!!
Estoy desarrollando una tarjeta de comunicaciones que controla la recogida de datos de varios dispositivos
a traves del protocolo RS232 y tambien se conecta a un modem GSM para enviar los datos a un PC para
subirlos a Internete.
Cada uno posee una velocidad distinta (56.700 baudios/ 3 de 9.600 baudios y / 2 de 2400 baudios).

Mi problema es que estoy desarrollando el codigo en embalsamador y al tirar solo de la USART que viene
integrada en el Hardware del Microchip, pues solo puedo emplear las lineas RC6 Y RC7 del Puerto C. Y de
esas dos patillas posteriormente distribuir la señal mediante buffers 74LS126 a cada uno de los dispositivos.
El engorro es que la placa de circuito impreso queda muy mal y con unas cuantas vias. Por lo que desearía
saber si existe o disponeis de algun programa que haga las mismas funciones que el comando en PicC que
permite definir la comunicación con la patilla que se quiera.

             #use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7)

Por lo que tengo entendido en este comando se puede meter el pin que se desee como RX y TX cosa que me
parece muy sospechosa y rara. Ya que en embalsamador esto no puede hacerse de ninguna de las maneras
a no ser con un engorroso programa via software en vez de aprovechando la USART interna del propio chip.
Me gustaría saber ya que no tengo el software para decompilar un hex hecho con este comando de c, si existe
o conoceis de algun programa sencillo en ensamblador que me permita elegir la patilla por la que deseo mandar
y recibir datos via RS232.

Mutxas Gracias.



Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: AYUDA PIC16F877 Comunicación RS232 Con Multiples Puertos y Velocidades
« Respuesta #1 en: 13 de Junio de 2006, 15:30:51 »
Amigo Zascandil:

Si puede hacerse en C puede hacerse en ASM y seguramente mejor, mas rápido, o mas eficiente o con mayor economía de medios.

El problema es saber cómo hacerlo. Yo se hacerlo en C ...

En el Libro Gordo del C (el Manual del CCS C) aparece el siguiente significativo ejemplo (Página 89):

#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stream=HOSTPC)
#use rs232(baud=1200,xmit=pin_b1,rcv=pin_b0,stream=GPS)
#use rs232(baud=9600,xmit=pin_b3,stream=DEBUG)
...
 while(TRUE) {
   c=fgetc(GPS);
   fputc(c,HOSTPC);
   if(c==13)
     fprintf(DEBUG,"Got a CR\r\n");
  }

Como puedes ver define tres "canales" RS232 que usa de forma indistinta. El compilador genera el ASM/HEX correspondiente de forma que: Si la definición del "canal" es USART compatible solo coloca el código correspondiente para manejarla, si no lo és colocará el código necesario y suficiente para simularla por software.

Las tres deben funcionar correctamente pero las simuladas ocuparán mas, o mucho  mas, espacio y recursos del micro que la real de la USART. Esto tambien conlleva el hecho de que el programa va a resultar mucho mas grande, con lo que puede ser posible que no quepa realmente en la disponible en el micro.

Además sospecho (no lo tengo por absolutamente cierto) que las interrupciones de recepción y transmisión solo funcionarán con el "canal" USART compatible.

"En principio" es posible, lo que habría que ver es si en realidad tambien lo es.

Un saludo.
« Última modificación: 13 de Junio de 2006, 15:37:11 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado JavisusII

  • PIC12
  • **
  • Mensajes: 79
Re: AYUDA PIC16F877 Comunicación RS232 Con Multiples Puertos y Velocidades
« Respuesta #2 en: 13 de Junio de 2006, 15:43:18 »
Buenas zascandil,

Je je , bueno , los de Microchip no son tan tontos, te dan un puerto serie, al cual tu aplicas la normativa
rs232, pero también existe una configuración multipunto: rs485.

No quiero ser aguafiestas pero tu proyecto no es muy usual.

De todas formas ánimo.
Xavi (Barcelona)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: AYUDA PIC16F877 Comunicación RS232 Con Multiples Puertos y Velocidades
« Respuesta #3 en: 13 de Junio de 2006, 15:56:38 »
Buenoooooo ....

He escrito el siguiente programa en CCS C para el 16F876A (muy parecido al 18F877) :

Código: C
  1. #include <16f876a.h>                    // Selecciona el PIC
  2. #fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT  // Opciones de configuración
  3. #use delay(clock=4000000)               // Velocidad del Cristal : 4 Mhz
  4. #use standard_io(b)
  5.  
  6. #use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stream=HOSTPC)
  7. #use rs232(baud=1200,xmit=pin_b1,rcv=pin_b0,stream=GPS)
  8. #use rs232(baud=9600,xmit=pin_b3,stream=DEBUG)
  9.  
  10. char c=' ';
  11.  
  12. ///PROGRAMA
  13.  
  14. void main(void)
  15. {
  16.    disable_interrupts(GLOBAL);        // todas las interrupciones desactivadas
  17.  
  18.    while(TRUE) {
  19.       c=fgetc(GPS);
  20.       fputc(c,HOSTPC);
  21.       if(c==13)
  22.       fprintf(DEBUG,"Got a CR\r\n");
  23.    }
  24. }

Lo he compilado y me ha generado el siguiente ASM:

CCS PCM C Compiler, Version 3.242, 28193               13-jun-06 20:54

               Filename: C:\PICC\C_Redraven\16F876A\_Multi232\_multi232.lst

               ROM used: 169 words (2%)
                         Largest free fragment is 2048
               RAM used: 7 (4%) at main() level
                         8 (5%) worst case
               Stack:    1 locations

*
Código: ASM
  1. 0000:  MOVLW  00
  2. 0001:  MOVWF  0A
  3. 0002:  GOTO   070
  4. 0003:  NOP
  5. .................... #include <16f876a.h>                    // Selecciona el PIC
  6. .................... //////// Standard Header file for the PIC16F876A device ////////////////
  7. .................... #device PIC16F876A
  8. .................... #list
  9. ....................
  10. .................... #fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT  // Opciones de configuración
  11. .................... #use delay(clock=4000000)               // Velocidad del Cristal : 4 Mhz
  12. ....................
  13. .................... #use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stream=HOSTPC)
  14. .................... #use rs232(baud=1200,xmit=pin_b1,rcv=pin_b0,stream=GPS)
  15. 0013:  MOVF   04,W
  16. 0014:  MOVWF  78
  17. 0015:  MOVLW  08
  18. 0016:  MOVWF  77
  19. 0017:  BSF    03.5
  20. 0018:  BSF    06.0
  21. 0019:  BCF    03.5
  22. 001A:  BTFSS  06.0
  23. 001B:  GOTO   01E
  24. 001C:  BSF    03.5
  25. 001D:  GOTO   019
  26. 001E:  CLRF   21
  27. 001F:  BSF    77.7
  28. 0020:  GOTO   031
  29. 0021:  BCF    77.7
  30. 0022:  GOTO   031
  31. 0023:  BCF    03.0
  32. 0024:  BTFSC  06.0
  33. 0025:  BSF    03.0
  34. 0026:  RRF    21,F
  35. 0027:  BSF    77.6
  36. 0028:  GOTO   031
  37. 0029:  BCF    77.6
  38. 002A:  DECFSZ 77,F
  39. 002B:  GOTO   023
  40. 002C:  MOVF   78,W
  41. 002D:  MOVWF  04
  42. 002E:  MOVF   21,W
  43. 002F:  MOVWF  78
  44. 0030:  GOTO   046
  45. 0031:  MOVLW  01
  46. 0032:  MOVWF  04
  47. 0033:  MOVLW  00
  48. 0034:  BTFSC  77.7
  49. 0035:  MOVLW  55
  50. 0036:  MOVWF  78
  51. 0037:  DECFSZ 78,F
  52. 0038:  GOTO   037
  53. 0039:  DECFSZ 04,F
  54. 003A:  GOTO   033
  55. 003B:  MOVLW  0D
  56. 003C:  BTFSC  77.7
  57. 003D:  MOVLW  03
  58. 003E:  MOVWF  78
  59. 003F:  DECFSZ 78,F
  60. 0040:  GOTO   03F
  61. 0041:  BTFSC  77.7
  62. 0042:  GOTO   021
  63. 0043:  BTFSC  77.6
  64. 0044:  GOTO   029
  65. 0045:  GOTO   023
  66. 0046:  BCF    0A.3
  67. 0047:  BCF    0A.4
  68. 0048:  GOTO   092 (RETURN)
  69. .................... #use rs232(baud=9600,xmit=pin_b3,stream=DEBUG)
  70. 0049:  BSF    03.5
  71. 004A:  BCF    06.3
  72. 004B:  BCF    03.5
  73. 004C:  BCF    06.3
  74. 004D:  MOVLW  08
  75. 004E:  MOVWF  78
  76. 004F:  NOP
  77. 0050:  NOP
  78. 0051:  NOP
  79. 0052:  BSF    78.7
  80. 0053:  GOTO   063
  81. 0054:  BCF    78.7
  82. 0055:  RRF    22,F
  83. 0056:  BTFSC  03.0
  84. 0057:  BSF    06.3
  85. 0058:  BTFSS  03.0
  86. 0059:  BCF    06.3
  87. 005A:  BSF    78.6
  88. 005B:  GOTO   063
  89. 005C:  BCF    78.6
  90. 005D:  DECFSZ 78,F
  91. 005E:  GOTO   055
  92. 005F:  NOP
  93. 0060:  NOP
  94. 0061:  NOP
  95. 0062:  BSF    06.3
  96. 0063:  MOVLW  1C
  97. 0064:  MOVWF  04
  98. 0065:  DECFSZ 04,F
  99. 0066:  GOTO   065
  100. 0067:  NOP
  101. 0068:  NOP
  102. 0069:  BTFSC  78.7
  103. 006A:  GOTO   054
  104. 006B:  BTFSC  78.6
  105. 006C:  GOTO   05C
  106. 006D:  BCF    0A.3
  107. 006E:  BCF    0A.4
  108. 006F:  GOTO   0A3 (RETURN)
  109. ....................
  110. .................... char c=' ';
  111. *
  112. 008A:  MOVLW  20
  113. 008B:  BCF    03.5
  114. 008C:  MOVWF  20
  115. ....................
  116. .................... ///PROGRAMA
  117. ....................
  118. .................... void main(void)
  119. .................... {
  120. *
  121. 0070:  CLRF   04
  122. 0071:  MOVLW  1F
  123. 0072:  ANDWF  03,F
  124. 0073:  MOVLW  19
  125. 0074:  BSF    03.5
  126. 0075:  MOVWF  19
  127. 0076:  MOVLW  26
  128. 0077:  MOVWF  18
  129. 0078:  MOVLW  90
  130. 0079:  BCF    03.5
  131. 007A:  MOVWF  18
  132. 007B:  BSF    03.5
  133. 007C:  BCF    06.1
  134. 007D:  BCF    03.5
  135. 007E:  BSF    06.1
  136. 007F:  BSF    03.5
  137. 0080:  BCF    06.3
  138. 0081:  BCF    03.5
  139. 0082:  BSF    06.3
  140. 0083:  BSF    03.5
  141. 0084:  BSF    1F.0
  142. 0085:  BSF    1F.1
  143. 0086:  BSF    1F.2
  144. 0087:  BCF    1F.3
  145. 0088:  MOVLW  07
  146. 0089:  MOVWF  1C
  147. ....................
  148. ....................    disable_interrupts(GLOBAL);           // todas las interrupciones desactivadas
  149. *
  150. 008D:  BCF    0B.6
  151. 008E:  BCF    0B.7
  152. 008F:  BTFSC  0B.7
  153. 0090:  GOTO   08E
  154. ....................
  155. ....................    while(TRUE) {
  156. ....................       c=fgetc(GPS);
  157. 0091:  GOTO   013
  158. 0092:  MOVF   78,W
  159. 0093:  MOVWF  20
  160. ....................       fputc(c,HOSTPC);
  161. 0094:  MOVF   20,W
  162. 0095:  BTFSS  0C.4
  163. 0096:  GOTO   095
  164. 0097:  MOVWF  19
  165. ....................       if(c==13)
  166. 0098:  MOVF   20,W
  167. 0099:  SUBLW  0D
  168. 009A:  BTFSS  03.2
  169. 009B:  GOTO   0A7
  170. ....................       fprintf(DEBUG,"Got a CR\r\n");
  171. 009C:  CLRF   21
  172. 009D:  MOVF   21,W
  173. 009E:  CALL   004
  174. 009F:  INCF   21,F
  175. 00A0:  MOVWF  77
  176. 00A1:  MOVWF  22
  177. 00A2:  GOTO   049
  178. 00A3:  MOVLW  0A
  179. 00A4:  SUBWF  21,W
  180. 00A5:  BTFSS  03.2
  181. 00A6:  GOTO   09D
  182. ....................    }
  183. 00A7:  GOTO   091
  184. .................... }
  185. 00A8:  SLEEP

Dale un repaso por si te sirve.

Un saludo.

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado zascandil

  • PIC10
  • *
  • Mensajes: 2
Re: AYUDA PIC16F877 Comunicación RS232 Con Multiples Puertos y Velocidades
« Respuesta #4 en: 13 de Junio de 2006, 20:34:29 »
Agradezco mucho tanto la pronta respuesta, como la calidad de la misma.

Muchas gracias por todas las molestias tomadas especialmente a RedPic. Estudiaré el codigo con el programa que veo que has usado. CCS PCM C Compiler. Me prepararé lo que necesito en C y miraré como lo implementa en asm. Respecto a lo que comentaba Javisus precisamente tambien trabajo dentro de este sistema con una red modbus bajo RS485 con la que me conecto a varios inversores solares para recoger sus datos. El problema es que trabajo con marcas y dispositivos muy distintos y que no comparten el mismo estandar de comunicaciones. Empleo 4 MAX233CPP y un MAX 485.
Creo que con esta ayuda ya puedo arreglar bastante. Y veo que no se gasta mucho codigo.

Un saludo y muchas gracias por todo.