ADC Probleme beim MSP430

Gast #3618044
Lesenswert?

Hallo,

ich habe ein Problem mit dem ADC12 des MSP430F2618.

Folgender Code gibt mir nicht den richtigen Wert aus:

...

ADC12CTL0 = ~ENC;
ADC12CTL0 = ADC12ON + SHT0_8 + REFON;
ADC12CTL1 = SHP;
ADC12MCTL0 = SREF_1 + INCH_0;
ADC12CTL0 |= ENC;

...

ADC12CTL0 |= ADC12SC;
while (ADC12CTL0 & ADC12SC) {}
Spannung = ADC12MEM0;

...

Lasse ich sowohl ADC12CTL0 = ~ENC; als auch ADC12CTL0 |= ENC; weg, 
funktioniert die AD-Wandlung. Jedoch lese ich überall, dass ADC12CTL0 |= 
ENC;
gesetzt sein muss, damit die AD-Wandlung richtig gestartet wird.

Kann mir das vielleicht bitte jemand erklären?

Viele Grüße
Persönliche Seite #3618082
Lesenswert?

MSP430-User schrieb im Beitrag #3618044:
> ADC12CTL0 = ~ENC;

Das macht nicht das, was Du glaubst, was es macht.

Versuch mal

ADC12CTL0 &= ~ENC;

Allerdings beschreibst Du ja in der nächsten Zeile eh das komplette 
Register, daher kannst Du Dir die Zeile auch sparen.

> ADC12CTL0 = ADC12ON + SHT0_8 + REFON;


Hast Du Dir mal eines der Code-Beispiele von TI angesehen?
Gast #3618227
Lesenswert?

Danke erstmal für die schnelle Antwort. Ja du hast Recht, die erste 
Zeile macht wenig Sinn. Dennoch versteh ich nicht, dass wenn ich das ENC 
Bit setze, dass die Konvertierung nicht funktioniert. Gerade dann müsste 
sie doch funktionieren?!

Hab mir schon einige Beispiele angesehen. Meist ist da die AD-Wandlung 
in einer Endlosschleife. Das möchte ich aber nicht. Dürfte doch keinen 
Unterschied machen?!
Gast #3618649
Lesenswert?

Rufus Τ. Firefly schrieb:
> MSP430-User schrieb im Beitrag #3618044:
>> ADC12CTL0 = ~ENC;
>
> Das macht nicht das, was Du glaubst, was es macht.
>
> Versuch mal
>
> ADC12CTL0 &= ~ENC;
>
> Allerdings beschreibst Du ja in der nächsten Zeile eh das komplette
> Register, daher kannst Du Dir die Zeile auch sparen.
>
>> ADC12CTL0 = ADC12ON + SHT0_8 + REFON;

Stimmt nicht.  Solange das ENC Bit gesetzt ist, lassen sich die anderen 
Bits (genauer gesagt: alles was in der Family Guide grau hinterlegt ist) 
nicht verändern. Es sieht also so aus, als ob der ADC bereits 
initialisiert ist.  Das heißt, dass alle Zeilen bis auf "ADC12CTL0 |= 
ADC12SC;" noops sind, wenn der OP die "ADC12CTL0 = ~ENC;" Zeile 
weglässt.  Ist aber trotzdem komisch, dass der Code nicht funktionieren 
soll -- ich sehe keine Probleme damit (außer dass ich in der Schleife 
auf ADC12BUSY anstatt ADC12SC testen würde, aber das ist hier wohl nicht 
das Problem).
Gast #3618855
Lesenswert?

MSP430-User schrieb im Beitrag #3618044:
> while (ADC12CTL0 & ADC12SC) {}

Fehlt da nicht ein ";" ? Nicht dass der Compiler das rausoptimiert.

Und eigentlich heißt es
1
while (ADC12CTL1 & ADC12BUSY) ;

MSP430-User schrieb im Beitrag #3618044:
> ADC12CTL0 = ~ENC;
> ADC12CTL0 = ADC12ON + SHT0_8 + REFON;
> ADC12CTL1 = SHP;
> ADC12MCTL0 = SREF_1 + INCH_0;
> ADC12CTL0 |= ENC;
ADC12CTL0 = ~ENC;   <--- hier wird das ADC12SC bereits gesetzt
...
ADC12CTL0 |= ENC;   <--- und damit hier die Wandlung gestartet

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