Forum: Mikrocontroller und Digitale Elektronik ADC10 MSP430 Memory Problem (Controller: F2272)


von Günther Waldner (Gast)


Lesenswert?

Hallo.
Ich benutze einen MSP430 F2272
Ich hab ein riesen Problem mit meinem AD Wandler.
An P3.7 hängt ein Poti. Wenn ich nun das erste mal das Programm 
durchlaufe bekomme ich einen Wert in das ADC10MEM. Drehe ich jedoch beim 
Poti ändert sich der Wert darin nicht. Auch nicht wenn ich das Programm 
beende, am Poti drehe und die Debbug Session wieder starte. ich bekomme 
immer den Wert
ADC10MEM 0x03A4.

Was ist an meinem Programm falsch?
Danke im voraus.

Lg Waldner Günther

1
#include  <msp430x22x2.h>
2
3
4
void wait(unsigned int i);  // prototypen
5
int main(void);
6
7
int main(void)
8
{
9
  WDTCTL = WDTPW + WDTHOLD;  // watchdog aus
10
  P1DIR=0xFF;             // port 1 = output (8 LEDs)
11
  P3DIR=0x00;             // port 3 = input Ppotis)
12
  P1SEL=0x00;             // port 1 komplett als GPIO nutzen
13
  P3SEL=0xC0;             // P3.6 und 3.7 als A/D-Wandler benutzen, den Rest als GPIO
14
15
  P1IE=0x00;              // interrupt ausmachen
16
17
   P1OUT=0xFF;             // initial alle LEDs aus (low aktiv)
18
19
  ADC10CTL0 = ADC10ON+ADC10SHT_0+REFON+REF2_5V;  // ADC10 anschalten, Sample Time auf 4*ADC10CLKs,referenz auf 2,5V setzen
20
  ADC10CTL0 |= ENC;                    // jetzt anfangen ...
21
  ADC10CTL1 = INCH_7+SHS_3+CONSEQ_2;  // P3.7, TA2 trigger sample start , Repeat single channel Modus
22
  ADC10AE0 |= BIT7;                  // P3.7 ADC10 option select
23
24
  for(;;)
25
  {                       // infinite loop
26
    ADC10CTL0 |= ADC10SC; // konvertierung durchfuehren
27
    wait(10000);
28
    if (ADC10MEM <= 0x0A4)
29
      P1OUT=0x00;       // alle LEDs an
30
      else P1OUT=0xFF;   // alle LEDs aus
31
  }
32
}
33
34
void wait(unsigned int i) // delay function
35
{
36
  unsigned int j;
37
  for(j=0;j<i;j++);
38
}

von Jörg S. (joerg-s)


Lesenswert?

Könnte das gute alte ENC rücksetz Problem sein.

Nach der Wandlung bzw. vor neuer Einstellung:
ADC10CTL0 &= ~ENC;

> wait(10000);
Warum nicht Abfrage des Busy Bit?

von Günther Waldner (Gast)


Lesenswert?

1
 
2
for(;;)
3
  {                       // infinite loop
4
    ADC10CTL0 |= ADC10SC; // konvertierung durchfuehren
5
    wait(10000);
6
    ADC10CTL0 &= ~ENC;
7
    if (ADC10MEM <= 0xFFF)
8
      P1OUT=0x00;       // alle LEDs an
9
      else P1OUT=0xFF;   // alle LEDs aus
10
  }

Hab das jetzt mal so eingebaut. Ändert aber leider nichts an der 
Situation.
Ist sonst etwas falsch am Programm???
Das Potentiometer hat 100k und liegt an einer Spannung von 3.3V.

von Jörg S. (joerg-s)


Lesenswert?

> und liegt an einer Spannung von 3.3V.
Bei einer Ref.Spannung von 2,5V natürlich etwas gefährlich.

> Ist sonst etwas falsch am Programm???
Was machst du denn eigentlich mit "TA2 trigger sample start". 
Tatsächlich Timer gesteuert?

> Repeat single channel Modus
Bei Repeat Single Channel modus läuft der ADC von sich aus, warum 
startest du die Konvertierung überhaupt ständig neu?

von Günther Waldner (Gast)


Angehängte Dateien:

Lesenswert?

Ich benutze das Board der FTKW Leipzig.
Da ich Anfänger auf dem Gebiet bin hab und mit dem beiligenden ADC 
Programm zum Board nicht viel anfangen kann habe ich mich im Internet 
ein wenig umgesehen, und ein Bsp zum ADC12 auf meinen umgeschrieben.
Und das TA2 Trigger Sample start hab ich aus dem beiligenden Programm
Leider konnte ich nirgends ein einfaches Programm finden das den ADC10 
verwendet und auch verständlich ist.

Anbei hänge ich einmal die Beschaltung der Potentiometer.

Danke für den Tipp mit dem starten.
Ich werde es aus der Schleife entfernen.

Hoffe ihr könnt mir weiterhelfen.
Danke Günther

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.