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?
Du musst die Zweitfunktion der Port-Pins erst mit P6SEL setzen. Per Default sind das digitale Eingänge.
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?
P6DIR = 0x3F; P6.6 (P6.6/A6/DAC0) muss Ausgang sein! P6DIR = 0x7F; versuchs mal damit.
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. ^^
Was ist das denn ???
1 | ADC12CTL0 |= !ENC; |
Damit löscht Du das ENC Bit ganz bestimmt nicht!
ach nicht? sondern wie? mal davon abgesehn das das eigentlich keine Unterschied machen sollte. Is nur der Sauberkeit halber drin.
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! :)
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.
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.
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?
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?
Ist das Beispiel von TI auch für den 155er oder für einen anderen. Meist haben die MSPs andere Pinbelegungen.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.