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
Die AD Kanäle schaltest du auch nicht mit P6SEL frei. sonder du must sie in den AD REgistern freischalten.
das ist das ADC12MCTLx Register Nimm mal das P6SEL = 0x14 weg
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
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.
" 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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.