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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.