MSP430 adc12 auslesen problem

Gast #2831586
Lesenswert?
• ▲
▼
Hallo,

Ich bin grad dabei den MSP430f169 zu programmieren leider krieg ich 
meine ADC Funktionen nicht vernünftig hin und ich sehe grad echt nicht 
den Fehler.
Ich kann von einem Channel die Daten lesen wenn ich allerdings von zwei 
channels lesen will bekomme ich anscheinend trotzdem Daten von dem 
selben Channel wie vorher.

Hier der wesentliche Codeausschnitt:
1
void main(void)
2
{
3
    int adc_value=0;
4
   char buffer[5];
5
    STOP_WATCHDOG;
6
   initClock();
7
   initUSART0();
8
   initADC();
9
   while(1)
10
   {
11
         adc_value = readADC(8);
12
        itoa(buffer,adc_value,10);
13
         sendString(buffer);
14
       sendString(";");
15
       adc_value = readADC(0);
16
       itoa(buffer,adc_value,10);
17
       sendString(buffer);
18
       sendString(";\n");
19
   }
20

21
}
22
void initADC(void)
23
{
24
 P6SEL |= 0xFF; // select the hole port as ADC
25
 ADC12CTL0 |= ADC12ON+SHT00+SHT01+SHT02; // Set sample and hold time
26
 ADC12CTL1 |= ADC12SSEL1+SHP;// Select MCLK, enable sample and hold timer
27
}
28
unsigned int readADC(unsigned int channel)
29
{
30
 ADC12MCTL0 = channel; // select channel for mem0
31
 ADC12CTL0 |= ADC12SC + ENC; // Start sampling 
32
 ADC12CTL0 &= ~ADC12SC;     // End sampling start conversion
33
 while ((ADC12CTL1 & ADC12BUSY) == 1);// while ADC busy
34
 return ADC12MEM0;
35
}

An AVcc sind 3.3V angeschlossen an AVss GND.
MCLK läuft mit 8 MHz.

Am ADC0 ist ein Poti, welches einzeln ausgelesen kann erst wenn ich 
ADC10 für interne VCC messung hinzufüge bekomme ich auch für ADC0 immer 
die selben Werte wie für ADC10.

Weiß jemand was hier falsch läuft ?

Gruß TM
Gast #2831695
Lesenswert?
• ▲
▼
Hallo,
ich würde vermuten der Fehler liegt hier:
1
ADC12CTL0 |= ADC12SC + ENC; // Start sampling 
2
ADC12CTL0 &= ~ADC12SC;     // End sampling start conversion
Du startest das ADC Sampling um es im nächsten Schritt wieder zu 
beenden? Ich würde "ADC12CTL0 &= ~ADC12SC;" im ADC ISR verwenden nachdem 
die Konvertierung abgeschlossen ist.
Auf jeden Fall mal nach
1
while ((ADC12CTL1 & ADC12BUSY) == 1);// while ADC busy
 setzen.
Viele Grüße,
Sepp
Gast #2831710
Lesenswert?
• ▲
▼
Nico ... schrieb:
> Du kannst das Register ADC12MCTL0 nur verändern wenn ENC = 0 ist!

Danke das wars!

Sepp schrieb:
> Hallo,
> ich würde vermuten der Fehler liegt hier:ADC12CTL0 |= ADC12SC + ENC; // Start 
sampling
> ADC12CTL0 &= ~ADC12SC;     // End sampling start conversion
> Du startest das ADC Sampling um es im nächsten Schritt wieder zu
> beenden? Ich würde "ADC12CTL0 &= ~ADC12SC;" im ADC ISR verwenden nachdem
> die Konvertierung abgeschlossen ist.
> Auf jeden Fall mal nachwhile ((ADC12CTL1 & ADC12BUSY) == 1);// while ADC busy 
setzen.
> Viele Grüße,
> Sepp

Das funktioniert so. Aber du hast schon recht über interrupt ist die 
bessere Lösung werde es darauf mal anpassen.

Gruß TM

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.