MSP liest nur einen ADC-Wert ein

OP #927740
Lesenswert?

Hallo,

ich verwende den MSP430F247 und möchte 2 ADC-Eingänge auslesen. Bekomme 
es aber leider immer nur hin nur einen einzigen Eingang (Bit 0 an Port 
6) aus zu lesen. Es steht sonst immer 0x00 im zweiten (Bit 1 an Port
6) Register. Egal welche Spannung anliegt.

1
float wertA, wertB;
2
ADC12CTL0 = ADC12ON + MSC + SHT0_2 + ENC; // ADC aktivieren, Sample and Hold Time 16 Cycles
3
ADC12CTL1 = SHP;                          // pulse sample mode selected
4
ADC12MCTL0 = SREF_2 + INCH_0;             // Referenz-Spannung: Vr+ = Vref+, Input Channel: A0
5
ADC12MCTL1 = SREF_2 + INCH_0 + EOS;
6

7
ADC12CTL0 |= ADC12SC;                     // ADC starten und Konversion starten
8

9
while ((ADC12IFG & BIT0) == 0);           // Warten bis AD Wert verfügbar
10
wertA = ADC12MEM0;
11
while ((ADC12IFG & BIT1) == 0);           // Warten bis AD Wert verfügbar
12
wertB = ADC12MEM0;

Kann mir jemand vielleicht helfen?
#927747
Lesenswert?

1
wertB = ADC12MEM1;

Könnte helfen (ohne jetzt den Rest, also die Konfiguration des ADCs 
überprüft zu haben).

Edit:
1
float wertA, wertB;
2
ADC12CTL= &= ~ENC; //Conversion deaktivieren, damit alles eingestellt werden kann
3

4
ADC12CTL0 = ADC12ON + MSC + SHT0_2; // ADC aktivieren, Sample and Hold Time 16 Cycles
5
ADC12CTL1 = SHP;                          // pulse sample mode selected
6
ADC12MCTL0 = SREF_2 + INCH_0;             // Referenz-Spannung: Vr+ = Vref+, Input Channel: A0
7
ADC12MCTL1 = SREF_2 + INCH_0 + EOS;
8

9
ADC12CTL |= ENC;
10

11
ADC12CTL0 |= ADC12SC;                     // ADC starten und Konversion starten
12

13
while ((ADC12IFG & BIT0) == 0);           // Warten bis AD Wert verfügbar
14
wertA = ADC12MEM0;
15
while ((ADC12IFG & BIT1) == 0);           // Warten bis AD Wert verfügbar
16
wertB = ADC12MEM1;

Sollte so passen. ENC muss 0 sein damit die Einstellungen geändert 
werden können (siehe Datenblatt).
#927776
Lesenswert?

Mit "Single Channel Single Conversion" wird das auch nix.
1
ADC12CTL1 = SHP + CONSEQ_1;     // Use sampling timer + Sequence

ebenso wie oben schon geschrieben, list du das falsche Register aus. Auf 
das Flasg des 1. ADC-Kanals musst du nicht warten, kannst gleich nach 
dem 2. Flag beide auslesen.

Also so:
1
float wertA, wertB;
2
ADC12CTL= &= ~ENC; //Conversion deaktivieren, damit alles eingestellt werden kann
3

4
ADC12CTL0 = ADC12ON + MSC + SHT0_2; // ADC aktivieren, Sample and Hold Time 16 Cycles
5
ADC12CTL1 = SHP + CONSEQ_1;                          // pulse sample mode selected
6
ADC12MCTL0 = SREF_2 + INCH_0;             // Referenz-Spannung: Vr+ = Vref+, Input Channel: A0
7
ADC12MCTL1 = SREF_2 + INCH_0 + EOS;
8

9
ADC12CTL |= ENC;
10

11
ADC12CTL0 |= ADC12SC;                     // ADC starten und Konversion starten
12

13
while ((ADC12IFG & BIT1) == 0);           // Warten bis AD Wert verfügbar
14
wertA = (float)ADC12MEM0;
15
wertB = (float)ADC12MEM1;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren