Autor Tema: DSPIC33EP256GP502 Iniciación..  (Leído 493 veces)

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

Desconectado Pinolillo16

  • PIC16
  • ***
  • Mensajes: 183
DSPIC33EP256GP502 Iniciación..
« 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5640
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #1 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.

Desconectado Pinolillo16

  • PIC16
  • ***
  • Mensajes: 183
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #2 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:

osc.PNG
*osc.PNG
(23.71 kB . 426x491 - visto 112 veces)

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.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5640
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #3 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:



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.

Desconectado Pinolillo16

  • PIC16
  • ***
  • Mensajes: 183
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #4 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


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5640
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #5 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.

Desconectado Pinolillo16

  • PIC16
  • ***
  • Mensajes: 183
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #6 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. }
  38.  

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

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2006
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #7 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!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Pinolillo16

  • PIC16
  • ***
  • Mensajes: 183
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #8 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5640
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #9 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 ?.

Desconectado Pinolillo16

  • PIC16
  • ***
  • Mensajes: 183
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #10 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?



Desconectado Pinolillo16

  • PIC16
  • ***
  • Mensajes: 183
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #11 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?


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5640
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #12 en: 26 de Junio de 2017, 21:29:59 »
Si no me equivoco si, es correcto.

Desconectado Pinolillo16

  • PIC16
  • ***
  • Mensajes: 183
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #13 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5640
Re:DSPIC33EP256GP502 Iniciación..
« Respuesta #14 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.


 

anything