www.mikrocontroller.net

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


Autor: Armin Motakef (orginalperser)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ändere mal die Zeile
while ((ADC12IFG & 0x0001)==0);

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

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Armin Motakef (orginalperser)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Armin Motakef (orginalperser)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Armin Motakef (orginalperser)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Armin Motakef (orginalperser)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.