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
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?
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?!
MSP430-User schrieb im Beitrag #3618227: > Hab mir schon einige Beispiele angesehen. Irgendwelche oder die von TI für "Deine" MSP430-Familie?
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).
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.