Forum: Mikrocontroller und Digitale Elektronik MSP430 mit sd16 Anfangerproblem


von Paul Färber (Gast)


Lesenswert?

Hallo MSP430 Kenner

ich versuche den A/D Wandeler (SD16) in einem 430f427 zu benutzen. 
Leider bekomme ich nur Werte die keinen Bezug zu dem erwarteten Meßwert 
haben. Die Werte liegen immer oberhalb 60000 egal was ich zu Messen 
versuche. Wenn ich zB den interne gebrückten Kanal Messe bekomme ich 
auch keine 0 Werte sonder 60112 und der wert ist nicht stabil. Ich habe 
mal mein Testprogamm angefügt vielleicht hat jemand ja eine Idee was ich 
verkehrt mache augenblicklich bin ich zimlich ratlos.

************************************************************************ 
**

#include <stdio.h>
#include <intrinsics.h>
#include "paul.h"

#include <io430x42x.h>

static unsigned int ADCresult;

static BOOL  fADEnde = FALSE;

// int SD16 Wandeler
void InitSD16(void)
{
  volatile unsigned int i;                  // Use volatile to prevent 
removal
                                            // by compiler optimization
  __disable_interrupt();

  SD16CTL = SD16REFON + SD16SSEL1 + SD16DIV0 + SD16DIV1;            // 
1.2V ref, SMCLK
  SD16CCTL2 |= SD16SNGL+SD16IE+SD16DF ;            // Single conv, 
enable interrupt
  SD16INCTL2 |= SD16INCH0 +SD16INCH1+ SD16INCH2 + SD16INTDLY1; 
// Select Channel A7
  for (i = 0; i < 0x3600; i++);             // Delay for 1.2V ref 
startup

  __enable_interrupt();
} // InitSD16



int main( void )
{

   // extern 32khz
  FLL_CTL0_bit.XTS_FLL = 0;
  WDTCTL = WDTPW + WDTHOLD; // WD aus
  InitSD16();

  for (;;)
  {
    volatile unsigned int i; // volatile verhindert das wegoptimiert 
wird

    fADEnde = FALSE;
    SD16CCTL2 |= SD16SC;                    // Set bit to start 
conversion
//    __low_power_mode_1();                     // Enter LPM0

    while (!fADEnde){}

    __no_operation();                                 //SET BREAKPOINT 
HERE

    //********

  }
}

#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
  switch (SD16IV)
  {
  case 2:                                   // SD16MEM Overflow
    break;
  case 4:                                   // SD16MEM0 IFG
    break;
  case 6:                                   // SD16MEM1 IFG
    break;
  case 8:                                   // SD16MEM2 IFG
    ADCresult = SD16MEM2;                   // Save CH2 results (clears 
IFG)
    fADEnde = TRUE;
    break;
  }

 // __low_power_mode_0();                   // Exit LPM0
}

************************************************************************ 
**

Paul

von Paul Färber (Gast)


Lesenswert?

Hat sich erledigt.

Ist eigentlich alles ok. Ich habe nur einen relativ großen Null offset 
(ca 100mV) und nicht bedacht das bei einem 2er Komplemet 60000 ja nah 0 
ist.

Paul

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.