Forum: Mikrocontroller und Digitale Elektronik MSP430 F1611 Sequence-of-Channels Mode (ADC12)


von Armin M. (orginalperser)


Angehängte Dateien:

Lesenswert?

Hallo,

ich möchte mit dem MSP430F1611 abwechselnd zwei Kanäle (A7 & A6) wandeln 
und diese dann später zwischenspeichern.

Die Wandlung eines einzelnen Kanals mit dem Single-Channel 
Single-Conversion Mode funktioniert relativ gut. Habe den Eingang über 
einen 10k Widerstand mit GND verbunden, wie es mehrfach hier im Forum 
empfohlen wurde. Im Register ADC12MEM0 steht dann etwas zwischen 0x6d 
und 0x72, was einer Schwankung von ein paar Millivolt und einem Offset 
von 68 mV entspricht.

Ich bekomme aber den Sequence-of-Channels Mode irgendwie nicht hin. Der 
Code ist im Anhang zu sehen. Ich vermute, dass ich entweder die CONSEQ - 
Bits falsch setze oder den Start der Konvertierung mit ADC12SC falsch 
mache. Habe schon viel rumgespielt, aber es hat nie geklappt. Kann mir 
einer von euch weiterhelfen?

Vielen Dank schonmal im Vorraus!
Herzliche Grüße
Armin

von Christian R. (supachris)


Lesenswert?

Ändere mal die Zeile
1
while ((ADC12IFG & 0x0001)==0);

in
1
while ((ADC12IFG & 0x0002)==0);

Bit 1 im IFG-Register repräsentiert das ADC12MEM0 und nicht MEM1, denn 
du willst ja nach dem 2. Kanal erst aufhören.
Außerdem musst du das Bit selbst zurücksetzen, wenn du wie in deinem 
Quellcode gar nicht auf das ADC12MEMx zugreifst.

von Jörg S. (joerg-s)


Lesenswert?

> Ich bekomme aber den Sequence-of-Channels Mode irgendwie nicht hin.
D.h.? Er wandelt überhaupt nicht oder nur Schrott?

In der Schleife muss wahrscheinlich erst noch ein
ADC12CTL0 &=~ENC;
hin um das erneute setzen von ADC12SC zu ermöglichen.

von Armin M. (orginalperser)


Lesenswert?

Vielen Dank für eure Tipps!

Du hast recht, dass war zu schwammig formuliert... mit "irgendwie" meine 
ich, dass es garnicht funktioniert. In den ADC12MEMx - Registern stehen 
irgendwelche Werte aber nicht 0x6d - 0x72. Und diese Werte schwanken 
auch nicht; also gehe ich davon aus, dass die Wandlung garnicht erst 
gestartet wurde.

Ich werde es mit euren Ratschlägen weiter versuchen und sage euch 
bescheid, was daraus geworden ist. Wird allerdings noch ein paar Tage 
dauern...

von Armin M. (orginalperser)


Angehängte Dateien:

Lesenswert?

Hallo,

erst einmal ein frohes neues Jahr euch allen!

Ich habe heute eure Vorschläge eingearbeitet, aber leider funktioniert 
die Wandlung noch immer nicht. Wie im Anhang zu sehen ist, habe ich ein 
paar zusätzliche Codezeilen eingefügt, da ich der Registeranzeige des 
Code Composers nicht ganz traue. Ich lasse mir nun den Inhalt der 
ADC12MEMx - Register auf den PC schicken. Aber leider kommt er garnicht 
erst soweit...

Ich habe festgestellt, dass das Interruptflag des AD-Wandlers garnicht 
gesetzt wird, d.h. dass der µC garnicht erst wandelt. Dadurch bleibt das 
Programm an der Zeile
1
while ((ADC12IFG & 0x0002)==0);

hängen. Habe ich noch weitere Fehler in meinem Programm oder könnte es 
evtl. an der Hardware liegen (d.h. der µC selber)? Ich neige ja oft 
dazu, die Hardware in verdacht zu ziehen, aber meistens liegt es doch 
nicht an der Hardware...

Jetzt seid ihr wieder gefragt...

Herzliche Grüße
Armin

von Christian R. (supachris)


Lesenswert?

Hallo,

du setzt den IE des ADC12, dass er jeweils einen Interrupt nach Wandlung 
von Kanal 0 und Kanal 1 erzeugt:

ADC12IE = 0x0003;

Dann hast du aber keinen Interrupt-Handler. Also wird der Interrupt 
erzeugt, dein Prozessor schmiert ab, oder macht im besten Fall (je nach 
Compiler) nix außer das Interrupt-Flag löschen, weil ja evtl eine 
rudimentäre ISR automatisch vom Kompiler erzeugt wurde.

Die Flags werden auch ohne die Bits im ADC12IE gesetzt.

Und nimm mal das MSC Bit aus dem ADC12CTL0, das startet den Sequenzer 
immer wieder neu. Das willst du ja nicht, da du das SC Bit immer selber 
setzt.

von Armin M. (orginalperser)


Lesenswert?

Hallo,

habe die Interrupt-Enable-Bits gesetzt, da er ständig bei der 
while-Schleife hängen blieb und ich dachte, es läge an den nicht 
gesetzten Bits. Habe nun die Zeile gelöscht.

Das MSC - Bit habe ich nun auch rausgenommen.

Leider bleibt das Programm immer noch bei der while - Schleife hängen. 
Ich frage mich, warum das Interrupt-Flag des AD-Wandlers nicht gesetzt 
wird...

von Christian R. (supachris)


Lesenswert?

Habs bei mir mal getestet. Das MSC Bit muss doch gesetzt sein und im 
ADC12CTL1 fehlt noch das SHP Bit. Hab ich vorhin übersehn. Dann klappts 
auch.

von Armin M. (orginalperser)


Angehängte Dateien:

Lesenswert?

Vielen Dank!

Mit deiner Hilfe habe ich es endlich hinbekommen...

Im Anhang habe ich mal meinen Code beigefügt. Falls jemand von euch das 
gleiche Problem hat oder einfach nur den Code braucht.

Die Clock-Einstellungen müsst ihr noch überprüfen und ggf. anpassen...

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.