www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430F155 DAC Problem


Autor: Eitum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christian R. (supachris)
Datum:

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

Autor: Eitum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benjamin S. (recycler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P6DIR  =  0x3F;

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

P6DIR =  0x7F;

versuchs mal damit.

Autor: Eitum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ^^

Autor: Stefan (Gast)
Datum:

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

Autor: Eitum (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ach nicht?  sondern wie?
  ADC12CTL0 &= ~ENC;

Autor: Eitum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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! :)

Autor: Benjamin S. (recycler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eitum schrieb:
>   ADC12CTL0   =   REF2_5V + REFON;
>   DAC12_0CTL   =   DAC12IR + DAC12AMP_7 + DAC12ENC;

...

>   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.

Autor: Eitum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 .

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

    DAC12_0DAT = 0x0CCC;

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

Autor: Lars D. (eitum)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benjamin S. (recycler)
Datum:

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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hach stimmt, das AMP war ja drin.

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

void StartupDAC(void)
{
  DAC12_0CTL = DAC12IR + DAC12SREF_3 + DAC12AMP_7 + DAC12ENC;  //Ref = Veref+, Full-Speed, Enable Conv.  
  DAC12_1CTL = DAC12IR + DAC12SREF_3 + DAC12AMP_7 + DAC12ENC;  //Ref = Veref+, Full-Speed, Enable Conv.      
  
  DAC12_0CTL |= DAC12CALON;              //Kalibrierung starten...
  
  while (DAC12_0CTL & DAC12CALON);          //Kalibrierung abwarten
  
}

//Setzt die beiden integr. DAC12 Ausgänge

void SetDACs(unsigned int DAC0Vaule, unsigned int DAC1Value)
{
  DAC12_0DAT = DAC0Vaule;
  DAC12_1DAT = DAC1Value;
}

//Schaltet den int. DAC12 ab

void DAC_Off(void)
{
  DAC12_0CTL = 0;
  DAC12_1CTL = 0;
}

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?

Autor: Lars D. (eitum)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.