Autor Tema: Se puede simular el funcionamiento del DAC de un dsPIC33F... en el MPLAB SIM?  (Leído 2616 veces)

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

Desconectado STAI

  • PIC12
  • **
  • Mensajes: 81
Buen día séñores estoy tratando de manejar el DAC del dsPIC33FJ64GP802 pero lo trate se simular con el MPLAB SIM y no me funcionó, digo que no me funcionó pues no me entra a la interrupción del DAC , no se me activa la bandera de interrupción (DAC1RIF) cuando la FIFO no esta llena, quería saber si se puede simular?

Si la respuesta es SÍ, Les voy a mostrar el código... para que me regalen unos segundos y lo revisen...

#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 signal[5] = {32768, 63384, 54592, 17708, 209};
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)
   
   // CLOCK DIVISOR REGISTER
CLKDIVbits.PLLPRE= 0;    //PLL Phase Detector Input Divider bits (also denoted as "N1", PLL prescaler) N2=2
CLKDIVbits.PLLPOST= 0;    //PLL VCO Output Divider Select bits (also denoted as "N2", PLL postscaler) N1=2
//CLKDIVbits.FRCDIV= 0;   //Internal Fast RC Oscillator Postscaler bits
CLKDIVbits.DOZEN= 0;      //DOZE Mode Enable bit
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

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

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

   //AUXILIARY CONTROL REGISTER
ACLKCONbits.SELACLK = 0;      //Select Auxiliary Clock Source for Auxiliary Clock Divider 0 = PLLCLK
ACLKCONbits.AOSCMD = 0b00;      //Auxiliary Oscillator Mode 00 = Auxiliary Oscillator Disabled
ACLKCONbits.APSTSCLR = 0b111;   //Auxiliary Clock Output Divider 000 = /1
//ACLKCONbits.ASRCSEL = 1;      //Select Reference Clock Source for Auxiliary Clock 1 = POSCCLK

   //DAC STATUS REGISTER
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.REMPTY=;      //Status, Right Channel Data input FIFO is EMPTY
//DAC1STATBITS.LEMPTY=;      //Status, Left Channel Data input FIFO is EMPTY   

//DAC1STATBITS.RFULL=;      //Status, Right Channel Data input FIFO is FULL
//DAC1STATBITS.LFULL=;      //Status, Left Channel Data input FIFO is FULL

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

   //DAC CONTROL REGISTER
DAC1CONbits.DACFDIV = 3;   //DAC Clock Divider 3 = /4
DAC1CONbits.FORM = 0;      //Data Format Select bit 0 = Unsigned integer
DAC1CONbits.AMPON = 1;      //1 = Analog Output Amplifier is enabled during Sleep Mode/Stop-in Idle mode
DAC1CONbits.DACSIDL = 0;   //Stop in Ideal Mode bit 0 = Continue module operation in Idle mode.
DAC1CONbits.DACEN = 1;      //DAC1 Enable bit Enables module
   
DAC1DFLT = 0;            //DAC DEFAULT DATA REGISTER

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

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 (i == 5)
   {
   i = 0;
   }
}
}

void __attribute__((interrupt, auto_psv))_DAC1RInterrupt(void)
{

DAC1RDAT = signal; /* User Code to Write to FIFO Goes Here */
i = i + 1;
IFS4bits.DAC1RIF = 0;  /* Clear Right Channel Interrupt Flag */

}

Álvaro I. Sandoval T.
Ing. en Control Electrónico e Instrumentación