mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 mit sd16 Anfangerproblem


Autor: Paul Färber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Paul Färber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.