Forum: Mikrocontroller und Digitale Elektronik MSP430F155 DAC Problem


von Eitum (Gast)


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?

von Christian R. (supachris)


Lesenswert?

Du musst die Zweitfunktion der Port-Pins erst mit P6SEL setzen. Per 
Default sind das digitale Eingänge.

von Eitum (Gast)


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?

von Benjamin S. (recycler)


Lesenswert?

P6DIR  =  0x3F;

P6.6 (P6.6/A6/DAC0) muss Ausgang sein!

P6DIR =  0x7F;

versuchs mal damit.

von Eitum (Gast)


Lesenswert?

Ok. stimmt mein Fehler P6DIR muss 0xC0 sein.

Leider hat das nicht den erhofften erfolgt gebracht. ausser das jetzt 
auch noch das Ergebnis von ADC12.2 falsch ist. ^^

von Stefan (Gast)


Lesenswert?

Was ist das denn ???
1
  ADC12CTL0    |=   !ENC;
Damit löscht Du das ENC Bit ganz bestimmt nicht!

von Eitum (Gast)


Lesenswert?

ach nicht?  sondern wie?
mal davon abgesehn das das eigentlich keine Unterschied machen sollte. 
Is nur der Sauberkeit halber drin.

von Stefan (Gast)


Lesenswert?

>ach nicht?  sondern wie?
1
  ADC12CTL0 &= ~ENC;

von Eitum (Gast)


Lesenswert?

Danke erstmal für den Hinweis.

Leider Hilft mir das aber bei dem DAC Problem nicht weiter.
Hat da Keiner Vorschläge?
Des is quasi das letzte Puzzelteil in meiner FIrmware.

Danke schonmal im Voraus! :)

von Benjamin S. (recycler)


Lesenswert?

Mach am besten ein Minimalbeispiel ohne ADC. Teste es und wenns nicht 
geht, dann poste hier den ganzen Quellcode im Anhang. Mit den 
Quellcodebroken kann dir so direkt keiner helfen.

von Christian R. (supachris)


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.

von Eitum (Gast)


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?

von Lars D. (eitum)


Lesenswert?

Ich habe gerade alles auskommentiert und nur die Beispielprogramme von 
TI probiert und das Ergebnis war gleich Null.

Daher nochmal die idiotische Eingangsfrage von mir :)

Hardwaretechnisch brauch ich nichts beachten oder?

von Benjamin S. (recycler)


Lesenswert?

Ist das Beispiel von TI auch für den 155er oder für einen anderen. Meist 
haben die MSPs andere Pinbelegungen.

von Christian R. (supachris)


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?

von Lars D. (eitum)


Lesenswert?

Mit den Funktionen funktionierts super. Scheinbar lag es nur daran, dass 
ich es nicht calibriert habe.
Dabei steht niergends dass das zwingend notwendig ist.

Jetzt muss ich nur noch ein wenig rumwuzeln um doch die 2,5 als Ref zu 
bekommen. Aber das bekomm ich schon hin.  Danke erstmal für die 
Zahlreiche Hilfe.

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.