Autor Tema: Traducción CCS a XC8 para AD9850  (Leído 2055 veces)

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

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Traducción CCS a XC8 para AD9850
« en: 11 de Diciembre de 2017, 20:12:54 »
Tengo una librería en CCS para un DDS AD9850 que funciona correctamente, la estoy traduciendo a XC8, y no me funciona:

Librería CCS:
Código: C
  1. #define FREC_CLK  125//Suitable for 125MHz Crystal
  2. /******************************************************************************/
  3.  
  4. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  6. void AD9850_Init()
  7. {
  8.    output_drive(REST);//Define como salida
  9.    output_drive(FQUP);//Define como salida
  10.    output_drive(CLK);//Define como salida
  11.    output_drive(BitData);//Define como salida
  12.    output_bit(REST, 0);
  13.    output_bit(FQUP, 0);
  14.    output_bit(CLK, 0);
  15.    output_bit(BitData, 0);
  16. }
  17. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  18. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  19. void AD9850_Reset_Serial()
  20. {
  21.   output_bit(CLK, 0);
  22.   output_bit(FQUP, 0);
  23.   //Reset signal
  24.   output_bit(REST, 0);
  25.   output_bit(REST, 1);
  26.   output_bit(REST, 0);
  27.   //Clk  signal
  28.   output_bit(CLK, 0);
  29.   output_bit(CLK, 1);
  30.   output_bit(CLK, 0);
  31.   //Fq-up signal
  32.   output_bit(FQUP, 0);
  33.   output_bit(FQUP, 1);
  34.   output_bit(FQUP, 0);
  35. }
  36. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  37. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  38. // Enviamos frecuencia en Hz al DDS.
  39. void AD9850_WR_Serial(int8 w0,int32 frequence)
  40. {
  41.   int8 i,w;
  42.   int32 y;
  43.   UINT64 x,aux;
  44.  
  45.   //Calculate the frequency of the HEX value
  46.   aux = ui64Mult32x32(frequence,START_X); //el dato sigue cabiendo en la var de 64 bits
  47.   x = ui64Cast32x64(FREC_CLK);
  48.   aux = ui64Div64x64(aux,x);//no pierde tanta precisión porque se sigue trabajando en un recipiente de 64 bits
  49.   x = ui64Cast32x64(1000000);
  50.   aux = ui64Div64x64(aux,x);//ya pierde precisión pero el dato se entrega a int, así que no hay de otra
  51.   y = aux;
  52.  
  53.   //write w4
  54.   w=(y>>=0);
  55.   for(i=0; i<8; i++)
  56.   {
  57.     output_bit(BitData, (w>>i)&0x01);
  58.     output_bit(CLK, 1);
  59.     output_bit(CLK, 0);
  60.   }
  61.   //write w3
  62.   w=(y>>8);
  63.   for(i=0; i<8; i++)
  64.   {
  65.     output_bit(BitData, (w>>i)&0x01);
  66.     output_bit(CLK, 1);
  67.     output_bit(CLK, 0);
  68.   }
  69.   //write w2
  70.   w=(y>>16);
  71.   for(i=0; i<8; i++)
  72.   {
  73.     output_bit(BitData, (w>>i)&0x01);
  74.     output_bit(CLK, 1);
  75.     output_bit(CLK, 0);
  76.   }
  77.   //write w1
  78.   w=(y>>24);
  79.   for(i=0; i<8; i++)
  80.   {
  81.     output_bit(BitData, (w>>i)&0x01);
  82.     output_bit(CLK, 1);
  83.     output_bit(CLK, 0);
  84.   }
  85.   //write w0
  86.   w=w0;
  87.   for(i=0; i<8; i++)
  88.   {
  89.     output_bit(BitData, (w>>i)&0x01);
  90.     output_bit(CLK, 1);
  91.     output_bit(CLK, 0);
  92.   }
  93.   output_bit(FQUP, 1);
  94.   output_bit(FQUP, 0);
  95. }
  96. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Y mi traducción a XC8:

Código: C
  1. #ifndef VAR_64BIT_H_
  2. #include "Variables_64bits.h"
  3. #endif
  4. #include "DDS_AD9850.h"
  5.  
  6. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  7. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  8. void AD9850_Init()
  9. {
  10.    TRIS_REST = 0;//Define como salida
  11.    TRIS_FQUP = 0;//Define como salida
  12.    TRIS_CLK = 0;//Define como salida
  13.    TRIS_BitData = 0;//Define como salida
  14.    REST = 0;
  15.    FQUP = 0;
  16.    CLK = 0;
  17.    BitData = 0;
  18. }
  19. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  20. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  21. void AD9850_Reset_Serial()
  22. {
  23.   CLK = 0;
  24.   FQUP = 0;
  25.   //Reset signal
  26.   REST = 0;
  27.   REST = 1;
  28.   REST = 0;
  29.   //Clk  signal
  30.   CLK = 0;
  31.   CLK = 1;
  32.   CLK = 0;
  33.   //Fq-up signal
  34.   FQUP = 0;
  35.   FQUP = 1;
  36.   FQUP = 0;
  37. }
  38. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  39. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  40. // Enviamos frecuencia en Hz al DDS.
  41. void AD9850_WR_Serial(unsigned char w0, unsigned long long frequence)
  42. {
  43.   unsigned char i,w;
  44.   unsigned long long y;
  45.   UINT64 x,aux;
  46.  
  47.   //Calculate the frequency of the HEX value
  48.   aux = ui64Mult32x32(frequence,START_X); //el dato sigue cabiendo en la var de 64 bits
  49.   x = ui64Cast32x64(FREC_CLK);
  50.   aux = ui64Div64x64(aux,x);//no pierde tanta precisión porque se sigue trabajando en un recipiente de 64 bits
  51.   x = ui64Cast32x64(1000000);
  52.   aux = ui64Div64x64(aux,x);//ya pierde precisión pero el dato se entrega a int, así que no hay de otra
  53.   y = aux.Dword[0];
  54.  
  55.   //write w4
  56.   w=(y>>=0);
  57.   for(i=0; i<8; i++)
  58.   {
  59.     BitData = (w>>i)&0x01;
  60.     CLK = 1;
  61.     CLK = 0;
  62.   }
  63.   //write w3
  64.   w=(y>>8);
  65.   for(i=0; i<8; i++)
  66.   {
  67.     BitData = (w>>i)&0x01;
  68.     CLK = 1;
  69.     CLK = 0;
  70.   }
  71.   //write w2
  72.   w=(y>>16);
  73.   for(i=0; i<8; i++)
  74.   {
  75.     BitData = (w>>i)&0x01;
  76.     CLK = 1;
  77.     CLK = 0;
  78.   }
  79.   //write w1
  80.   w=(y>>24);
  81.   for(i=0; i<8; i++)
  82.   {
  83.     BitData = (w>>i)&0x01;
  84.     CLK = 1;
  85.     CLK = 0;
  86.   }
  87.   //write w0
  88.   w=w0;
  89.   for(i=0; i<8; i++)
  90.   {
  91.     BitData = (w>>i)&0x01;
  92.     CLK = 1;
  93.     CLK = 0;
  94.   }
  95.   FQUP = 1;
  96.   FQUP = 0;
  97. }
  98. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

El archivo de cabecera:
Código: C
  1. #ifndef DDS_AD9851_H
  2. #define DDS_AD9851_H
  3.  
  4. #include <xc.h> // include processor files - each processor file is guarded.  
  5.  
  6. #define  START_X 4294967295 //2 ^ 32 - 1
  7.  
  8. /******************************************************************************/
  9. /* Pines y frec DDS.Para control.                                             */
  10. #define REST      LATC0
  11. #define FQUP      LATC1
  12. #define CLK       LATC2
  13. #define BitData   LATC5
  14. //Para definir como salida.
  15. #define TRIS_REST      TRISC0
  16. #define TRIS_FQUP      TRISC1
  17. #define TRIS_CLK       TRISC2
  18. #define TRIS_BitData   TRISC5
  19. //-----
  20. #define FREC_CLK  125//Suitable for 125MHz Crystal
  21. /******************************************************************************/
  22.  
  23.  
  24. void AD9850_Init(void);
  25. void AD9850_Reset_Serial(void);
  26. void AD9850_WR_Serial(unsigned char w0, unsigned long long frequence);
  27.  
  28. #endif  /* DDS_AD9851_H */

El codigo en CCS funciona bien en un PIC18F4550 a 48MHz, e y el de XC8 lo estoy probando en un PIC18F26K80 con oscilador interno a 16MHz, entonces pienso que no es problema de transiciones muy rápidas en el cambio de estado de las lineas de control, pues donde da problemas es en el PIC más lento.

No veo cual puede ser el problema, la traducción parece correcta. La librería de manejo de variables de 64bit también descarto que esté mal, probé a poner un valor constante en este punto:

Código: C
  1. y = 34.359.738;//aux.Dword[0]; Cte para 1MHz.

y no genera la frecuencia de 1MHz.

El módulo DDS funciona, pues con el otro PIC y el código en CCS funciona correctamente.

Gracias!!! un saludo.
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 KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re:Traducción CCS a XC8 para AD9850
« Respuesta #1 en: 11 de Diciembre de 2017, 21:25:45 »
Hola micro_pepe, hace unas semanas estuve haciendo un codigo para pic16f1936 en XC8, y tuve problemas en los pines con salidas erróneas pero se debió a que no configuré bien los pines, verifica los registros de adc.

saludos.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re:Traducción CCS a XC8 para AD9850
« Respuesta #2 en: 13 de Diciembre de 2017, 18:30:40 »
Hola micro_pepe, hace unas semanas estuve haciendo un codigo para pic16f1936 en XC8, y tuve problemas en los pines con salidas erróneas pero se debió a que no configuré bien los pines, verifica los registros de adc.

saludos.

Efectivamente es algún problema con los pin, he probado a usar otros pines del micro y funciona, pero con los que quiero usar, C0, C1, C2 y C5, no logro dar que tengo que deshabilitar, de momento he probado esto sin éxito:

Código: C
  1. PMD0bits.CCP2MD = 1;//Deshabilitar el modulo CCP2.
  2.     T1CONbits.SOSCEN = 0;//Deshabilita el soscen.
  3.     T1CONbits.TMR1CS = 0;
  4.     ODCONbits.SSPOD = 0;//Open-drain capability disabled

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 micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re:Traducción CCS a XC8 para AD9850
« Respuesta #3 en: 13 de Diciembre de 2017, 19:24:18 »
Solucionado  :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/

Era un error de configuración de los fuses, en concreto este:

Código: C
  1. #pragma config SOSCSEL = DIG    // SOSC Power Selection and mode Configuration bits->Digital (SCLKI) mode

De esa forma funciona como pin I/O.

Gracias, un saludo!!!

EDITO: Ya que abrí el hilo dejo las librerías por si alguien con el buscador del foro topa con este tema y le es útil.
« Última modificación: 13 de Diciembre de 2017, 19:41:34 por micro_pepe »
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.

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