Autor Tema: Emular puerto serie UART en HiTech (subo libreria)  (Leído 4835 veces)

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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Emular puerto serie UART en HiTech (subo libreria)
« en: 19 de Noviembre de 2010, 18:46:17 »
  Aquí dejo una librería que sirve para usar puerto serie por soft. Es para el compilador Hi-Tech.
Aclaro que no lo probé físicamente sino que lo simulé en Proteus, también aclaro que sólo simulé las funciones de salida y en el "Terminal Virtual" de Proteus funcionó bien.

  Edito: Hay que acordarse de configurar los TRIS correctamente, para el pin que se va a usar como TX el TRIS debe quedar como salida y para el RX debe quedar como entrada

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

Desconectado gary_servin

  • PIC12
  • **
  • Mensajes: 65
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #1 en: 19 de Noviembre de 2010, 21:23:23 »
Excelente! voy a probarla en hardware y comento que tal fue! Muchas Gracias!

Saludos!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #2 en: 23 de Marzo de 2011, 14:46:01 »
  Esta es la última versión de la librería........


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.     while (RxPin == 1);
  172.     DelayReceivebit;
  173.     do
  174.     {
  175.       if (RxPin == 1) letra += 128;
  176.       letra = letra >> 1;
  177.       contador--;
  178.       DelaySendBit;
  179.     }
  180.     while (contador > 0);
  181.     DelaySendBit;
  182.     return letra;
  183.   }
  184.  
  185.   void putch_s (unsigned char data)
  186.   {
  187.     unsigned char contador = 8;
  188.  
  189.     TxPin = 0;
  190.     DelayStartBit;
  191.     do
  192.     {
  193.       TxPin = data;
  194.       DelaySendBit;
  195.       data = data >> 1;
  196.       contador--;
  197.     }
  198.     while (contador > 0);
  199.     TxPin = 1;
  200.     DelayStartBit;   //tiempo de espera del bit de stop
  201.   }
  202.  
  203.   void putst_s (const char *word)
  204.   {
  205.     while (*word != 0)
  206.     {
  207.       putch_s(*word);
  208.       word++;
  209.     }
  210.   }
  211.  
  212.   char * getst_s (char * st)
  213.   {
  214.     char * st1;
  215.     char caracter;
  216.    
  217.     st1 = st;
  218.     do
  219.     {
  220.       caracter = getch_s();
  221.       if (caracter != '\r')
  222.       {
  223.         *st1 = caracter;
  224.         st1++;
  225.       }
  226.       *st1 = '\0';
  227.     }
  228.     while (caracter != '\r');
  229.     return st;
  230.   }  
  231.  
  232. #else
  233.  #error Faltan definir parametros
  234. #endif
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Guillermo_Colombero

  • PIC10
  • *
  • Mensajes: 4
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #3 en: 11 de Diciembre de 2012, 16:38:24 »
Hola gente del post soy nuevo en esto, le traigo un problema que me surgió hace poco.
Tengo que realizar un proyecto con el pic16F628a en el cual necesito usar 2 uart y el micro solo cuenta con 1. Mi problema es que no se si el código que posteo "AngelGris" se divide en 3 archibos (main.c - InitSoftUart.c - InitSoftUart.h) y si es correcto lo que supongo, como se divide el código en estos. Si no es mucha molestia me gustaría si me pueden guiar a generar el proyecto de mplab de la comunicación por soft, con esta librería. Una cosa mas aclaro estoy usando el MplabX y compilo con hitech.

Muchas gracias!

Saludos.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #4 en: 12 de Diciembre de 2012, 08:28:59 »
  Mis funciones están en un sólo archivo y es dicho archivo el que hay que incluir en el proyecto.

  Fijate que en el encabezado de la librería hay un ejemplo.

  También podrías subir tu programa (con la opción GeSHi del editor de mensajes), aunque sea la parte que incluyes la librería, la parte de configuración y utilización de la misma.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Guillermo_Colombero

  • PIC10
  • *
  • Mensajes: 4
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #5 en: 13 de Diciembre de 2012, 23:50:14 »
Hola AngelGris, te hice caso coloque la libreria htc.h primero pero sigue tirando el mismo error aca les dejo mi codigo:

el main.c:
Código: [Seleccionar]
#include <htc.h>
#include <pic16f628a.h>
#include <pic.h>
#include <stdio.h>
#include <stdlib.h>
#define PIC_CLK 10000000
#define TxPin RA0
#define RxPin RA1
#define BaudRate 9600
#include "SoftUart.c"


#define _XTAL_FREQ  4000000

__CONFIG(FOSC_XT & WDTE_OFF & PWRTE_OFF & MCLRE_ON & BOREN_OFF & LVP_OFF & CPD_OFF & CP_OFF);

  void main (void)
  {
    const char * pantalla = "Mundo";

    TRISA0 = 0;
    TRISA1 = 1;
    InitSoftUart();
    Putst_s ("Hola");   // envia el string "Hola" al puerto serie
    Putst_s ("\n");     // envia el salto de linea al puerto serie
    Putst_s (pantalla);  // envia el string apuntado por pantalla al puerto serie

  }

y la libreria que diseño AngelGris SoftUart.c:
Código: [Seleccionar]
#include "delayhd.h"
 
#if defined (PIC_CLK) && defined (BaudRate) && defined (TxPin) && defined (RxPin)
 
  #if (PIC_CLK < 16000000)
    #define BitDelay (1000000/BaudRate)
    #define HalfBitDelay (500000/BaudRate)
  #else
    #define BitDelay (500000/BaudRate)
    #define HalfBitDelay (250000/BaudRate)
  #endif
 
  #if (PIC_CLK == 4000000)
    #define DelayReceivebit DelayUs(BitDelay-7)\
DelayUs(HalfBitDelay-7)
    #if (BaudRate <= 19200)
      #define DelayStartBit DelayUs(BitDelay-7)
      #define DelaySendBit NDelayUs(BitDelay-18)
    #elif (BaudRate == 28800)
      #define DelayStartBit DelayUs(BitDelay-6)
      #define DelaySendBit NDelayUs(BitDelay-18)
    #elif (BaudRate == 38400)
      #define DelayStartBit DelayUs(BitDelay-7)\
dly2u
      #define DelaySendBit DelayUs(BitDelay-19)\
   dly1u
    #endif
 
  #elif (PIC_CLK == 8000000)
    #define DelayReceivebit DelayUs(BitDelay-7)\
DelayUs(HalfBitDelay-2)
    #define DelayStartBit DelayUs(BitDelay-4)
    #if (BaudRate <= 38400)
      #define DelaySendBit NDelayUs(BitDelay-10)
    #else   //(BaudRate == 57600)
      #define DelaySendBit NDelayUs(BitDelay-9)
#endif
 
  #elif (PIC_CLK == 10000000)
    #define DelayReceivebit DelayUs(BitDelay-7)\
  DelayUs(HalfBitDelay)
    #if (BaudRate <= 38400)
      #define DelayStartBit DelayUs(BitDelay-4)
      #define DelaySendBit NDelayUs(BitDelay-8)
    #else //(BaudRate == 57600)
      #define DelayStartBit DelayUs(BitDelay-3)
      #define DelaySendBit NDelayUs(BitDelay-7)
#endif
 
  #elif (PIC_CLK == 16000000) || (PIC_CLK == 20000000)
    #if (PIC_CLK == 16000000)
      #define DelayReceivebit DelayUs(BitDelay)\
  DelayUs(BitDelay)\
  DelayUs(BitDelay-5)
    #else //(PIC_CLK == 20000000)
      #define DelayReceivebit DelayUs(BitDelay)\
  DelayUs(BitDelay)\
  DelayUs(BitDelay-4)
    #endif

#if (BaudRate <= 38400)
      #define DelayStartBit DelayUs(BitDelay)\
DelayUs(BitDelay-2)
      #define DelaySendBit NDelayUs(BitDelay)\
   NDelayUs(BitDelay-4)
    #else //(BaudRate == 57600)
      #define DelayStartBit DelayUs(BitDelay)\
DelayUs(BitDelay-1)
      #define DelaySendBit NDelayUs(BitDelay)\
   NDelayUs(BitDelay-3)
    #endif
  #endif
 
/*
void InitSoftUart(void)
{
  TxPin = 1;
}
*/
 
  #define InitSoftUart TxPin = 1
 
  unsigned char getch_s(void)
  {
    unsigned char contador = 7;
    unsigned char letra = 0;
 
    while (RxPin == 1);
    DelayReceivebit;
    do
    {
      if (RxPin == 1) letra += 128;
      letra = letra >> 1;
      contador--;
      DelaySendBit;
    }
    while (contador > 0);
    DelaySendBit;
    return letra;
  }
 
  void putch_s (unsigned char data)
  {
    unsigned char contador = 8;
 
    TxPin = 0;
    DelayStartBit;
    do
    {
      TxPin = data;
      DelaySendBit;
      data = data >> 1;
      contador--;
    }
    while (contador > 0);
    TxPin = 1;
    DelayStartBit;   //tiempo de espera del bit de stop
  }
 
  void putst_s (const char *word)
  {
    while (*word != 0)
    {
      putch_s(*word);
      word++;
    }
  }
 
  char * getst_s (char * st)
  {
    char * st1;
    char caracter;
   
    st1 = st;
    do
    {
      caracter = getch_s();
      if (caracter != '\r')
      {
        *st1 = caracter;
        st1++;
      }
      *st1 = '\0';
    }
    while (caracter != '\r');
    return st;
  } 
 
#else
 #error Faltan definir parametros
#endif


y por ultimo el error que arroja el MplabX:
Código: [Seleccionar]
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `C:/Users/guillote/Dropbox/Proyecto Final/Pic16F628A/Projecto Final/UartSoft-V1.X'
make  -f nbproject/Makefile-default.mk dist/default/production/UartSoft-V1.X.production.hex
make[2]: Entering directory `C:/Users/guillote/Dropbox/Proyecto Final/Pic16F628A/Projecto Final/UartSoft-V1.X'
"C:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe" --pass1 ../Uart-Soft_V1.X/main.c  -q --chip=16F628A -P  --outdir="build/default/production\_ext\1244268630" -N31 --warn=0 --runtime=default,+clear,+init,-keep,+osccal,-resetbits,-download,-stackcall,+clib --summary=default,-psect,-class,+mem,-hex --opt=default,+asm,-asmfile,-speed,+space,-debug,9  --double=24 --float=24 --addrqual=ignore --mode=lite -g --asmlist "--errformat=%%f:%%l: error: %%s" "--msgformat=%%f:%%l: advisory: %%s" "--warnformat=%%f:%%l warning: %%s"
make[2]: *** [build/default/production/_ext/1244268630/main.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
../Uart-Soft_V1.X/main.c:29: error: function or function pointer required
../Uart-Soft_V1.X/main.c:29: error: pointer required
../Uart-Soft_V1.X/main.c:30 warning: function declared implicit int
make[2]: Leaving directory `C:/Users/guillote/Dropbox/Proyecto Final/Pic16F628A/Projecto Final/UartSoft-V1.X'
make[1]: Leaving directory `C:/Users/guillote/Dropbox/Proyecto Final/Pic16F628A/Projecto Final/UartSoft-V1.X'

BUILD FAILED (exit value 2, total time: 764ms)

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #6 en: 14 de Diciembre de 2012, 08:47:56 »
  Como te decía en el otro mensaje, no es necesario que coloques

Código: C
  1. #include <pic.h>
  2. #include <pic16f628a.h>


Fijate que los nombres de las funciones de la librería están escritos en minúsculas, y en el ejemplo comienzan con mayúsculas.

Prueba colocando putst_s como nombre de función en lugar de Putst_s
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Guillermo_Colombero

  • PIC10
  • *
  • Mensajes: 4
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #7 en: 14 de Diciembre de 2012, 09:18:17 »
El main.c modificado queda así AngelGris:
Código: [Seleccionar]
#include <htc.h>
#include <stdio.h>
#include <stdlib.h>
#define PIC_CLK 10000000
#define TxPin RA0
#define RxPin RA1
#define BaudRate 9600
#define _XTAL_FREQ  4000000
#include "SoftUart.c"

__CONFIG(FOSC_XT & WDTE_OFF & PWRTE_OFF & MCLRE_ON & BOREN_OFF & LVP_OFF & CPD_OFF & CP_OFF);


  void main (void)
  {
    const char * pantalla = "Mundo";

    TRISA0 = 0;
    TRISA1 = 1;
    InitSoftUart();
    putst_s ("Hola");   // envia el string "Hola" al puerto serie
    putst_s ("\n");     // envia el salto de linea al puerto serie
    putst_s (pantalla);  // envia el string apuntado por pantalla al puerto serie
  }

se corrigieron los errores de los putst_s pero aca sigue tirando un conflicto en la llamada de la  InitSoftUart(); que en mi codigo esta en la linea 26 justo como acusa el error en la salida mira:
Código: [Seleccionar]
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `C:/Users/guillote/Dropbox/Proyecto Final/Pic16F628A/Projecto Final/UartSoft-V1.X'
make  -f nbproject/Makefile-default.mk dist/default/production/UartSoft-V1.X.production.hex
make[2]: Entering directory `C:/Users/guillote/Dropbox/Proyecto Final/Pic16F628A/Projecto Final/UartSoft-V1.X'
"C:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe" --pass1 ../Uart-Soft_V1.X/main.c  -q --chip=16F628A -P  --outdir="build/default/production\_ext\1244268630" -N31 --warn=0 --runtime=default,+clear,+init,-keep,+osccal,-resetbits,-download,-stackcall,+clib --summary=default,-psect,-class,+mem,-hex --opt=default,+asm,-asmfile,-speed,+space,-debug,9  --double=24 --float=24 --addrqual=ignore --mode=lite -g --asmlist "--errformat=%%f:%%l: error: %%s" "--msgformat=%%f:%%l: advisory: %%s" "--warnformat=%%f:%%l warning: %%s"
../Uart-Soft_V1.X/main.c:26: error: function or function pointer required
../Uart-Soft_V1.X/main.c:26: error: pointer required
make[2]: *** [build/default/production/_ext/1244268630/main.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
make[2]: Leaving directory `C:/Users/guillote/Dropbox/Proyecto Final/Pic16F628A/Projecto Final/UartSoft-V1.X'
make[1]: Leaving directory `C:/Users/guillote/Dropbox/Proyecto Final/Pic16F628A/Projecto Final/UartSoft-V1.X'

BUILD FAILED (exit value 2, total time: 460ms)

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #8 en: 14 de Diciembre de 2012, 10:25:46 »
¿Estás poniendo el programa completo? Porque el error lo marca en la línea 26 y yo no cuento 26 líneas en tu programa.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Guillermo_Colombero

  • PIC10
  • *
  • Mensajes: 4
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #9 en: 14 de Diciembre de 2012, 10:32:04 »
Si solo que tenia una breve descripción comentada al comienzo pero ya la limpie así se hace mas fácil.

main.c :
Código: [Seleccionar]
#include <htc.h>
#include <stdio.h>
#include <stdlib.h>
#define PIC_CLK 10000000
#define TxPin RA0
#define RxPin RA1
#define BaudRate 9600
#define _XTAL_FREQ  4000000
#include "SoftUart.c"

__CONFIG(FOSC_XT & WDTE_OFF & PWRTE_OFF & MCLRE_ON & BOREN_OFF & LVP_OFF & CPD_OFF & CP_OFF);


  void main (void)
  {
    const char * pantalla = "Mundo";

    TRISA0 = 0;
    TRISA1 = 1;
    InitSoftUart();
    putst_s ("Hola");   // envia el string "Hola" al puerto serie
    putst_s ("\n");     // envia el salto de linea al puerto serie
    putst_s (pantalla);  // envia el string apuntado por pantalla al puerto serie
  }


y la notificación de salida:
Código: [Seleccionar]
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `C:/Users/guillote/Dropbox/Proyecto Final/Pic16F628A/Projecto Final/UartSoft-V1.X'
make  -f nbproject/Makefile-default.mk dist/default/production/UartSoft-V1.X.production.hex
make[2]: Entering directory `C:/Users/guillote/Dropbox/Proyecto Final/Pic16F628A/Projecto Final/UartSoft-V1.X'
"C:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe" --pass1 ../Uart-Soft_V1.X/main.c  -q --chip=16F628A -P  --outdir="build/default/production\_ext\1244268630" -N31 --warn=0 --runtime=default,+clear,+init,-keep,+osccal,-resetbits,-download,-stackcall,+clib --summary=default,-psect,-class,+mem,-hex --opt=default,+asm,-asmfile,-speed,+space,-debug,9  --double=24 --float=24 --addrqual=ignore --mode=lite -g --asmlist "--errformat=%%f:%%l: error: %%s" "--msgformat=%%f:%%l: advisory: %%s" "--warnformat=%%f:%%l warning: %%s"
../Uart-Soft_V1.X/main.c:20: error: function or function pointer required
make[2]: *** [build/default/production/_ext/1244268630/main.p1] Error 1
../Uart-Soft_V1.X/main.c:20: error: pointer required
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
make[2]: Leaving directory `C:/Users/guillote/Dropbox/Proyecto Final/Pic16F628A/Projecto Final/UartSoft-V1.X'
make[1]: Leaving directory `C:/Users/guillote/Dropbox/Proyecto Final/Pic16F628A/Projecto Final/UartSoft-V1.X'

BUILD FAILED (exit value 2, total time: 2s)

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #10 en: 14 de Diciembre de 2012, 10:42:34 »
  Prueba llamando a la función IniSoftUart sin los paréntesis finales. En realidad no es una función sino que en la librería está definido con "#define".
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #11 en: 17 de Junio de 2013, 14:52:56 »
  Prueba llamando a la función IniSoftUart sin los paréntesis finales. En realidad no es una función sino que en la librería está definido con "#define".


Hola AngelGris ....hace unos dias que estoy tratando de compilar esta subrutina y no logro poder hacerlo ...no la entiendo ...a ver si estoy haciendo bien ...paso a explicar lo que hago

a la libreria la llamo uart.c y la incluyo en la carpeta ....

al main lo defino asi

    #include <stdio.h>
    #include <stdlib.h>
    #include <htc.h>   
    #define PIC_CLK 10000000
    #define TxPin PORTAbits.RA0
    #define RxPin PORTAbits.RA1
    #define BaudRate 9600
    #include "uart.c"
    #define _XTAL_FREQ 8000000         // esto es de HiTech para los delays


La libreria uart.c tiene un #include "delayhd.h"

el cual saco de un archivo zip que baje de la red

PIC_Hi-Tech_C_delay_and_timeout_routines_for_PIC16xxxx_v7-1.zip


dentro del cual esta       delay_alternative_enchanced_precision.h

el cual lo renombro como delayhd.h y lo pongo dentro de la carpeta del proyecto

intento compilar con xc8 ..y me da el error de que defina correctamente  el pic_clk

y tambien me da el error de que faltan definir parametros , sin em,bargo creo estan bien definidos en el main

asi es como me queda

Código: [Seleccionar]
#include <stdio.h>
    #include <stdlib.h>
    #include <htc.h>
    #define PIC_CLK 10000000
    #define TxPin PORTAbits.RA0
    #define RxPin PORTAbits.RA1
    #define BaudRate 9600
    #include "uart.c"
    #define _XTAL_FREQ 8000000         // esto es de HiTech para los delays




 void init (void);

     void main ()


     {
     
    OSCCONbits.IRCF2 = 1; //
    OSCCONbits.IRCF1 = 1; // defino oscilador interno en 8 mhz
    OSCCONbits.IRCF0 = 1; //
     
    TRISAbits.TRISA0 = 0 ;
    TRISAbits.TRISA1 = 1 ;
     
     
    const char * pantalla = "Mundo";


       InitSoftUart;
       putst_s ("Hola");   // envia el string "Hola" al puerto serie
       putst_s ("\n");     // envia el salto de linea al puerto serie
       putst_s (pantalla); // envia el string apuntado por pantalla al puerto serie

     }

     void init (void)
     {
         ADCON0bits.ADON = 0;  //
    ADCON1bits.PCFG3 = 0; //
    ADCON1bits.PCFG2 = 1; // pongo todas las entradas digitales porta
    ADCON1bits.PCFG1 = 1; //
    ADCON1bits.PCFG0 = 1; //
    ADCON1bits.ADCS2 = 0; //
   
    TRISB =1;
    PORTB =0;
     }
     


que es lo que hago mal ??

Gracias


Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #12 en: 17 de Junio de 2013, 15:43:42 »
Rseliman

 Prueba eliminando las siguientes líneas de la librería

Código: C
  1. #if defined (PIC_CLK) && defined (BaudRate) && defined (TxPin) && defined (RxPin)

Esa está casi al comienzo.

  Y también éstas que están al final

Código: C
  1. #else
  2.  #error Faltan definir parametros
  3. #endif

  Todas éstas líneas deberían arrojar un error e impedir la compilación justamente si no están definidos los parámetros.

  Ultimamente he encontrado errores de compilación tanto con versiones más nuevas de HiTech como con XC8. Al parecer para que no arroje error equivocadamente dichos parámetros deben estar definidos en un .h

  Al menos es lo que me paso con las rutinas que subí hace poco para I2C por soft.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #13 en: 17 de Junio de 2013, 15:58:39 »
Gracias Angel -....

Los condicionales funcionan si defino dentro del mismo uart.c ...pero me da error en las funciones

:: warning: Omniscient Code Generation not available in Free mode
uart.c:175: error: function "_getch_s" redefined
(908) exit status = 1
uart.c:194: error: function "_putch_s" redefined
uart.c:212: error: function "_putst_s" redefined
uart.c:221: error: function "_getst_s" redefined

No entiendo porque me la da como redefinida
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Emular puerto serie UART en HiTech (subo libreria)
« Respuesta #14 en: 17 de Junio de 2013, 16:12:19 »
Gracias Angel -....

Los condicionales funcionan si defino dentro del mismo uart.c ...pero me da error en las funciones

:: warning: Omniscient Code Generation not available in Free mode
uart.c:175: error: function "_getch_s" redefined
(908) exit status = 1
uart.c:194: error: function "_putch_s" redefined
uart.c:212: error: function "_putst_s" redefined
uart.c:221: error: function "_getst_s" redefined

No entiendo porque me la da como redefinida


  Es ciertamente extraño. Prueba sin incluir STDIO.H y STDLIB.H. Tal vez en ellos haya funciones con el mismo nombre y por ello arroja el mensaje de redefined.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas


 

anything