TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: Pinolillo16 en 08 de Febrero de 2017, 22:05:52

Título: DSPIC33EP256GP502 Iniciación..
Publicado por: Pinolillo16 en 08 de Febrero de 2017, 22:05:52
Hola amigos de todo pic, verán me regalaron unos dspic33ep pero jamas los he trabajado. Quisiera empezar a manejarlos ya que solo me he enfocado a usar los 16 y 18f en asm. Realmente quisiera aprender de estos dspic, pero antes de comenzar quisiera que me dijeran uds. como puedo comenzar, quisiera algo básico y después probar sus perifericos. Despues de bajar el xc16 que debo hacer?

Saludos
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: KILLERJC en 09 de Febrero de 2017, 09:27:25
Citar
Despues de bajar el xc16 que debo hacer?

Podrias comenzar con ejemplos simples, como parpadear un LED, Ya que por lo que parece conoces lo que es ASM, asi que vas a saber ubicar los registros en el datasheet del microcontrolador y XC es parecido a un ASM pero en C. No se que conocimiento tengas de C.

No solo se te va a complicar por la cantidad nueva de registros que tenes sino que ademas vas a tener problemas con el lenguaje si es que no lo conoces. Ahora si conoces C, lo mismo te aconsejaria ir por ese lado. Pero te resultaria mucho mas facil.

ASM en dsPIC es muy distinto a la flia PIC16 y PIC18, yo hice un hilo con algo de dsPIC, mirando las rutinas de inicializacion, cambiandolas, siempre usando XC16 como base, pero programando en ASM, aun asi para lo unico que se usa es cuando se necesita aprovechar al maximo las operaciones DSP.

http://www.todopic.com.ar/foros/index.php?topic=45240.msg376311#msg376311

Pero no te lo recomiendo para empezar por que cambia todo, mejor hacer algo simple, como intentar usar un timer, encender un led, etc. Luego de alli queda en vos como avanzar.
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: Pinolillo16 en 09 de Febrero de 2017, 22:39:26
KillerJC gracias, bien de C conozco lo básico. La idea es aprender y progresar, veras en ASM me ha pasado que se me complica el código cuando debo de hacer operaciones con flotante, ahi la necesidad de comenzar a utilizar C para aplicaciones con mas procesamiento. Realmente no  me ha sido posible encontrar algun sitio donde este paso a paso la programación de DSPICs bueno al menos no que haya visto, entonces quiero colaborar haciendo lo mio y si no es mucho pedir con ayuda tuya y de los participantes de este foro.

No conozco mucho al respecto pero en los minutos que acabo de leer, encontre lo siguiente:

- Los DSP y PIC24F de 16 Bits, funcionan a mas velocidad que cualquier 16 o 18F. Con ciclo de instrucción de FOSC/2. Los datasheet veo que estan muy completos e inclusive por bloques en general. Estuve leyendo el "Oscillator Module" para iniciar por la configuración del oscilador. Se me hizo algo complejo poder comprenderlo, asi que opte por la funcion de code configurator del MPLABX, de donde obtengo lo siguiente:

- Tienes que ingresar para ver archivos adjuntos -

Si quiero aprovechar la velocidad es correcta esta configuración?

Aqui las dudas:

No comprendo bien como afecta el feedback.

Al generar el codigo me arroja un main y varios .h donde esta la configuracion.

Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: KILLERJC en 10 de Febrero de 2017, 08:48:21
Si el oscilador toma unos cuantos pasos mas.. En realidad lo que se complica es el PLL, ya que posee mas pasos para llegar a la frecuencia final.

En si lo unico que te importa de como calcularlo es esta imagen:

(https://microchip.wdfiles.com/local--files/16bit:osc-pll-80mhzpll/80mhzpll.png)

En ella no solo vas a ver los divisores, sino que ademas tenes que cumplir de forma exacta con los limites ( los valores de los limites en la imagen son incorrectos, referite a la seccion "oscillator" ) que te impone cada etapa.
Otro cambio es que usualmente comenzabas calculando desde el cristal hacia el PLL. Ahora simplemente calculas lo externo al PLL tratando de cumplir las condiciones del mismo, para luego finalizar con el valor del PLL.

En el PDF explica como calcularlo, ejemplo, si queres tener 120Mhz a la salida del PLL. Comenzas calculando primero PLLPOST.
Segun la imagen tenes que cumplir que antes del PLLPOST la frecuencia tiene que ser de : 120Mhz <= Fvco <=340 Mhz
Los valores de PLLPOST son dividido 2/4/8/16 etc.. Si uso dividido 4 quiere decir que antes tenia 480Mhz lo cual es imposible, entonces tengo que usar dividido 2, lo cual me deja a Fvco en 240Mhz y esta en el rango permitido.

Ahora me voy al comienzo. con PLLPRE y me dice que a la salida debo tener si o si entre 0.8MHz y 8MHz, si poseo un cristal de 20Mhz y los valores de PLLPRE pueden ser 1/2/3/4/5/6/10/12
Debo elegir un valor tal que me caiga en esos limites, ademas lo ideal seria elegir un valor aproximado que sea al dividir 240MHz ( lo anterior) sea lo mas entero posible.
Si elegimos PLLPRE en la relacion 1:4, a la salida tendremos 5Mhz

Ahora solo resta calcular el PLLDIV ( o de feedback, que es el que compone realmente el PLL, los demas son divisores solamente ), Y lo calculamos como:

240MHz / 5MHz = 48

O para que se entienda... Realmente el PLL es la parte central, la cual debe ingresar una frecuencia entre 0.8 y 8MHz y posee una salida de entre 120 y 340MHz, se deben cumplir estos valores para que el PLL se enganche y funcione.

Los codigos te los da el mismos datasheet:


Código: C
  1. // Oscilador interno al inicio y deshabilita el cambio automatico al oscilador principal, FUSES
  2. _FOSCSEL(FNOSC_FRC & IESO_OFF);
  3.  
  4. // Habilita el cambio de clock y configura el oscilador principal POSC en modo XT
  5. _FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT);
  6.  
  7. int main()
  8. {
  9.  
  10. // Configure PLL prescaler, PLL postscaler, PLL divisor
  11. PLLFBD=46; // M=48
  12. CLKDIVbits.PLLPOST=0; // N2=2
  13. CLKDIVbits.PLLPRE=2; // N1=4
  14.  
  15. // Inicio cambio de clock Al oscilador Primario con POLL (NOSC=0b011)
  16. __builtin_write_OSCCONH(0x03);
  17. __builtin_write_OSCCONL(OSCCON | 0x01);
  18.  
  19. // Espera hasta el cambio de clock
  20. while (OSCCONbits.COSC!= 0b011);
  21.  
  22. // Espera hasta que el PLL enganche
  23. while (OSCCONbits.LOCK!= 1);

Una cosa mas, vas a ver que posee una funcion  __builtin, esto es porque ese registro ademas de escribirse simplemente uno debe realizar una secuencia, es un modo de proteccion contra un cambio involuntario. Por eso mismo se usan estas funciones.
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: Pinolillo16 en 13 de Febrero de 2017, 22:08:28
Killer , gracias por la respuesta. Caray veo que si es mas complejo de lo que esperaba. Estuve leyendo y tratando de comprender, corrigeme si me equivoco.

En la entrada del PFD como lo dice la imagen debo tener entrada entre: 0.8Mhz y 8Mhz. Como yo uso cristal de 20MHZ lo divido entre 4 con la instrucción CLKDIVbits.PLLPRE=2; // N1=4 aqui ya esta en rango por que son 5Mhz.

Después el PLLPOST lo configure con 0, del datasheet asumo que la frecuencia de salida es dividida entre 2, debido a los bits que configure.

El FeedBack me ayuda a poder multiplicar mi frecuencia de trabajo para llevarla a los limites permititdos tal como lo mencionas supongo.

Entonces concluyo lo siguiente:

- Mi oscilador es HS de 20 Mhz, para meterlo en rango al PLL lo divido entre 4 para que quede en 5Mhz y este a su vez es multiplicado por 48 para alcanzar una FVCO ( Frecuencia de Salida PLL + Feedback segun entiendo)llegando a 240Mhz, con el PLL post divido la frecuencia una vez mas para que ya empiece a funcionar mi sistema con FVCO/2 según lo configure, si esto es correcto significa que una vez que se ejecuta el cambio mi DSP estara trabajando a 120Mhz?

Encontre el código solo que mi pregunta es en lo siguiente:

_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT);

No deberia cambiarlo por HS.

Ahora y para sacarle jugo, es mejor con oscilador interno o externo? Siempre me ha gustado llevar los PICs a su máxima velocidad, en este quiero hacer lo mismo. En la hoja de datos dice que corre a 70 MIPS, segun como lo configure anteriormente estaria en 60 MIPS?

Saludos

Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: KILLERJC en 23 de Febrero de 2017, 15:44:35
Citar
- Mi oscilador es HS de 20 Mhz, para meterlo en rango al PLL lo divido entre 4 para que quede en 5Mhz y este a su vez es multiplicado por 48 para alcanzar una FVCO ( Frecuencia de Salida PLL + Feedback segun entiendo)llegando a 240Mhz, con el PLL post divido la frecuencia una vez mas para que ya empiece a funcionar mi sistema con FVCO/2 según lo configure, si esto es correcto significa que una vez que se ejecuta el cambio mi DSP estara trabajando a 120Mhz?

Correcto

Citar
No deberia cambiarlo por HS.

Deberias hacerlo. La regla Microchip fue siempre de que >4Mhz es HS.

Citar
Ahora y para sacarle jugo, es mejor con oscilador interno o externo? Siempre me ha gustado llevar los PICs a su máxima velocidad, en este quiero hacer lo mismo. En la hoja de datos dice que corre a 70 MIPS, segun como lo configure anteriormente estaria en 60 MIPS?

Cualquiera... El Interno tiene mas error. es decir no es exactametne la frecuencia que dice tener.. PEEEEEEEEERO si eso no te importa entonces dale para adelante. Ademas al interno lo podes hacer pasar por el PLL tambien. Deberias probarlo ponerlo a 140Mhz, segun la hoja de datos dice que si.
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: Pinolillo16 en 26 de Junio de 2017, 03:05:02
Deje un poco pendiente este post debido al trabajo, me dispuse nuevamente a darle continuidad pero me encontre más problemas.

Lei sobre como programarlo y me encuentro con que tiene 3 pares de pines PGD y PGC. En la hoja de especificaciones me indica que con cualquiera de los tres me sirve. Mi codigo es el siguiente:
Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. #include <xc.h>
  6. #include <libpic30.h>
  7.  
  8. // Select Internal FRC at POR
  9. _FOSCSEL(FNOSC_FRC & IESO_OFF);
  10. // Enable Clock Switching and Configure Primary Oscillator in XT mode
  11. _FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_NONE);
  12. int main()
  13. {
  14. // Configure PLL prescaler, PLL postscaler, PLL divisor
  15. PLLFBD=63; // M=65
  16. CLKDIVbits.PLLPOST=0; // N2=2
  17. CLKDIVbits.PLLPRE=1; // N1=3
  18. // Initiate Clock Switch to FRC oscillator with PLL (NOSC=0b001)
  19. __builtin_write_OSCCONH(0x01);
  20. __builtin_write_OSCCONL(OSCCON | 0x01);
  21. // Wait for Clock switch to occur
  22. while (OSCCONbits.COSC!= 0b001);
  23. // Wait for PLL to lock
  24. while (OSCCONbits.LOCK!= 1);
  25.  
  26. TRISB = 0;
  27.  
  28. while (1) {
  29.         LATB = 0;
  30.         __delay32(15000000);
  31.         LATB = 1;
  32.         __delay32(15000000);
  33.     }
  34.  
  35.     return 0;
  36.  
  37. }

No tenia a la mano el cristal de 20MHZ por eso me dispuse a ocupar el interno, con el ejemplo de la hoja.

Compila bien y todo, el detalle estuvo que con PGD1 y PGC1 no me lo quiso programar, los movi al 3 y solo lo cargo una vez sin hacer nada, despues corregi al latb en lugar de portb y ahora ya no quiere cargar los demas codigos, alguien me podria echar una mano para poder aprender a manejar estos micros.

Gracias
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: manwenwe en 26 de Junio de 2017, 03:35:46
Respecto a PGCx/PGDx, tienes que decirle tu a través de fuses que alternativas vas a usar. ¿Es MPLAB o MPLABx? en el primero puedes configurar fuses desde el mismo IDE, en el segundo desde Harmony. Tambien puedes ponerlos en el código.

Saludos!
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: Pinolillo16 en 26 de Junio de 2017, 19:32:03
Si es MPLAB X el codigo, lo postee arriba, ya corregi lo que me recomendaste pero sigue sin poder programar, la leyenda que me arroja es:


Connecting to MPLAB PICkit 3...

Currently loaded firmware on PICkit 3
Firmware Suite Version.....01.46.14
Firmware type..............dsPIC33E/24E

Programmer to target power is enabled - VDD = 3.250000 volts.
Target device dsPIC33EP256MC502 found.
Device ID Revision = 4003

Device Erased...

Programming...

The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0x3ff
configuration memory
Failed to program device

Que puede estar Pasando?

He revisado mis conexiones una y otra vez inclusive las cambie. Pero se me hace extraño que pueda leer el dsPic y no programarlo.
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: KILLERJC en 26 de Junio de 2017, 19:41:39
La unica diferencia entre leer y programar es el voltaje de programacion. Es correcto el circuito del MCLR ?.
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: Pinolillo16 en 26 de Junio de 2017, 20:39:14
Exactamente, detecte que el voltaje caia un poco si lo alimentaba del PicKit 3. Por lo que opte por ponerle una fuente externa y ahora funciona  :-/ :-/ :-/

Bueno puedo decir que es mi primer blink en dspic jeje se que para muchos no es gran cosa pero es bueno para mi.

El codigo quedo de la siguiente manera:
Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <xc.h>
  4. #include <libpic30.h>
  5.  
  6. #pragma config  ICS = PGD3               // Comm Channel Select (Communicate on PGC1/EMUC1 and PGD1/EMUD1)
  7. #pragma config  JTAGEN = OFF             // JTAG Port Enable (JTAG is Disabled)
  8. #pragma config  FNOSC= FRC
  9. #pragma config  IESO= OFF
  10. #pragma config  FCKSM= CSECMD
  11. #pragma config  OSCIOFNC=OFF
  12. #pragma config  POSCMD=NONE
  13.  
  14. int main()
  15. {
  16.  // Configure PLL prescaler, PLL postscaler, PLL divisor
  17.  PLLFBD=63; // M=65
  18.  CLKDIVbits.PLLPOST=0; // N2=2
  19.  CLKDIVbits.PLLPRE=1; // N1=3
  20. // Initiate Clock Switch to FRC oscillator with PLL (NOSC=0b001)
  21.  __builtin_write_OSCCONH(0x01);
  22.  __builtin_write_OSCCONL(OSCCON | 0x01);
  23.  // Wait for Clock switch to occur
  24.  while (OSCCONbits.COSC!= 0b001);
  25.  // Wait for PLL to lock
  26.  while (OSCCONbits.LOCK!= 1);
  27.  TRISB = 0x0000;
  28.  
  29. while (1)
  30.     {
  31.       LATB = 0XFFFF;
  32.       __delay32(15000000);
  33.       LATB = 0;
  34.       __delay32(15000000);
  35.     }
  36.  
  37.     return 0;
  38.  
  39. }

Utilice el oscilador interno, ahora mi duda es a que velocidad realmente esta corriendo?


Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: Pinolillo16 en 26 de Junio de 2017, 21:07:49
Analizando el codigo, en la parte de oscilador del dsp me indica que el ejemplo es para un oscilador interno de 7.37Mhz

PLLFBD=63; // M=65
CLKDIVbits.PLLPOST=0; // N2=2
CLKDIVbits.PLLPRE=1; // N1=3


Con esta configuración.

De acuerdo a lo anteriormente visto:

Divido esta fecuencia entre 3 me indica el PLLPRE=1

Con esta operación obtengo una frecuencia de 2.456666667 MHz

Después el PLLFBD=63 ; lo voy a multiplicar por 65. Y asi llego a 159.6833333 Mhz

Por ultimo lo divido entre 2 para quedar en 79.84166667 Mhz

Esto es correcto?

Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: KILLERJC en 26 de Junio de 2017, 21:29:59
Si no me equivoco si, es correcto.
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: Pinolillo16 en 28 de Junio de 2017, 21:05:29
Ok, parece entonces que me ha quedado al menos un poco claro lo del oscilador. Ahora quiero seguir explorando este DSP y me he dispuesto a conocer el modulo ADC, solo que encontre un termino muy usado en los DSP y me causo algo de conflicto entenderlo. Asi que nuevamente aqui con mis dudas:

DMA lo encontré en todo el data (Direct Memory Access). Me causo algo de intriga lo que esto significa e investigue un poco, es un acceso a memoria directo,  :shock:
The DMA Controller supports 4 independent channels.
Each channel can be configured for transfers to or from
selected peripherals. Some of the peripherals
supported by the DMA Controller include:
• ECAN™
• Analog-to-Digital Converter (ADC)
• Serial Peripheral Interface (SPI)
• UART
• Input Capture
• Output Compare

Me dice que el DMA puede estar ejecutando acciones de lectura y/o escritura de la memoria a los perifericos?

Si esto es correcto, puedo entonces usar el DSP solo para operaciones u otras acciones mientras el DMA me ayuda a procesar algunos datos de los perifericos?

De ser así en que memoria encuentro estos datos y como lo controlo?

Saludos
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: KILLERJC en 28 de Junio de 2017, 23:48:11
El DMA te permite llevar datos (no procesarlos) de un lado a otro, hablando en general ya que no recuerdo exactamente como son los del dsPIC, el DMA se puede disparar ( inciar )

- Manualmente
- Timer
- Cuando termina de convertir el ADC
- Tal ves algun modulo como los SPI

Y la transmision de datos puede ser de:

- Memoria a memoria ( de un array a otro por ejemplo)
- Memoria a periferico ( de un array a un modulo como un SPI)
- Periferico a memoria ( del ADC a un array )
- Periferico a periferico ( este en realidad estoy en ddua, pero seguramente existe )

En si lo que te permite es que se transfieran datos de forma "automatica" sin necesidad que el core/nucleo del micro sea quien genere estas instrucciones. Vos programas el DMA y de alli en adelante lo hace solo liberando al nucleo de ese trabajo.
Creo que cada fabricante provee un DMA con distintas funcionalidades.

Ejemplo, suponete que lees con el ADC y tenes una FIFO de 4 lecturas, se barajan las distintas opciones:

- Opcion 1, interrumpir en cada lectura y guardar el dato en un array en memoria. Esto requiere que el micro entre a la interrupcion 4 veces y haga todas las instrucciones de traslado.
- Opcion 2, en caso de que el ADC posea una interrupcion configurable cuadno este full, podrias resumir lo anteriorior en 1 entrada a la interrupcion.
- Opcion 3, en caso de poseer DMA, podrias configurarlo para que cuando termine de convertir el ADC dispare el DMA y automaticamente sin intervencion del nucleo llevar ese dato a memoria.

Esto es particularmente util cuando hablamos de tiempos. Aca un ejemplo bastante grafico dado por elgarbe:

http://www.todopic.com.ar/foros/index.php?topic=47674.0

Tambien cuando termina el DMA de transferir se puede generar una interrupcion.
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: Pinolillo16 en 29 de Junio de 2017, 02:57:45
Vaya que cosa mas buena, sin duda una buena herramienta. Como lo explicó elgarbe ayuda muchisimo, no solo en transportar datos. Me imagino para manejar pantallas gráficas donde requieres mandar muchos datos el DMA hace a un micro muy robusto. Como mencione anteriormente, no me habia dado a la tarea de poder manejar micros fuera de los 16F y 18F. Ahora con mas entusiasmo quiero seguir conociendolos, voy a probar el ADC con y sin DMA haber que sucede. KillerJC muchas gracias.

 ((:-))
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: Pinolillo16 en 02 de Julio de 2017, 03:23:18
Después de leer la sección de ADC y tratar de comprender los ejemplos, tomé el más simple de los ejemplos. Código

Código: C
  1. #include <p33Exxxx.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <xc.h>
  5. #include <libpic30.h>
  6.  
  7. #pragma config  ICS = PGD3               // Comm Channel Select (Communicate on PGC1/EMUC1 and PGD1/EMUD1)
  8. #pragma config  JTAGEN = OFF             // JTAG Port Enable (JTAG is Disabled)
  9. #pragma config  FNOSC= FRC
  10. #pragma config  IESO= OFF
  11. #pragma config  FCKSM= CSECMD
  12. #pragma config  OSCIOFNC=OFF
  13. #pragma config  POSCMD=NONE
  14.  
  15.  
  16. void initAdc1(void);
  17. void Delay_us(unsigned int);
  18. int ADCValue, i, j;
  19.  
  20. int main()
  21. {
  22.  // Configure PLL prescaler, PLL postscaler, PLL divisor
  23.  PLLFBD=63; // M=65
  24.  CLKDIVbits.PLLPOST=0; // N2=2
  25.  CLKDIVbits.PLLPRE=1; // N1=3
  26. // Initiate Clock Switch to FRC oscillator with PLL (NOSC=0b001)
  27.  __builtin_write_OSCCONH(0x01);
  28.  __builtin_write_OSCCONL(OSCCON | 0x01);
  29.  // Wait for Clock switch to occur
  30.  while (OSCCONbits.COSC!= 0b001);
  31.  // Wait for PLL to lock
  32.  while (OSCCONbits.LOCK!= 1);
  33.  TRISB=0X0000;
  34.  
  35.  initAdc1();
  36.  
  37.  while(1)
  38.  {
  39.   Delay_us(100); // Sample for 100 us
  40.   AD1CON1bits.SAMP = 0; // Start the conversion
  41.   while (!AD1CON1bits.DONE); // Wait for the conversion to complete
  42.   AD1CON1bits.DONE = 0; // Clear conversion done status bit
  43.   ADCValue = ADC1BUF0; // Read the ADC conversion result
  44. //  LATB=ADCValue;
  45.   if(ADCValue >= 1300)
  46.   {
  47.       LATBbits.LATB6=1;
  48.   }
  49.   else
  50.   {
  51.       LATBbits.LATB6=0;
  52.   }
  53.  
  54.  }
  55. }
  56.  
  57. void initAdc1(void)
  58. {
  59. /* Set port configuration */
  60. TRISAbits.TRISA0=1;
  61. ANSELA = ANSELB = 0x0000;
  62. ANSELAbits.ANSA0 = 1; // Ensure AN5/RB5 is analog
  63. /* Initialize and enable ADC module */
  64. AD1CON1 = 0x0004;
  65. AD1CON2 = 0x0000;
  66. AD1CON3 = 0x00FF;
  67. AD1CON4 = 0x0000;
  68. AD1CHS0 = 0x0005;
  69. AD1CHS123 = 0x0000;
  70. AD1CSSH = 0x0000;
  71. AD1CSSL = 0x0000;
  72. AD1CON1bits.ADON = 1;
  73. Delay_us(20);
  74. }
  75. void Delay_us(unsigned int delay)
  76. {
  77. for (i = 0; i < delay; i++)
  78.   {
  79.     __asm__ volatile ("repeat #39");
  80.     __asm__ volatile ("nop");
  81.   }
  82. }

Leí los registros, y creo que estan bien. Ya que en los AD1CON solo configuro lectura manual sin DMA, el código ejemplo es de otro canal y lo cambié al CH0 del ADC. Para poder comprobar el funcionamiento del mismo, he realizado una pequeña comparación del dato obtenido pero no tengo resultado alguno.  :(

Que podria estar mal?

Saludos
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: KILLERJC en 02 de Julio de 2017, 19:52:48
La diferencia del ADC con los demas PICs , es que podes controlar el sampling y la conversion independientemente, ademas posees 4 S/H
Y no solo eso, sino que cuando los lei me di cuenta el DESASTRE que hicieron los de Microchip en documentar estos micros. Es la peor documentacion que eh visto. Por que trata las cosas muy generales, y encima tenes que abrir cerca de 4 documentos mas para ver un modulo, Ej.. para el ADC tenes que tener el datasheet del micro + datasheet de los pines configurables/alternativos, etc. Sinceramente lo lees y en ves de explicarte te llena de mas dudas.

Vos queres:
- Sampleo automatico
- Conversion manualmente.

Una cosa que tiene una nota:

Citar
Do not clear the DONE bit in software if ADC Sample Auto-Start is enabled (ASAM = 1).
Lo raro es que el codigo que te provee Microchip posee la limpieza del bit DONE.

Creo que tu problema se encuentra en:

Código: C
  1. AD1CHS0 = 0x0005;

El cual deberia ser para unir AN0 con CH0

Código: C
  1. AD1CHS0 = 0x0000;

Otra cosa mas, el tema de los tiempos

Código: C
  1. AD1CON3 = 0x00FF;

Como es auto-sampling deberias darle tiempo, No deberias dejarlo en 0 TAD, hay una acotacion en el datasheet. Imagino que podrias utilizar el oscilador interno que posee el ADC, Por las dudas tambien seleccionamos 31 TAD en el Sampling dejando:

Código: C
  1. AD1CON3 = 0xFF00;

-----------------------------------------------------------

PD... me parecio raro que no posea un delay, entonces busque y encontre esto en el MPLAB® XC16 C Compiler User’s Guide:

Citar
3.5.7 How Can I Implement a Delay in My Code?
Using a device timer to generate a delay is the best method. If no time is available, then
you can use the library functions _delay32, __delay_ms, or __delay_us, as they
are described in the following document. It is available for download from the Microchip
Technology website, www.microchip.com.
“16-Bit Language Tools Libraries Reference Manual” (DS50001456)

El tema es que buscas ese archivo y no dice NADA de NADA de delays, podrias probar ponerlo y ver si funciona.
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: Pinolillo16 en 03 de Julio de 2017, 02:52:56
 :shock: si fue exactamente eso Killer, el codigo quedo asi:

Código: C
  1. #include <p33Exxxx.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <xc.h>
  5. #include <libpic30.h>
  6.  
  7. #pragma config  ICS = PGD3               // Comm Channel Select (Communicate on PGC1/EMUC1 and PGD1/EMUD1)
  8. #pragma config  JTAGEN = OFF             // JTAG Port Enable (JTAG is Disabled)
  9. #pragma config  FNOSC= FRC
  10. #pragma config  IESO= OFF
  11. #pragma config  FCKSM= CSECMD
  12. #pragma config  OSCIOFNC=OFF
  13. #pragma config  POSCMD=NONE
  14.  
  15.  
  16. void initAdc1(void);
  17. void Delay_us(unsigned int);
  18. int ADCValue, i, j;
  19.  
  20. int main()
  21. {
  22.  // Configure PLL prescaler, PLL postscaler, PLL divisor
  23.  PLLFBD=63; // M=65
  24.  CLKDIVbits.PLLPOST=0; // N2=2
  25.  CLKDIVbits.PLLPRE=1; // N1=3
  26. // Initiate Clock Switch to FRC oscillator with PLL (NOSC=0b001)
  27.  __builtin_write_OSCCONH(0x01);
  28.  __builtin_write_OSCCONL(OSCCON | 0x01);
  29.  // Wait for Clock switch to occur
  30.  while (OSCCONbits.COSC!= 0b001);
  31.  // Wait for PLL to lock
  32.  while (OSCCONbits.LOCK!= 1);
  33.  TRISB=0X0000;
  34.  
  35.  initAdc1();
  36.  
  37.  while(1)
  38.  {
  39.   Delay_us(100); // Sample for 100 us
  40.   AD1CON1bits.SAMP = 0; // Start the conversion
  41.   while (!AD1CON1bits.DONE); // Wait for the conversion to complete
  42.   AD1CON1bits.DONE = 0; // Clear conversion done status bit
  43.   ADCValue = ADC1BUF0; // Read the ADC conversion result
  44. //  LATB=ADCValue;
  45.   if(ADCValue >= 800)
  46.   {
  47.       LATBbits.LATB6=1;
  48.   }
  49.   else
  50.   {
  51.       LATBbits.LATB6=0;
  52.   }
  53.  
  54.  }
  55. }
  56.  
  57. void initAdc1(void)
  58. {
  59. /* Set port configuration */
  60. TRISAbits.TRISA0=1;
  61. ANSELA = ANSELB = 0x0000;
  62. ANSELAbits.ANSA0 = 1; // Ensure AN5/RB5 is analog
  63. /* Initialize and enable ADC module */
  64. AD1CON1 = 0x0004;
  65. AD1CON2 = 0x0000;
  66. AD1CON3 = 0xFF00;
  67. AD1CON4 = 0x0000;
  68. AD1CHS0 = 0x0000;
  69. AD1CHS123 = 0x0000;
  70. AD1CSSH = 0x0000;
  71. AD1CSSL = 0x0000;
  72. AD1CON1bits.ADON = 1;
  73. Delay_us(20);
  74. }
  75. void Delay_us(unsigned int delay)
  76. {
  77. for (i = 0; i < delay; i++)
  78.   {
  79.     __asm__ volatile ("repeat #39");
  80.     __asm__ volatile ("nop");
  81.   }
  82. }

Dados los consejos, lei nuevamente el manual ADC. Lo del tiempo creo que lo entiendo un poco ya que el mismo manual me dice, que solo deje TDA en 0 cuando es lectura simultanea para poder hacerlo más rápido. Ahora no me queda del todo claro lo del AD1CHS0, lo tenia igual a= 0x0005. Y para que funcione me indica que es 0x0000... Mi lógica indica que esto funciona asi debido a los registros y pines del puerto A, como el pin correspondiente al ADC0 esta en RA0. Por eso le coloco este 0? Digo mi lógica dice que es por esa razon, ya que el ejemplo del manual indica tener el ADC0 en RB5....

Cuando volvi a ver la información del manual entiendo lo siguiente:

- Tienes que ingresar para ver archivos adjuntos -

 :D

Bueno continuo la respuesta, ahora mismo que queria subir la información abri el datasheet sobre el mismo registro:

- Tienes que ingresar para ver archivos adjuntos -

Y queda todo claro. Tienes razón sobre la documentación, tienes que abrir muchos archivos. No me quedaba del todo claro porque había tanta información y creo que ahora solo necesito revisar todos los documentos ejemplo y luego el data sheet para saber que sucede.

Nuevamente gracias Killer por tus sabios consejos, bien. Me dispondré a probar ahora con el DMA pero, antes creo que voy a realizar algún código con SPI para poder ver la diferencia, o que será mejor probar un PWM? Quisiera saber que tan poderoso es el DMA y a la vez que tan latoso, pero necesito algo donde pueda ver datos procesados por el DSP vs el DMA por eso quisiera mostrarlos en alguna pantalla. Como son dispositivos completamente nuevos me gustaría que me dieran alguna sugerencia para practicar más y que si pueda hacerla. Voy directo a la pantalla? o exploro poco a poco los módulos?
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: KILLERJC en 03 de Julio de 2017, 16:06:57
El DMA es mejor verlo con una comunicacion, y que mejor un SPI o una UART para eso. Ejemplo llena un buffer y luego dispara el DMA, mientras haces NADA. y que solo se encargue de llevar los datos.

Respecto a los modulos la verdad que yo solo me pondria a renegar solo si necesito hacerlo, si queres probar adelante. Ejemplo multiple sampling y demas. Al igual que si uqeres ir incrementalmente, pone la interrupcion, y que en ves de saltar a la primer lectura lo hagas en la 4ta por ejemplo.

Y mas que nada, ya comenzaria a jugar con las librerias, no se si vale la pena ya en un micro de ese tamaño ir por registros, mas cuando son 478174138993 miles de estos.
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: Pinolillo16 en 10 de Agosto de 2017, 17:42:57
Colegas del foro, seguiré alimentando este tema. Lo último que estuve estudiando fue el DMA, que pensaba utilizarlo en ADCs pero siguiendo el conejo de KillerJC no vale la pena en ese modulo es mejor en una comunicación, asi que me dispuse a diseñar y montar una tarjeta con DSP que tenia a la mano, DSPIC33EP256MC504 en QFN. Ya que cuento con varios de ellos quise comenzar a conocerlos de una manera mas profunda y bueno el resultado es este:

- Tienes que ingresar para ver archivos adjuntos -

Recien recibi las tarjetas solde los componentes y fue buena la primera prueba ya que los leds prendieron  :-/ meti unos 0402 que casi no veia.

- Tienes que ingresar para ver archivos adjuntos -

Como veran le deje los pines compatibles para una OLED de I2C. Estare testeando más codigos para ver que tal funcionan.

Espero sus observaciones colegas.

- Tienes que ingresar para ver archivos adjuntos -

PD: KillerJC en un post anterior me dijo que estaba dificil poder montar un entrenador completo ya que a veces faltaban cosas o sobraban, en mi caso solo fue el gusto.

Saludos
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: KILLERJC en 10 de Agosto de 2017, 18:30:54
Citar
PD: KillerJC en un post anterior me dijo que estaba dificil poder montar un entrenador completo ya que a veces faltaban cosas o sobraban, en mi caso solo fue el gusto.

Es complejo y se hace gigante la placa para lograr hacer que todo se pueda con los pines. Pero lo que hiciste no lo veo como una entrenadora sino una placa de evaluacion que es perfecta para probar cualquier cosa. Ya que teniendo los pines a disposicion podes conectar lo que sea sobre un protoboard, mientras que una entrenadora tenes lo que tenes en la placa.
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: Pinolillo16 en 27 de Agosto de 2017, 21:32:18
Con un poco de tiempo, estuve intentando usar el code configurator. Me pueden apoyar?

Al configurar el I2C en el canal dos con el code configurator. Me manda esta funcion en C:

Código: C
  1. void I2C2_MasterWrite(
  2.                                 uint8_t *pdata,
  3.                                 uint8_t length,
  4.                                 uint16_t address,
  5.                                 I2C2_MESSAGE_STATUS *pstatus)
  6. {
  7.     static I2C2_TRANSACTION_REQUEST_BLOCK   trBlock;
  8.  
  9.     // check if there is space in the queue
  10.     if (i2c2_object.trStatus.s.full != true)
  11.     {
  12.         I2C2_MasterWriteTRBBuild(&trBlock, pdata, length, address);
  13.         I2C2_MasterTRBInsert(1, &trBlock, pstatus);
  14.     }
  15.     else
  16.     {
  17.         *pstatus = I2C2_MESSAGE_FAIL;
  18.     }
  19.  
  20. }

Para el archivo .h generado tengo:

Código: C
  1. void I2C2_MasterWrite(
  2.                                 uint8_t *pdata,
  3.                                 uint8_t length,
  4.                                 uint16_t address,
  5.                                 I2C2_MESSAGE_STATUS *pstatus);

Mis dudas son:

Para el I2C no se supone que mandamos primero Address? porque estuve tratando de entender la secuencia que me arroja ya que pienso utilizarlo para manejar un LCD oled con controlador SSD13006.

Pero antes de continuar me gustaria saber si alguno de ustedes ya ha usado el codigo del code configurator? Que me ayudara a entender. O sera mejor hacerlo por uno mismo?

Saludos
Título: Re:DSPIC33EP256GP502 Iniciación..
Publicado por: KILLERJC en 27 de Agosto de 2017, 22:09:15
Dentro de ese archivo podes ver que hace las 2 funciones.

el I2C2_MasterWriteTRBBuild rellena la estructura trBlock con la direccion, largo y el puntero a los datos. Ya que esta estructura es la que acepta la proxima funcion.
el I2C2_MasterTRBInsert inserta ese trBlock en un Queue de largo (I2C2_CONFIG_TR_QUEUE_LENGTH) para que luego sea enviado.

De aca luego lo dirije a la interrupcion (disparandolo poniendo el flag a 1), al menos es el codigo que vi yo, tampoco se si es el mismo ya que este es un dsPIC. Ahi dentro de la interrupcion tiene una maquina de estado. Entra y envia la direccion, luego los datos, etc.

Esto esta en la funcion I2C2_ISR.

En resumen lo unico que te importa es meter los datos en un array de uint8_t, luego darle la cantidad de datos, y definir la direccion



Simplificado, algo asi en caso de tener un solo dato:

Código: C
  1. uint8_t I2C2_write (uint8_t device_address, uint8_t reg_address, uint8_t wr_data){
  2.     I2C2_MESSAGE_STATUS status = I2C2_MESSAGE_PENDING;
  3.     uint8_t         write_buffer[2];
  4.     write_buffer[0] = reg_address;
  5.     write_buffer[1] = wr_data;
  6.     I2C2_MasterWrite(&write_buffer, 2, device_address, &status);  // pointer la valoarea wr_data
  7.     while(status == I2C2_MESSAGE_PENDING);
  8.     return (status == I2C2_MESSAGE_COMPLETE);
  9. }

Ese  codigo fue sacado de otro lado. Por mi pienso que no es necesario el bloqueo del while que posee, por que ya en la funcion I2C2_MasterTRBInsert, tenes esto:

Código: C
  1. // for interrupt based
  2.     if (*pflag == I2C2_MESSAGE_PENDING)
  3.     {
  4.         while(i2c2_state != S_MASTER_IDLE);
  5.         {
  6.             // force the task to run since we know that the queue has
  7.             // something that needs to be sent
  8.             PIR3bits.SSP2IF = true;
  9.         }
  10.     }   // block until request is complete

Que lo bloquea hasta que salga de ese estado.