Forum: Mikrocontroller und Digitale Elektronik MSP liest nur einen ADC-Wert ein


von Hans W. (hans_wurst)


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?

von Andreas B. (buyman)


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).

von Christian R. (supachris)


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;

von Andreas B. (buyman)


Lesenswert?

Christian R. wrote:
> Mit "Single Channel Single Conversion" wird das auch nix.
>
>
1
> ADC12CTL1 = SHP + CONSEQ_1;     // Use sampling timer + Sequence
2
>

Danke für die Korrektur, das habe ich leider übersehen.

von Hans W. (hans_wurst)


Lesenswert?

Mensch, jetzt funktioniert es :)

Riesen Dankeschön an euch!

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.