MSP430F155 DAC Problem

Gast #1274618
Lesenswert?

Eigentlich müßte das ja ganz einfach sein. sind ja nur 3 Zeilen.
Ich halte mich genau an die Beispiele von TI bzw an die Initzialisierung 
aus den Beispielen von hier.
Leider messe ich nichts am Ausgang


in der Init:

  volatile int a = 0;
  ADC12CTL0   =   REF2_5V + REFON;
  DAC12_0CTL   =   DAC12IR + DAC12AMP_7 + DAC12ENC;
  for(a=0;a<=0x658;a++)
   {}

in der Main:

  DAC12_0DAT = 0x0CCC;

ich nutze ausserdem noch den ADC:

  ADC12CTL0    |=   !ENC;
  ADC12CTL0   =   ADC12ON+MSC+SHT0_2;
  ADC12CTL1   =   SHP+CONSEQ_1;
  ADC12MCTL0   =   INCH_0 + SREF_2;
  ADC12MCTL1   =   INCH_1 + SREF_2 + EOS;
  ADC12CTL0   |=   ADC12SC + ENC;
  switch(place)
  {
  case INNEN:
    fValue = ADC12MEM0;  // return the value read from ADC P6.0
    break;
  case AUSSEN:
    fValue = ADC12MEM1;  // return the value read from ADC P6.1
    break;
  default:
    fValue = 0;
    break;
  }

dieser funktioniert aber fehlerfrei.

Wo liegt der Hase im Pfeffer? ich hab glaub ich alle Möglichkeitne 
durchprobiert.

HWtechnisch kann ich den Pin doch einfach ausgeben oder? brauch also 
keine Pullup oder Pulldown Widerstand oder?
Gast #1274666
Lesenswert?

WDTCTL   =   WDTPW + WDTHOLD;      // disable Watchdog
  FCTL2    =  FWKEY + FSSEL0 + FN0;  // MCLK/2 for Flash Timing

  P1DIR   =   0x7F;            // port1 = output, port1.7 input
  P2DIR   =   0x7F;            // port2 = output, port2.7 input
  P4DIR  =  0x0F;            // port4 = output 0 - 3
  P6DIR  =  0x3F;            // Input for ADC Output for DAC
  P1SEL   =   0x00;
  P2SEL   =   0x00;            // Port 1 & 2 used as GPIO
  P4SEL  =  0x0F;            // used for Timer B
  P6SEL  =  0xFF;            // Used as ADC and DAC
  P1IE    =   0x00;
  P2IE  =   0x00;            // Port 1 & 2 not used as interrupt
  P1OUT  =   0x00;            // inital all off
  P2OUT  =   0x00;            // inital all off


Der Quellcode ist etwas umfangreicher. hab daher nicht alles angegeben. 
Die Einstellungen müßten so aber stimmen oder?
#1276165
Lesenswert?

Eitum schrieb:
1
>   ADC12CTL0   =   REF2_5V + REFON;
2
>   DAC12_0CTL   =   DAC12IR + DAC12AMP_7 + DAC12ENC;
3

4
...
5

6
>   ADC12CTL0   =   ADC12ON+MSC+SHT0_2;

Naja, wenn du die Referenz-Spannungsquelle wieder deaktivierst, kann es 
schon sein, dass es nicht klappt ;)
Der DAC benötigt einen aktivierten ADC und eine Referenz-Spannung. 
Entweder die interne oder die externe. Die interne verwendest du, 
schaltest sie aber bei der Init des ADC wieder aus.
Außerdem musst du DACAMP noch setzen, der Default wert ist Off, also 
High-Z.
Vielleicht solltest du mal im User Guide das entsprechende Kapitel lesen 
und möglichst verstehen.
Gast #1276282
Lesenswert?

Hab auf Grund deines Rates auf Externe Referenz gewechselt wo 3,3V 
anliegen.  Auch das bringt keine Änderung.

Du hast doch selbst die Zeile zitiert wo DACAMP gesetzt wird. DAC12AMP_7 
setzt den DACBuffer auf high/high.

Eben weil ich den User Guide gelesen habe und trotzdem nicht weiter weiß 
stell ich ja die Frage. Hab auch lang im Forum gesucht, aber scheinbar 
bin ich einer der wenigen die mit dem DAC Probleme haben.

Es kann doch nicht so schwer seinen einen berechneten Spannungswert 
solange auszugeben bis der Wert aktualisiert wird und dann den 
aktualisierten .

1
  DAC12_0CTL   =   DAC12IR + DAC12AMP_7 + DAC12ENC+ DAC12SREF_3;
2
  for(a=0;a<=0x658;a++)
3
   {}
4

5
    DAC12_0DAT = 0x0CCC;

P.S. Bei externer Referenz wird der ADC ignoriert richtig?
#1276370
Lesenswert?

Hach stimmt, das AMP war ja drin.

Hier mal, wie ich den verwende:
1
//Stellt den integrierten 12-Bit DAC ein. 
2

3
void StartupDAC(void)
4
{
5
  DAC12_0CTL = DAC12IR + DAC12SREF_3 + DAC12AMP_7 + DAC12ENC;  //Ref = Veref+, Full-Speed, Enable Conv.  
6
  DAC12_1CTL = DAC12IR + DAC12SREF_3 + DAC12AMP_7 + DAC12ENC;  //Ref = Veref+, Full-Speed, Enable Conv.      
7
  
8
  DAC12_0CTL |= DAC12CALON;              //Kalibrierung starten...
9
  
10
  while (DAC12_0CTL & DAC12CALON);          //Kalibrierung abwarten
11
  
12
}
13

14
//Setzt die beiden integr. DAC12 Ausgänge
15

16
void SetDACs(unsigned int DAC0Vaule, unsigned int DAC1Value)
17
{
18
  DAC12_0DAT = DAC0Vaule;
19
  DAC12_1DAT = DAC1Value;
20
}
21

22
//Schaltet den int. DAC12 ab
23

24
void DAC_Off(void)
25
{
26
  DAC12_0CTL = 0;
27
  DAC12_1CTL = 0;
28
}

Der ADC muss meines Wissens trotzdem aktiviert sein.

Wie siehts mit Kondensatoren an VeRef aus? Ist die Referenzspannung 
ordentlich abgeblockt? Ansonsten wüsste ich jetzt auch nicht. Kannst du 
denn mit dem Debugger mal schauen, ob deine Ausgabewerte wirklich im 
DAC12_0DAT landen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren