ADC Probleme beim MSP430

Gast #3618044
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.