Forum: Mikrocontroller und Digitale Elektronik ADC Probleme beim MSP430


von MSP430-User (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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?

von MSP430-User (Gast)


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?!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

MSP430-User schrieb im Beitrag #3618227:
> Hab mir schon einige Beispiele angesehen.

Irgendwelche oder die von TI für "Deine" MSP430-Familie?

von Thomas (Gast)


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

von Scheibchen (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Scheibchen schrieb:
> Fehlt da nicht ein ";" ? Nicht dass der Compiler das rausoptimiert.

Nein. Da steht ein leerer Block (die beiden geschweiften Klammern), der 
macht dasselbe.

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.