Forum: Mikrocontroller und Digitale Elektronik MSP430 ADC mit mehreren kanälen


von Eugen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo alle zusammen,

Ich habe in meinem Programm ein Denkfehler.
Ich will zwei Kanäle für AD-Wandler benutzen, und sie über Interrupt
steuern.
Mit P6SEL |= 0x03; versetze ich die Pins 6.0 und 6.1 in ADC Modus.
dann
ADC12CTL0 = REF2_5V + REFON + SHT0_2 + ADC12ON + MSC;
Referenzspannung 2,5 Volt und ich schalte ADC an.

dann benutze ich ADC12CTL1 = SHP ; SHP Modes
und konfiguriere beide MEM-Register auf verschiedene Eingänge:
  ADC12MCTL0 = SREF_1 + INCH_0;  // Kanal 1
  ADC12MCTL1 = SREF_1 + INCH_1;  // Kanal 2
und schalte AD-Wandler an. Das Problemm ist, dass am MEM1 nichts
ankommt. woran könnte es liegen? was mache ich falsch???

Ich danke Ihnen für die Hilfe schon mal im voraus.

von Lanius (Gast)


Lesenswert?

du mußt dem Wandler in ADC12CTL1 auch noch sagen das er mehrere
Wandlungen machen soll und in ADCMCTL1 sollte er noch erfahren das
dieses die letzte Wandlung ist ( + EOS).
Es gibt von TI auch Beispiele für alle möglichen ADC-Sequencen in C.
Nutzt du den MSP-GCC so findest du diese im CVS unter Examples.

von Eugen (Gast)


Lesenswert?

was ist MSP-GCC???

ich dachte, dass der Prozessor sobald ein Interrupt kommt das
Analogsignal wandelt und dann wieder wartet. wie kann ich denn ihm
sagen, dass er mehrere Wandlungen macht???

danke

von Lanius (Gast)


Lesenswert?

MSP-GCC = Gnu C Compiler

http://www-s.ti.com/sc/techzip/slac015.zip

... da sind unter anderem 11 Beispiele in C für den ADC12 drin.

von Eugen (Gast)


Lesenswert?

Danke für die Beispiele.

Eine Grundlegende Frage:
Wenn ich einfach ADC12MEM1 benutzen will, dann reicht es ja, wenn ich
folgendes Konfiguriere:

P6SEL |= 0x01; // Kanal 1
ADC12CTL0 = REF2_5V + REFON + SHT0_2 + ADC12ON ;
ADC12CTL1 = SHP ;
ADC12MCTL1 = SREF_1 + INCH_1;
ADC12IE = 0x01;
  ADC12CTL0 |= ENC;
  WDTCTL = WDT_ADLY_250;
  IE1 |= WDTIE;
  _EINT();
  for (;;) {
    _BIS_SR(LPM0_bits);
    _NOP();
    sprintf(rf_buf,"%d\r",adc2);   //
    rf_poi = rf_buf;
  }
}

interrupt [WDT_VECTOR] void wdt_isr(void) {
  ADC12CTL0 |= ADC12SC;
}

interrupt[ADC_VECTOR] void ADC12ISR (void) {
   adc2 = ADC12MEM1;    // Kanal 2
  _BIC_SR_IRQ(LPM0_bits);
}

das Programm läuft nämlich auch nicht. und da frage ich mich, welchen
Konfigurationsfehler mache ich dabei.

Danke für den Hinweis.

Schönen Tag noch

von Lanius (Gast)


Lesenswert?

du solltest dem ADC auch sagen welches ADC12MEM-Register er benutzen
soll:


ADC12CTL1 = CSTARTADD_1 + SHP ;

Die ADC12MEM-Register  sind den Eingängen ja NICHT fest zugeordnet.

----------------------------------------
(slau049e.pdf)

ADC12CTL1/CSTART Bits:

Conversion start address. These bits select which ADC12
ADDx 15-12 conversion-memory register is used for a single conversion
or for the first conversion in a sequence. The value of CSTARTADDx is 0
to 0Fh, corresponding to ADC12MEM0 to ADC12MEM15.
---------

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.