Autor Tema: Manejando el DAC del dsPIC33FJ64GP802  (Leído 4885 veces)

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

Desconectado STAI

  • PIC12
  • **
  • Mensajes: 81
Manejando el DAC del dsPIC33FJ64GP802
« en: 09 de Junio de 2009, 15:16:57 »
Hola a todos, ya supe que no se puede simular el funcionamiento del DAC con el MPLAB SIM, entonces lo quice depurar por medio de mi programador (PICkit3), pero tampoco puedo observar su funcionamiento.

Intento cargarle un valor al DAC1RDAT con la variable i pero no se carga, tampoco se activa la bandera de interrupción del DAC (IFS4bits.DAC1RIF), y no hay cambios en el bit de estado DAC1STATbits.RFULL.  Por favor si alguién ya ha manejado el DAC en un dsPIC33F le agradezco inmensamente que me regale unos segundos y revise el código para observar qué puede estar mal.

Código: [Seleccionar]
#include "p33FJ64GP802.h"

//CONFIGURATION BITS
_FBS( BWRP_WRPROTECT_OFF & BSS_NO_FLASH & RBS_NO_RAM )
_FSS( RSS_NO_RAM & SSS_NO_FLASH & SWRP_WRPROTECT_OFF )
_FGS( GSS_OFF & GCP_OFF & GWRP_OFF )
_FOSCSEL(FNOSC_PRIPLL & IESO_ON); // Primary oscillator (XT, HS, EC) w/ PLL, Two-speed Oscillator Startup : Enabled
_FOSC(FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT ); // Clock switching and clock monitor:Disabled & Single configuration for remappable I/O:Disabled & OSC2 is clock O/P & XT oscillator
_FWDT( FWDTEN_OFF & WINDIS_OFF )
_FPOR( ALTI2C_OFF & FPWRT_PWR128 )
_FICD( BKBUG_ON & COE_ON & JTAGEN_OFF & ICS_PGD1 )

unsigned int i = 0;

int main (void)
{
// Oscillator Special Function Control Registers
// Configure Oscillator to operate the device at 40MIPS
// Fosc= Fin*M/(N1*N2), Fcy=Fosc/2 (XT=10MHz)

PLLFBD = 30; //PLL Feedback Divisor bits (also denoted as "M", PLL multiplier) 30 = 32

CLKDIVbits.PLLPRE = 0; //PLL Phase Detector Input Divider bits (also denoted as "N1", PLL prescaler) 0 = 2
CLKDIVbits.PLLPOST = 0; //PLL VCO Output Divider Select bits (also denoted as "N2", PLL postscaler) 0 = 2
//CLKDIVbits.FRCDIV = 0; //Internal Fast RC Oscillator Postscaler bits
CLKDIVbits.DOZEN = 0; //DOZE Mode Enable bit 0 = Processor clock/peripheral clock ratio forced to 1:1
//CLKDIVbits.DOZE = 0; //Processor Clock Reduction Select bits = FCY/1
CLKDIVbits.ROI = 0; //Recover on Interrupt bit 0 = Interrupts have no effect on the DOZEN bit

//OSCTUNbits.TUN = 0; //FRC Oscillator Tuning bits = Center frequency (7.37 MHz nominal)

ACLKCONbits.SELACLK = 0; //0 = FRC with PLL provides the source clock for Auxiliary Clock Divider
ACLKCONbits.AOSCMD = 0; //00 = Auxiliary Oscillator Disabled
ACLKCONbits.APSTSCLR = 7; //Auxiliary Clock Output Divider 7 = /1
//ACLKCONbits.ASRCSEL = 0; //Select Reference Clock Source for Auxiliary Clock 0 = AOSCCLK


DAC1STATbits.ROEN = 1; //Right Channel DAC output enable 1 = enabled
//DAC1STATBITS.LOEN=; //Left Channel DAC output enable

DAC1STATbits.RITYPE = 0; //Right Channel Type of Interrupt 0 = Interrupt if FIFO is NOT FULL.
//DAC1STATBITS.LITYPE=; //Left Channel Type of Interrupt

DAC1STATbits.RMVOEN = 0; //Right Channel Midpoint DAC output voltage enable 0 = disabled
//DAC1STATBITS.LMVOEN=; //Left Channel Midpoint DAC output voltage enable

DAC1CONbits.DACFDIV = 3; //DAC Clock Divider 3 = /4
DAC1CONbits.FORM = 0; //Data Format Select bit 0 = Unsigned integer
//DAC1CONbits.AMPON = 0; //0 = Analog Output Amplifier is disabled during Sleep Mode/Stop-in Idle mode
//DAC1CONbits.DACSIDL = 0; //Stop in Ideal Mode bit 0 = Continue module operation in Idle mode.

DAC1DFLT = 65535; //DAC DEFAULT DATA REGISTER

DAC1CONbits.DACEN = 1; //DAC1 Enable bit 1 = Enables module

IFS4bits.DAC1RIF = 0; // Clear Right Channel Interrupt Flag
//IFS4bits.DAC1LIF = 0; // Clear Left Channel Interrupt Flag */

IPC19bits.DAC1RIP = 7; //7 = Interrupt is priority 7 (highest priority interrupt)
//IPC19bits.DAC1LIP = 0;

IEC4bits.DAC1RIE = 1; // Right Channel Interrupt Enabled
//IEC4bits.DAC1LIE = 1; // Left Channel Interrupt Enabled

// PLLCLK/SELACLK/DACFDIV = DACCLK
// 80 MHz/1/4 = 20 MHz
// Fs = 78.125 KHz

while (1)
{
if ((DAC1STATbits.RFULL == 0 ) && (i <= 65535))
{
DAC1RDAT = i;
if (i == 65535)
{
i = 0;
}
i = i + 1;
}
}
}

void __attribute__((interrupt, no_auto_psv)) _DAC1RInterrupt(void)
{
IFS4bits.DAC1RIF = 0;  // Clear Right Channel Interrupt Flag
}

Nota: Por ahora no tengo osciloscopio para observar una señal.
Álvaro I. Sandoval T.
Ing. en Control Electrónico e Instrumentación

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Manejando el DAC del dsPIC33FJ64GP802
« Respuesta #1 en: 09 de Junio de 2009, 23:12:06 »
Como te comente en el correo debes habilitar el AUXILIARY CLOCK.

Si no tenes un cristal secundario y lo queres derivar del primario, yo haria:

Código: C
  1. ACLKCONbits.SELACLK = 1;       
  2. ACLKCONbits.AOSCMD = 0;
  3. ACLKCONbits.APSTSCLR = 7;
  4. ACLKCONbits.ASRCSEL = 1;

para ver que sucede! y a ver si no ando tan perdido.

Saludos!
Control Automático, DSP & Microcontroladores

Desconectado STAI

  • PIC12
  • **
  • Mensajes: 81
Re: Manejando el DAC del dsPIC33FJ64GP802
« Respuesta #2 en: 10 de Junio de 2009, 15:24:54 »
Hola Daniel muchas gracias por regalarme minutos de su apreciado tiempo.  Hice los cambios que me dijo pero NADA, no se carga DAC1RDAT con el valor de i (DAC1RDAT = i;), tampoco se activa la badera (IFS4bits.DAC1RIF) y tampoco hay cambios en el bit de estado (DAC1STATbits.RFULL)...

Pero como estuve probando varias conbinaciones, hice la siguiente:

ACLKCONbits.SELACLK = 1;   
ACLKCONbits.AOSCMD = 0;      
ACLKCONbits.APSTSCLR = 7;
CLKCONbits.ASRCSEL = 0;

Con ésta configuración no se carga DAC1RDAT con el valor de i, tampoco veo que se active la bandera (IFS4bits.DAC1RIF = 0;), PERO el bit de estado sí cambia (de 0 a 1), y cambia cuando se han supuestamente cargado los cuatro valores al buffer, pero después no vuelve a cambiar se queda en 1, es como si el buffer nunca fuera desocupado por el módulo DAC.


Adjunto envío el proyecto.
« Última modificación: 10 de Junio de 2009, 15:28:15 por STAI »
Álvaro I. Sandoval T.
Ing. en Control Electrónico e Instrumentación

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Manejando el DAC del dsPIC33FJ64GP802
« Respuesta #3 en: 10 de Junio de 2009, 22:46:07 »
Hola ...

¿Qué versión de MPLAB IDE y que versión de MPLAB C30 estás usando?

Lo pregunto porque simulo con MPLAB SIM y el valor del DAC1RDAT se actualiza con el valor de i ... esto no es nada seguro! pues MPLAB SIM aguanta lo que sea.

Yo estoy usando MPLAB IDE v8.3 y MPLAB C30 v3.12 .... viendo el release del C30, es hasta la version 3.12 que el dsPIC64GP802 es soportado.

La version la podes ver en PROJECT -> SELECT LENGUAGE TOOLSUITE ... buscas MPLAB C30 CCompiler (pic30-gcc.exe) v3.12

Tambien observa este ejemplo:

http://ww1.microchip.com/downloads/en/DeviceDoc/CE154_ADC_DAC_Loopback_032608.zip

Consiste en que el DAC "siga" al ADC ... usan DMA.

Saludos!
« Última modificación: 10 de Junio de 2009, 22:49:31 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado STAI

  • PIC12
  • **
  • Mensajes: 81
Re: Manejando el DAC del dsPIC33FJ64GP802
« Respuesta #4 en: 11 de Junio de 2009, 13:14:31 »
Hola Daniel, ya actualice mi mplab ide y el mplab c30, y nada, con la simulación si se carga DAC1RDAT, pero cuando intento depurar no.  Como hago para medir con un multímetro la salida, sin ulizar amplificador, simplemente medir directamente, necesito ponerle una resistencia? y de qué forma sería? pues yo lo programo y le pongo una R=1k entre las salidas y mido y no mide ni voltaje dc ni ac, hermano estoy desesperado con esta vaina...

POR FAVOR SI ALGUIEN ME PUEDE AYUDAR LE AGRADEZCO...
Álvaro I. Sandoval T.
Ing. en Control Electrónico e Instrumentación

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Manejando el DAC del dsPIC33FJ64GP802
« Respuesta #5 en: 11 de Junio de 2009, 14:08:34 »
Corriste el ejemplo de microchip?

Voy a conseguir un dsPIC33FJ128MC804 para ver si funciona bien el código ... saludos!

« Última modificación: 11 de Junio de 2009, 19:47:09 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado STAI

  • PIC12
  • **
  • Mensajes: 81
Re: Manejando el DAC del dsPIC33FJ64GP802
« Respuesta #6 en: 12 de Junio de 2009, 01:23:03 »
Hola Daniel, primero que todo le agradezco por toda su ayuda, ya esta escaseando la gente que colabore... Ya depuré el ejemplo (CE154 - ADC to DAC Loopback) y he llegado a una conclusión, las funciones básicas del DAC con "animate" NO FUNCIONAN, EL DAC NO SE PUEDE NI DEPURAR NI SIMULAR, no se puede ver la activación de las banderas (IFS4bits.DAC1RIF), el cambio de los bit de estado (DAC1STATbits.RFULL) y tampoco se ve que valor se le carga a DAC1RDAT, para probar toca o grabar el dsPIC o darle "RUN" y con osciloscopio en mano observar lo que está pasando, para llegar a esa conclusión monté un circuito con un potenciómetro como entrada (ADC) y con un voltímetro a la salida (DAC), y efectivamente el ejemplo funciona.  Entonces volví a mi proyecto pero como yo no tengo osciloscopio miré con el multímetro en Vac un voltaje RMS y parece que esta haciendo la función, pero aún me falta ponerle un osciloscopio para estar seguro, aunque creo que ya está sacando una señal.  
Quiero excusarme por todas mis molestias en el Foro.
Gracias...
Álvaro I. Sandoval T.
Ing. en Control Electrónico e Instrumentación

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Manejando el DAC del dsPIC33FJ64GP802
« Respuesta #7 en: 12 de Junio de 2009, 21:21:04 »
A bueno que bien!  :-/

Yo tengo un debugger ICD ... para ver si mi programa funciona corro primero el MPLAB SIM (si es necesario ... solo para probar algoritmos) ... pero si debo probar un periferico o algo, la mejor prueba siempre es programar el PIC y debbuguearlo ... con ese metodo he tenido problemas con el I2C y con el SPI (con el ICD2 me pasaba eso con el ICD3 ya no) .. para esos casos pongo el ICD en programmer y  programo el PIC en RELEASE que ya seria el programa definitivo.

Esa funcion de ANIMATE no la conosco.

Saludos!
« Última modificación: 12 de Junio de 2009, 21:27:01 por blackcat »
Control Automático, DSP & Microcontroladores


 

anything