Autor Tema: me canse de ser beta tester en CCS asi que me paso a hitech c y c18 pero....?  (Leído 3169 veces)

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

Desconectado pandemonium

  • PIC10
  • *
  • Mensajes: 14
Hola a los Maestros y a todos los estimados foreros. Luego de lidiar por 2 años con ccs c me he tomado la dura, muy dura decisión de pasarme a los compiladores de Microchip (su flamante recien adquirida Hitech c y C18). :(. Las razones fundamentales se deben a sus problemas sintácticos especialmente con los punteros a parte del hecho de sentirme todo un beta tester y lograr que cada programa con una cierta complejidad se conviertiera en todo un drama digno de una telenovela. Sin contar el hecho de haberme gastado unos dolarillos en la licencia, pues pretendía usarlo en ámbitos comerciales.

Asi que he estado gastando 2 semanas de mi valioso tiempo para estudiar algo acerca de los compiladores hitech picc, picc18 y c18, agradeciendo de antemano al Maestro Suky por el tutorial de c18 que ha publicado haciendome de nuevo la vida mas facil.

Aunque para estos compiladores las librerias resultan bastante precarias comparadas con las que entregan compiladores como ccs y mikroc, es de destacar las caracteristicas ANSI y otros detalles que estoy conociendo de ellos, pero vaya si esto es como empezar de cero porque cuando uno se acostumbra a las funciones "precocidas" de ccs se vuelve bastante molesto saber que tienes que reescribir todo de cero, sobretodo el código para la manipulación de periféricos como memorias, SPI, USART, etc.

La idea es codificar lo necesario para generalizar el codigo para hitech picc, picc18 y c18 pero leyendo el manual del hitech picc18 dice lo siguiente:


2.3.1.3  MPLAB C18 Compatible Peripheral Libraries
HI-TECH C PRO for the PIC18 MCU Family has support for all of MPLAB C18 peripheral libraries.
The source for these routines can be viewed in the sources and include directories of the compiler.
For more information concerning peripheral libraries, please visit Microchip’s website. Note that to
use peripheral libraries, the --RUNTIME=plib option will need to be used. See Section 2.6.52.


De acuerdo a ello, lo que yo entiendo es que ahora en hitech picc18 podemos usar las librerias de c18. Me gustaria que alguien me aclare la duda al respecto.

Y otra cuestión es que estos dos compiladores tienen caracteristicas diferentes que los hacen bastante atractivos para ciertas aplicaciones. Asi que me encantaría saber sus opiniones al respecto de codificar las librerias de aqui en adelante para hacerlas genéricas para estos dos compiladores. La verdad teniendo en cuenta las opiniones de ustedes que tienen mas experiencia con estos compiladores me facilitaran mas las cosas y de esta manera perderé menos tiempo. Gracias y espero sus comentarios.....

Cordial saludo.
« Última modificación: 14 de Febrero de 2011, 20:56:43 por pandemonium »

Desconectado tinchosalamero

  • PIC12
  • **
  • Mensajes: 53
Re: me canse de ser beta tester en CCS asi que me paso a hitech c y c18 pero....?
« Respuesta #1 en: 15 de Febrero de 2011, 10:58:25 »
Buenas,

Yo he usado y uso esos dos compiladores (C18 y Hitech) nunca he tenido mayores problemas pero tienen algunas cosas molestas. En principio usarlos se hace bastante mas complicado que el CCS ya que como bien decis vos no tienen funciones Pre cocidas, te doy como ejemplo si queres hacer una Usart por software, mientras en CCS es solo una linea de comando en C-18 y Hi-tech tenes que recompilar librerias, pero me parece que al tenes todo menos enlatado podes hacer mas cosas.
Comparando entre el C-18 y el hitech no creo que haya uno mejor que otro, de hecho son bastante parecidos pero no compatibles,

espero te sirva

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: me canse de ser beta tester en CCS asi que me paso a hitech c y c18 pero....?
« Respuesta #2 en: 15 de Febrero de 2011, 12:47:42 »
  Yo uso HiTech tanto para pic 16 como para pic 18, pero no soy un buen parámetro ya que solo hago cositas por hobby. He hecho algunas rutinas para manejo de UART tanto Hard como Soft, también SPI por Hard y Soft, I2C Hard y Soft, LCD y teclados. También me hice unas definiciones y funciones para que algunas cosas sean similares a CCS. Este es una de las definiciones que hice

Código: C
  1. /********************************************************
  2. *
  3. * Definiciones para los PIC 16F873 16F874 16F876 16F877
  4. * PIC 16F873A 16F874A 16F876A 16F877A
  5. *
  6. * (Estos ultimos tienen comparadores internos)
  7. *
  8. /*******************************************************/
  9.  
  10.  
  11.  
  12. // Definiciones para configurar el Timer0
  13.  
  14. #define T0_INTERNAL     0
  15. #define EXT_L_TO_H      32
  16. #define EXT_H_TO_L      48
  17. #define T0_DIV_1        8
  18. #define T0_DIV_2        0
  19. #define T0_DIV_4        1
  20. #define T0_DIV_8        2
  21. #define T0_DIV_16       3
  22. #define T0_DIV_32       4
  23. #define T0_DIV_64       5
  24. #define T0_DIV_128      6
  25. #define T0_DIV_256      7
  26.  
  27. void set_timer0(unsigned char tiempo)
  28. {
  29.         TMR0 = tiempo;
  30. }
  31.  
  32. unsigned char get_timer0()
  33. {
  34.         return TMR0;
  35. }
  36.  
  37. #define setup_timer0(x) OPTION &= (0b11000000); OPTION += x
  38.  
  39.  
  40. //Definiciones para configurar el Timer1
  41.  
  42. #define T1_DISABLE                      0
  43. #define T1_INTERNAL             133
  44. #define T1_EXTERNAL             135
  45. #define T1_EXTERNAL_SYNC        131
  46. #define T1_CLK_OUT          8
  47. #define T1_DIV_1                0
  48. #define T1_DIV_2                16
  49. #define T1_DIV_4                32     
  50. #define T1_DIV_8                48
  51.  
  52. void set_timer1(unsigned int tiempo)
  53. {
  54.         TMR1L = (tiempo&0x00FF);
  55.         TMR1H = (tiempo/256);
  56. }
  57.  
  58. unsigned int get_timer1()
  59. {
  60.         return ((TMR1H*256)+TMR1L);
  61. }
  62.  
  63. #define setup_timer1(x) T1CON = x
  64.  
  65.  
  66. //Definiciones para configurar el Timer2
  67.  
  68. #define T2_DISABLED 0
  69. #define T2_DIV_1        4
  70. #define T2_DIV_4        5
  71. #define T2_DIV_16   6
  72.  
  73. void set_timer2(unsigned char tiempo)
  74. {
  75.         TMR2 = tiempo;
  76. }
  77.  
  78. unsigned char get_timer2()
  79. {
  80.         return TMR2;
  81. }
  82.  
  83. #define setup_timer2(x,y,z) T2CON = (x | z*7); PR2 = y
  84.  
  85.  
  86. //Definiciones para configurar el CCP
  87.  
  88. #define CCP_OFF                         0
  89. #define CCP_CAPTURE_FE                  4
  90. #define CCP_CAPTURE_RE                  5
  91. #define CCP_CAPTURE_DIV_4               6
  92. #define CCP_CAPTURE_DIV_16              7
  93. #define CCP_COMPARE_SET_ON_MATCH        8
  94. #define CCP_COMPARE_CLR_ON_MATCH        9
  95. #define CCP_COMPARE_INT                 10
  96. #define CCP_COMPARE_RESET_TIMER         11
  97. #define CCP_PWM                         12
  98.  
  99. #define setup_ccp1(x) CCP1CON = x
  100. #define setup_ccp2(x) CCP2CON = x
  101.  
  102. unsigned int get_ccpr1()
  103. {
  104.         return ((CCPR1H*256)+CCPR1L);
  105. }
  106.  
  107. unsigned int get_ccpr2()
  108. {
  109.         return ((CCPR2H*256)+CCPR2L);
  110. }
  111.  
  112. void set_pwm1_duty (unsigned int duty)
  113. {
  114.         CCPR1L = (duty & 0b0000001111111100)/4;
  115.         CCP1CON &= 0b00001111;
  116.         CCP1CON += (duty & 0b0000000000000011)*16;
  117. }
  118.  
  119. void set_pwm2_duty (unsigned int duty)
  120. {
  121.         CCPR2L = (duty & 0b0000001111111100)/4;
  122.         CCP2CON &= 0b00001111;
  123.         CCP2CON += (duty & 0b0000000000000011)*16;
  124. }
  125.  
  126. #if defined(_16F873A)||defined(_16F874A)||defined(_16F876A)||\
  127.         defined(_16F877A)
  128.  
  129.         #define NC_NC_NC_NC                                     7
  130.         #define A0_A3_A1_A2                                     2
  131.         #define A0_A3_A1_A2_OUT_ON_A4_A5        3
  132.         #define A0_A3_A1_A3_OUT_ON_A4_A5        5
  133.         #define A0_A3_A1_A3                                     4
  134.         #define A0_A3_NC_NC_OUT_ON_A4           1
  135.         #define A0_VREF_A1_VREF                         6
  136.         #define A3_VREF_A2_VREF                         14
  137.         #define CP1_INVERT                                      16
  138.         #define CP2_INVERT                                      32
  139.  
  140.         #define setup_comparator(x) CMCON = x
  141.  
  142.         #define VREF_DISABLE    0
  143.         #define VREF_A2                 64
  144.         #define VREF_LOW                160
  145.         #define VREF_HIGH               128
  146.        
  147.         #define setup_vref(x) CVRCON = x
  148.  
  149. #endif
  150.  
  151.  
  152. //Definiciones para el conversor AD
  153.  
  154. #define ADC_START_ONLY          3
  155. #define ADC_READ_ONLY           0
  156. #define ADC_START_AND_READ      1
  157.  
  158. #define ADC_OFF                 0
  159. #define ADC_CLOCK_DIV_2         0
  160. #define ADC_CLOCK_DIV_4         256
  161. #define ADC_CLOCK_DIV_8         64
  162. #define ADC_CLOCK_DIV_16        320
  163. #define ADC_CLOCK_DIV_32        128
  164. #define ADC_CLOCK_DIV_64        384
  165. #define ADC_CLOCK_INTERNAL      192
  166.  
  167. #define ALL_ANALOG                          0
  168. #define AN0_AN1_AN2_VREF_AN4_AN5_AN6_AN7    1
  169. #define AN0_AN1_AN2_AN3_AN4                 2
  170. #define AN0_AN1_AN2_VREF_AN4                3
  171. #define AN0_AN1_AN3                         4
  172. #define AN0_AN1_VREF                        5
  173. #define NO_ANALOG                           7
  174. #define AN0_AN1_VREF_VREF_AN4_AN5_AN6_AN7   8
  175. #define AN0_AN1_AN2_AN3_AN4_AN5             9
  176. #define AN0_AN1_AN2_VREF_AN4_AN5            10
  177. #define AN0_AN1_VREF_VREF_AN4_AN5           11
  178. #define AN0_AN1_VREF_VREF_AN4               12
  179. #define AN0_AN1_VREF_VREF                   13
  180. #define AN0                                 14
  181. #define AN0_VREF_VREF                       15
  182.  
  183.  
  184. #define setup_adc(x) ADCON0 = x; ADCON1 += (x&0b0000000100000000)/4
  185. #define setup_adc_ports(x) ADCON1 = (x+128)
  186.  
  187. void set_adc_channel (unsigned char canal)
  188. {
  189.   ADCON0 &= 0b11000111;
  190.   ADCON0 += (canal*8);
  191.   ADCON0 |= 0b00000011;
  192. }
  193.  
  194. unsigned int read_adc(unsigned char action)
  195. {
  196.   //ADCON0 |= 0b00000011;
  197.   //DelayBigUs(20);
  198.  
  199.   if ((action == 1)||(action == 3)) ADCON0 |= 0b00000100;
  200.   if (action == 1)
  201.   {
  202.     while (ADGO == 1);
  203.       ADCON0 &= 0b11111000;
  204.       ADIF = 0;
  205.   }
  206.   return (((ADRESH & 0x03)*256)+ADRESL);
  207. }
  208.  
  209.  
  210. //Definiciones para habilitar y deshabilitar interrupciones
  211.  
  212. #define GLOBAL          0x0BC0  //global y perifericas
  213. #define INT_TMR0        0x0B20
  214. #define INT_EXT         0x0B10
  215. #define INT_RB          0x0B08
  216. #define INT_PSP         0x8C80      
  217. #define INT_AD          0x8C40         
  218. #define INT_EEPROM      0x8D10
  219. #define INT_BUSCOL      0x8D04
  220. #define INT_CCP2        0x8D01
  221. #define INT_RDA         0x8C20
  222. #define INT_TBE         0x8C10
  223. #define INT_SSP         0x8C08
  224. #define INT_CCP1        0x8C04
  225. #define INT_TMR2        0x8C02
  226. #define INT_TMR1        0x8C01
  227. #define INT_COMP        0x8D10
  228.  
  229. #define L_TO_H          1
  230. #define H_TO_L          0
  231.  
  232. #define ext_int_edge(x) INTEDG = x
  233.  
  234. #define enable_interrupt(x) FSR = (x/256); INDF |= x
  235. #define disable_interrupt(x) FSR = (x/256); INDF &= (x ^ 0xFF)
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pandemonium

  • PIC10
  • *
  • Mensajes: 14
Re: me canse de ser beta tester en CCS asi que me paso a hitech c y c18 pero....?
« Respuesta #3 en: 15 de Febrero de 2011, 13:04:56 »
Gracias Tinchosalamero y de nuevo Angelgris por las respuestas. Pues hasta donde he estado investigando, al parecer Microchip con la obtención de Hitech está migrando sus librerias que entrega con C18 a Hitech, pero la duda que me surgió al principio era saber si esas librerias se podian usar indistintamente del compilador pero según lo que estoy viendo (que a veces soy bastante ciego  :mrgreen:) es que microchip simplemente cambió la sintaxis de las librerias de C18 y las copió en los directorios de instalación del Hitech picc18. Inicialmente yo creia que se podian usar los mismos ficheros fuente creyendo que las caracteristicas intrínsecas de cada compilador eran separadas con el uso del preprocesador. De todas formas ya estoy arrancando, asi que tendré que ir lidiando esto en el camino. Oye Angelgris, está bien interesante tu propuesta, asi que en base a esa gran idea empezaré a construir las librerías. Muchas gracias.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: me canse de ser beta tester en CCS asi que me paso a hitech c y c18 pero....?
« Respuesta #4 en: 15 de Febrero de 2011, 13:40:16 »
  En www.microchipc.com hay varias rutinas que puede servir como ejemplo. De allí bajé unas de delay que están realmente muy bien.

  Yo ya subí las rutinas que hice, que te mencionaba en el mensaje anterior, asi que usando el buscador del foro deberían aparecer y si no las encontrás y te interesan las vuelvo a subir.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas


 

anything