MCP4822 no da salida como se desea

0

Tengo dos DAC MCP 4822 con un dspic33fj128mc804. La inicialización de ambos DAC se realiza según sea necesario. Sin embargo, cuando intento cambiar los valores que se escriben en el DAC, no se modifican. El valor permanece igual que el valor inicializado.

Debajo está mi código. ¿Puede alguien ayudarme con esto, por favor?

// Inicializar DAC

void initDACs (void)     {     TRISB & = ~ 0x4010;     DAC1CS = DAC2CS = 1;     _SPI1IF = 0; // Borrar el indicador de interrupción     _SPI1IE = 0; // Desactivar la interrupción

// Inicializar SPI

SPI1CON1=0x073e; //16bit, master, prescale 4, CKP0 CKE1 SMP 1

SPI1STAT=0x8000; //enable SPI

DAC1CS=DAC2CS=0;
SPI1BUF = 0x3000;   //Set output of A to 0V
while(!_SPI1IF); //wait until SPI has finished
_SPI1IF = 0; 
DAC1CS=DAC2CS=1;

SPI1STAT &=~0x40;
_SPI1IF = 0;

DAC1CS=DAC2CS=0;
SPI1BUF = 0xb000; // Set output of B to 0V
_SPI1IE = 1;

spiReady=0;

}

// Función para establecer valores en el DAC

void channelSetDAC (int v, int ch) {

unsigned int sendData;

if(ch>4) return;
if (SPI1STATbits.SPITBF) return;

if(ch &1)
{
sendData= 0x3000 | (v & 0xfff);

}
else
{
sendData= 0xb000 | (v & 0xfff);
}

if (ch <3) DAC1CS=0; else DAC2CS=0;

SPI1BUF=sendData;
spiReady=0;

}

// Función para escribir valores en el DAC

sMethod void () {     channelSetDAC (0x7d0,0); }

    
pregunta harry

1 respuesta

1

La primera función es un poco confusa, mientras que en la segunda inicialización no esperas a que finalice la transmisión sino que parece que se activan las interrupciones SPI. ¿Qué está haciendo el manejador?

En la segunda función no esperas al final de la transmisión y tampoco veo el aumento de DAC1CS / DAC2CS. Tenga en cuenta que si eleva CS antes de que se hayan transferido 16 bits, no ocurrirá nada. Si eleva el CS pero LDAC {es alto, no pasa nada | flota nada puede suceder}

Supongo que tienes el pin LDAC conectado a tierra.

    
respondido por el Szidor

Lea otras preguntas en las etiquetas