Autor Tema: RS232 en hitech  (Leído 2241 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
RS232 en hitech
« en: 14 de Marzo de 2012, 19:40:05 »
Ando liado con el RS232 y un PIC16F628A, resulta que el ejemplo de los adjuntos en un PIC16F84A funciona, pero como seguramente necesite más memoria he intentado pasarlo a un 16f628a, y en este no funciona. He desactivado el comparador, la vref, las interrupciones y el puerto serie por hardware (con mis funciones lo hago por software).

Por más vueltas que le doy, no consigo solucionarlo. La libreria serial.c es la de un ejemplo del hitech.

Espero una mano, saludos.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: RS232 en hitech
« Respuesta #1 en: 14 de Marzo de 2012, 20:46:47 »
  Hola, te paso una rutina que hice y la he probado comunicando entre sí dos 16f628A configurados con oscilador interno.

Código: C
  1. /**************************************************************************
  2. *    Libreria para emular puerto serie asincronico (UART) para HiTech     *
  3. ***************************************************************************
  4.  
  5. ***************************************************************************
  6. * Con clock de 4MHz la velocidad maxima de transmision es de 38400 Baud   *
  7. * Con clock de 8MHz en adelante la velocidad minima de transmision es de  *
  8. * 2400 Baud                                                               *
  9. ***************************************************************************
  10.  
  11. ***************************************************************************
  12. *                                                                         *
  13. * Antes de incluir este archivo en nuestro programa hay que definir       *
  14. * algunos parametros. Estos son                                           *
  15. *                                                                         *
  16. * PIC_CLK   (es necesario para los delay usados internamente)             *    
  17. *                                                                         *
  18. * TxPin     (puerto de salida)                                            *
  19. * RxPin     (puerto de entrada)                                           *
  20. * BaudRate  (velocidad de transferencia)                                  *
  21. *                                                                         *
  22. ***************************************************************************
  23.  
  24. ***************************************************************************
  25. *                                                                         *
  26. * Las rutinas de delay se encuentran en el archivo "delayhd.h"            *
  27. * El nombre original del archivo es:                                      *
  28. * "delay_alternative_enchanced_precision.h" y esta incluido dentro de     *
  29. * "PIC_Hi-Tech_C_delay_and_timeout_routines_for_PIC16xxxx_v7-1.zip"       *
  30. * Bajado de www.microchipc.com                                            *
  31. *                                                                         *
  32. * Hay que tener este archivo dentro de la carpeta de trabajo.             *
  33. *                                                                         *
  34. *  Si se quiere transmitir, el pin que se utilice como TX tiene que       *
  35. * configurarse como salida.                                               *
  36. *  Si se quiere recibir, el pin que se utilice como RX tiene que          *
  37. * configurarse como entrada.                                              *
  38. *                                                                         *
  39. ***************************************************************************
  40.  
  41. ***************************************************************************
  42. *                                                                         *
  43. * En esta libreria se encuentran las siguientes funciones                 *
  44. *                                                                         *
  45. * InitSoftUart()                (inicializa el puerto serie)              *
  46. * char getch_s()                (lee un byte del puerto serie)            *
  47. * putch_s(char)                 (envia un byte al puerto serie)           *
  48. * putst_s(char*)                (envia un string al puerto serie)         *
  49. * char * getst_s(char*)         (lee una cadena que termine con '\r')     *
  50. *                                                                         *
  51. *  El parametro de la funcion anterior puede ser un puntero a un String   *
  52. * o el propio String                                                      *
  53. *                                                                         *
  54. ***************************************************************************
  55.  
  56. * Ejemplo de configuracion y utilizacion
  57.  
  58.   #define PIC_CLK 10000000
  59.   #define TxPin RA0
  60.   #define RxPin RB1
  61.   #define BaudRate 9600
  62.  
  63.   #include "SoftUart.c"
  64.  
  65.   void main (void)
  66.   {
  67.     const char * pantalla = "Mundo";
  68.  
  69.     .....
  70.     .....
  71.     .....
  72.     TRISA0 = 0;
  73.     TRISB1 = 1;
  74.     InitSoftUart();
  75.     Putst_s ("Hola");   // envia el string "Hola" al puerto serie
  76.     Putst_s ("\n");     // envia el salto de linea al puerto serie
  77.     Putst_s (pantalla)  // envia el string apuntado por pantalla al puerto serie
  78.  
  79.   }
  80.  
  81. */
  82.  
  83.  
  84. #include "delayhd.h"   
  85.  
  86. #if defined (PIC_CLK) && defined (BaudRate) && defined (TxPin) && defined (RxPin)
  87.  
  88.   #if (PIC_CLK < 16000000)
  89.     #define BitDelay (1000000/BaudRate)
  90.     #define HalfBitDelay (500000/BaudRate)
  91.   #else
  92.     #define BitDelay (500000/BaudRate)
  93.     #define HalfBitDelay (250000/BaudRate)
  94.   #endif
  95.  
  96.   #if (PIC_CLK == 4000000)
  97.     #define DelayReceivebit DelayUs(BitDelay-7)\
  98.                                                         DelayUs(HalfBitDelay-7)
  99.     #if (BaudRate <= 19200)
  100.       #define DelayStartBit DelayUs(BitDelay-7)
  101.       #define DelaySendBit NDelayUs(BitDelay-18)
  102.     #elif (BaudRate == 28800)
  103.       #define DelayStartBit DelayUs(BitDelay-6)
  104.       #define DelaySendBit NDelayUs(BitDelay-18)
  105.     #elif (BaudRate == 38400)
  106.       #define DelayStartBit DelayUs(BitDelay-7)\
  107.                                                         dly2u
  108.       #define DelaySendBit DelayUs(BitDelay-19)\
  109.                                                    dly1u
  110.     #endif
  111.  
  112.   #elif (PIC_CLK == 8000000)
  113.     #define DelayReceivebit DelayUs(BitDelay-7)\
  114.                                                         DelayUs(HalfBitDelay-2)
  115.     #define DelayStartBit DelayUs(BitDelay-4)
  116.     #if (BaudRate <= 38400)
  117.       #define DelaySendBit NDelayUs(BitDelay-10)
  118.     #else         //(BaudRate == 57600)
  119.       #define DelaySendBit NDelayUs(BitDelay-9)
  120.         #endif
  121.  
  122.   #elif (PIC_CLK == 10000000)
  123.     #define DelayReceivebit DelayUs(BitDelay-7)\
  124.                                                         DelayUs(HalfBitDelay)
  125.     #if (BaudRate <= 38400)
  126.       #define DelayStartBit DelayUs(BitDelay-4)
  127.       #define DelaySendBit NDelayUs(BitDelay-8)
  128.     #else //(BaudRate == 57600)
  129.       #define DelayStartBit DelayUs(BitDelay-3)
  130.       #define DelaySendBit NDelayUs(BitDelay-7)
  131.         #endif
  132.  
  133.   #elif (PIC_CLK == 16000000) || (PIC_CLK == 20000000)
  134.     #if (PIC_CLK == 16000000)
  135.       #define DelayReceivebit DelayUs(BitDelay)\
  136.                                                           DelayUs(BitDelay)\
  137.                                                           DelayUs(BitDelay-5)
  138.     #else //(PIC_CLK == 20000000)
  139.       #define DelayReceivebit DelayUs(BitDelay)\
  140.                                                           DelayUs(BitDelay)\
  141.                                                           DelayUs(BitDelay-4)                                                          
  142.     #endif
  143.                
  144.         #if (BaudRate <= 38400)
  145.       #define DelayStartBit DelayUs(BitDelay)\
  146.                                                         DelayUs(BitDelay-2)
  147.       #define DelaySendBit NDelayUs(BitDelay)\
  148.                                                    NDelayUs(BitDelay-4)
  149.     #else //(BaudRate == 57600)
  150.       #define DelayStartBit DelayUs(BitDelay)\
  151.                                                         DelayUs(BitDelay-1)
  152.       #define DelaySendBit NDelayUs(BitDelay)\
  153.                                                    NDelayUs(BitDelay-3)
  154.     #endif
  155.   #endif
  156.  
  157. /*
  158. void InitSoftUart(void)
  159. {
  160.   TxPin = 1;
  161. }
  162. */
  163.  
  164.   #define InitSoftUart TxPin = 1
  165.  
  166.   unsigned char getch_s(void)
  167.   {
  168.     unsigned char contador = 7;
  169.     unsigned char letra = 0;
  170.  
  171.     DelayReceivebit;
  172.     do
  173.     {
  174.       if (RxPin == 1) letra += 128;
  175.       letra = letra >> 1;
  176.       contador--;
  177.       DelaySendBit;
  178.     }
  179.     while (contador > 0);
  180.     DelaySendBit;
  181.     return letra;
  182.   }
  183.  
  184.   void putch_s (unsigned char data)
  185.   {
  186.     unsigned char contador = 8;
  187.  
  188.     TxPin = 0;
  189.     DelayStartBit;
  190.     do
  191.     {
  192.       TxPin = data;
  193.       DelaySendBit;
  194.       data = data >> 1;
  195.       contador--;
  196.     }
  197.     while (contador > 0);
  198.     TxPin = 1;
  199.     DelayStartBit;   //tiempo de espera del bit de stop
  200.   }
  201.  
  202.   void putst_s (const char *word)
  203.   {
  204.     while (*word != 0)
  205.     {
  206.       putch_s(*word);
  207.       word++;
  208.     }
  209.   }
  210.  
  211.   char * getst_s (char * st)
  212.   {
  213.     char * st1;
  214.     char caracter;
  215.    
  216.     st1 = st;
  217.     do
  218.     {
  219.       caracter = getch_s();
  220.       if (caracter != '\r')
  221.       {
  222.         *st1 = caracter;
  223.         st1++;
  224.       }
  225.       *st1 = '\0';
  226.     }
  227.     while (caracter != '\r');
  228.     return st;
  229.   }  
  230.  
  231. #else
  232.  #error Faltan definir parametros
  233. #endif
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: RS232 en hitech
« Respuesta #2 en: 15 de Marzo de 2012, 11:37:53 »
Gracias por la información. Pero resulta que me dá errores del tipo: Error   [194] .... 161.15 ")" expected

Lo dá en la línea:

Código: [Seleccionar]
DelayReceivebit;

Que está definido como:

Código: [Seleccionar]
#define DelayReceivebit DelayUs(BitDelay-7)\DelayUs(HalfBitDelay)

He probado a poner parentesis, pero dá el mismo error.

Un Abrazo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: RS232 en hitech
« Respuesta #3 en: 15 de Marzo de 2012, 11:40:24 »
Ojo!, aparentemente quedó mal pegado el código...

la barra invertida está puesta para indicar un cambio de línea.... te subo el archivo directamente para que lo pruebes.

También hay que incluir el archivo de delays... eso está comentado en la cabecera de la librería... te lo subo también
« Última modificación: 15 de Marzo de 2012, 11:43:57 por AngelGris »
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: RS232 en hitech
« Respuesta #4 en: 15 de Marzo de 2012, 11:53:05 »
OK, funcionando. Muchas gracias por el aporte.

Saludos.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: RS232 en hitech
« Respuesta #5 en: 15 de Marzo de 2012, 13:01:19 »
  Que bueno que funcione.  :-/ :-/ :-/
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: RS232 en hitech
« Respuesta #6 en: 18 de Marzo de 2012, 15:38:26 »
Hola, funciona pero tube que modificar estas lineas:


Código: [Seleccionar]
#define DelaySendBit NDelayUs(BitDelay-18)

quitando la 'N', ¿ es un error ?

Saludos.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: RS232 en hitech
« Respuesta #7 en: 18 de Marzo de 2012, 15:43:33 »
  No recuerdo bien, pero creo que la diferencia entre DelayUs y NDelayUs es que en el segundo de los casos el retardo es de el tiempo indicado menos 1 ciclo de instrucción... Creo que en la rutina de Delays estaba comentado.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: RS232 en hitech
« Respuesta #8 en: 18 de Marzo de 2012, 21:34:16 »
Sí, lo he mirado y es un ciclo menos. El error me lo marca en la sentencia:

Código: [Seleccionar]
DelaySendBit;

El error es el siguiente:

Código: [Seleccionar]
Error   [195] E:\juanjo\GeneradorFuncionesDDS\ControlDDS\SoftUart.c; 177.26 expression syntax
Error   [195] E:\juanjo\GeneradorFuncionesDDS\ControlDDS\SoftUart.c; 180.26 expression syntax
Error   [195] E:\juanjo\GeneradorFuncionesDDS\ControlDDS\SoftUart.c; 193.26 expression syntax

Y DelaySebdBit está definido con las sentencias, en varias lineas:

Código: [Seleccionar]
#if (BaudRate <= 19200)
      #define DelayStartBit DelayUs(BitDelay-7)
      #define DelaySendBit NDelayUs(BitDelay-18)

Si quito la N funciona, pero debo de estar haciendo algo mal.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: RS232 en hitech
« Respuesta #9 en: 18 de Marzo de 2012, 22:14:56 »
  ¿Estás trabajando con cristal de 4MHz y a 19200, como indica el primer programa que subiste?

  Intentaré hacer algo simple con esa frecuencia de cristal y esa velocidad a ver si me arroja algún error.

  te subo el programita que simulé en ISIS y funciona bien.

« Última modificación: 18 de Marzo de 2012, 22:21:05 por AngelGris »
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: RS232 en hitech
« Respuesta #10 en: 19 de Marzo de 2012, 13:54:30 »
Bueno, despues de ver tu ejemplo se me encendió la bombilla. Resulta que para usar los retardos en mseg, tenia incluida una libreria de retardos, pero también tenia retardos de useg, y habia un conflicto con los retardos de la libreria incluida en la de RS232.

Al ver tu ejemplo tan limpito me dí cuenta de la libreria que tenia añadida.

Muchas gracias. Un abrazo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: RS232 en hitech
« Respuesta #11 en: 19 de Marzo de 2012, 14:06:31 »
  Que bueno que encontraste el problema.... Espero no te haya ofendido mi ejemplo....  :D :D :D siempre uso esas frases  :oops:

  Incluso en un examen de la secundaria en programación en ASM a una etiqueta la llame "Trolo", por suerte el profesor era muy macanudo y sólo atino a reirse  :D  :D
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: RS232 en hitech
« Respuesta #12 en: 19 de Marzo de 2012, 21:06:42 »
  Que bueno que encontraste el problema.... Espero no te haya ofendido mi ejemplo....  :D :D :D siempre uso esas frases  :oops:

  Incluso en un examen de la secundaria en programación en ASM a una etiqueta la llame "Trolo", por suerte el profesor era muy macanudo y sólo atino a reirse  :D  :D

Jeje, tranquilo. Yo a veces pongo cosas así, según esté de animo si estoy un poco cabreado pongo cosas así, y si estoy contento, pues cosas como en un ejemplo que colgué... Buenos dias Princesa!!!

Un abrazo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡