Forum: Mikrocontroller und Digitale Elektronik MSP430 adc12 auslesen problem


von TM (Gast)


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

von Sepp (Gast)


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

von Nico (nico123)


Lesenswert?

Du kannst das Register ADC12MCTL0 nur verändern wenn ENC = 0 ist!

von TM (Gast)


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

von Sepp (Gast)


Lesenswert?

Hallo,
das ist ja interessant dass es so funktioniert. Allerdings hatte ich ich 
bisher nur ADC10 anstelle des ADC12. Gut zu wissen danke.
Grüße,
Sepp

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.