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


von Daniel (Gast)


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

von Tobias K (Gast)


Lesenswert?

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

von Tobias K (Gast)


Lesenswert?

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

von Daniel (Gast)


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

von Tobias K (Gast)


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.

von Daniel (Gast)


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?

von Tobias K. (kurzschluss81)


Lesenswert?

1
#include  <msp430x14x.h>
2
3
static unsigned int results[4];             // Needs to be global in this example
4
                                            // Otherwise, the compiler removes it
5
                                            // because it is not used for anything.
6
7
void main(void)
8
{
9
  WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
10
  P6SEL = 0x0F;                             // Enable A/D channel inputs
11
  ADC12CTL0 = ADC12ON+MSC+SHT0_2;           // Turn on ADC12, set sampling time
12
  ADC12CTL1 = SHP+CONSEQ_1;                 // Use sampling timer, single sequence
13
  ADC12MCTL0 = INCH_3 + SREF_1;             // ref- =AVcc, channel = A3
14
 ADC12MCTL1 = INCH_5 + SREF_1 + EOS; //ref-=AVcc, channel=A5+End ofSequence
15
  ADC12IE = 0x20;                           // Enable ADC12IFG.5
16
  ADC12CTL0 |= ENC;                         // Enable conversions
17
18
  while(1)
19
  {
20
  ADC12CTL0 |= ADC12SC;                     // Start conversion
21
  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0, Enable interrupts
22
  }
23
}
24
25
#pragma vector=ADC12_VECTOR
26
__interrupt void ADC12ISR (void)
27
{
28
  results[0] = ADC12MEM0;                   // Move results, IFG is cleared
29
  results[1] = ADC12MEM1;                   // Move results, IFG is cleared
30
  _BIC_SR_IRQ(LPM0_bits);                   // Clear LPM0, SET BREAKPOINT HERE
31
}
Dieses Beispile findest du auch in den Beispielsammlungen

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.