www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 ADC12 Wahl der Input-Channel


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo miteinander ich habe folgendes Problem:

Vor einiger Zeit habe Ich mir das headerboard MSP430-H169 von olimex 
gekauft, leider habe Ich damit einige Probleme,beim Ansteuern des 
AD-Wandlers:
 während mein Programm auf dem Starter-Kit MSP430-169STK einwandfrei 
läuft, lassen sich bei dem Headerboard die zu konvertierenden Eingänge 
nicht auswählen.
 Alle anderen Funktionen (z.B.:UART)sind einwandfrei gegeben,was mich 
darauf schliessen lässt, dass Ich das Board richtig angeschlossen habe.
 Meine Versorgungsspannung stammt aus einem Loabornetzgerät ,dass eine 
sehr glatte Gleichspannung erzeugt.Durch "Debuggen" kann man erkennen 
,dass obwohl Ich die von aussen variabel vorgespannten(oder auch GND) 
Ausgänge anwähle,in den Registern steht immer nur der Wert der halben
Versorgungsspannung(also aus INCH11 bis INCH15).Sollte Ich noch irgend 
ein Bit (re-)setten um den Kanal wechseln zu können?
Dieser Fehler schein öfters vorzukommen ,es gibt auch hier im Forum 
einen Beitrag mit dieser Frage-nur keine Antwort darauf.
> mein sourcecode:
>
> #include <msp430x16x.h>
>
> P6DIR = 0x00;
> P6SEL = 0x14;
> ADC12CTL0  |= !ENC;                                // konventierung abschalten
> ADC12CTL0  |= ADC12ON+SHT0_0+REFON+REF2_5V+EOS;   // ADC12 anschalten, n=1,
> referenz auf 1,5V setzen,
>
>
> ADC12CTL1  |= CONSEQ_3;    // Konvertierung einer einfachen Sequenz der
>                            // Kanäle
> ADC12CTL1  |= SHP;
>
>
>
> ADC12MCTL0 |= SREF_1+INCH_2;                  //    VR- = AVss
> INchannel 4 P6.4
> ADC12MCTL1 |= SREF_1+INCH_4+EOS;              //    VR- = AVss
> INchannel 2 P6.2
>
>
> delay(200);
> ADC12CTL0  |= ENC;                       //ENC=1 konventierung möglich
>
> ADC12CTL0 |= ADC12SC;                    // konvertierung durchfuehren

Autor: Tobias K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die AD Kanäle schaltest du auch nicht mit P6SEL frei. sonder du must sie 
in den AD REgistern freischalten.

Autor: Tobias K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist das ADC12MCTLx Register
Nimm mal das P6SEL = 0x14 weg

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort Tobias, echt top

"Die AD Kanäle schaltest du auch nicht mit P6SEL frei. sonder du must 
sie
in den AD REgistern freischalten."

ähm ,hab Ich auch nicht behauptet,Ich bestimme die Kanäle mit:
> ADC12MCTL0 |= SREF_1+INCH_2;                  //    VR- = AVss
> INchannel 4 P6.4
> ADC12MCTL1 |= SREF_1+INCH_4+EOS;              //    VR- = AVss
> INchannel 2 P6.2

beim STK landet so der richtige Wert der von aussen angelegten Spannung 
im ADC12MCTL0 und ADC12MCTL1 Register

beim Headerbord laden die falschen Werte(ca. 1.65V also Vss/2) in den 
ADC12MCTL0 und ADC12MCTL1 Registern


"das ist das ADC12MCTLx Register
Nimm mal das P6SEL = 0x14 weg"

meinst Du das soll P6SEL = 0x00; sein ?
und  zB.: ADC12MCTL4 |= SREF_1+INCH_4+EOS;

Dank im Voraus

Autor: Tobias K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun Mit Nim mal P6SEL =0x14 weg
Meine ich das zum Einstellen der AD Kanäle P6SEL nicht Benötigt wird.
Sie werden NICHT mit P6SEL Konfiguriert.
Sondern mit INCHx im ADC12MCTLx,Register
Dort stellst du aber den obersrten Kanal ein.
Also wenn du z.B Kanal 1 -4 Sampeln möchtest.
Stellst du INCH0 + INCH1 ein und er fängt bei ADC3 an und geht dan immer 
eine runter, also ADC3 ADC2 ADC1 ADC0.

Un dann würde ich dir raten die Abfrage der Werte aus den Registern über 
einen Interrupt laufen zu lassen.

Less die am besten mal das ganz Kapitel zu dem AD Wandler durch.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
" zum Einstellen der AD Kanäle P6SEL nicht Benötigt wird."

achso dann hab Ich:   "Each PxSEL bit is used
to select the pin function – I/O port or peripheral module function.
Bit = 0: I/O Function is selected for the pin
Bit = 1: Peripheral module function is selected for the pin"
falsch verstanden,dachte ADC ist nicht GPIO
ist auch egal beim STK klappt das auch mit P6SEL=0x00;
also hast Du da auf jeden Fall recht

bei : ADC12MCTL4 |= SREF_1+INCH_4+EOS;

steht beim STK in den ADC12MEM0 bis ADC12MEM3 ca. 0.8V(wie von 
floatenden Eingängen) und im ADC12MEM4 steht der richtige Wert

und beim Header in ADC12MEM0 bis ADC12MEM3 ca. 1.65V also Vss/2 und im 
ADC12MEM4 ca. 2 Volt(könnte auch ein floatender Eingang sein)

oder meintest Du das anders, schreib bitte in C wie Du die Kanäle 
einstellst.
Wie Du siehst will Ich Kanäle 3 und 5 kovertieren, also INCH_2 und 
INCH_4 bzw. 6.2 und 6.4

"Un dann würde ich dir raten die Abfrage der Werte aus den Registern 
über
einen Interrupt laufen zu lassen."

schau mir die Werte beim Debuggen direkt in den Registern an,meinst Du 
nach dem Interrupt würde da was anderes stehen?

Autor: Tobias Korrmann (kurzschluss81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

#include  <msp430x14x.h>

static unsigned int results[4];             // Needs to be global in this example
                                            // Otherwise, the compiler removes it
                                            // because it is not used for anything.

void main(void)
{
  WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
  P6SEL = 0x0F;                             // Enable A/D channel inputs
  ADC12CTL0 = ADC12ON+MSC+SHT0_2;           // Turn on ADC12, set sampling time
  ADC12CTL1 = SHP+CONSEQ_1;                 // Use sampling timer, single sequence
  ADC12MCTL0 = INCH_3 + SREF_1;             // ref- =AVcc, channel = A3
 ADC12MCTL1 = INCH_5 + SREF_1 + EOS; //ref-=AVcc, channel=A5+End ofSequence
  ADC12IE = 0x20;                           // Enable ADC12IFG.5
  ADC12CTL0 |= ENC;                         // Enable conversions

  while(1)
  {
  ADC12CTL0 |= ADC12SC;                     // Start conversion
  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0, Enable interrupts
  }
}

#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
  results[0] = ADC12MEM0;                   // Move results, IFG is cleared
  results[1] = ADC12MEM1;                   // Move results, IFG is cleared
  _BIC_SR_IRQ(LPM0_bits);                   // Clear LPM0, SET BREAKPOINT HERE
}

Dieses Beispile findest du auch in den Beispielsammlungen

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.