Hallo! ICh habe mich grade mit dem DCO vom MSP beschäftigt und suche Beispielprogramme wie man ihn einstellt. Bei den Beispielen von TI finde ich kein passendes! Wer von euch hat da was? Gruß CHRiS
details findest du im entsprechenden "user´s guide" z.b.: http://focus.ti.com/lit/ug/slau049f/slau049f.pdf kapitel 4 (basic clock module) S.116 Parameter DCOx und PSELx u.a. im Register DCOCTL
Der angehängte Code klappt bestens. Gabs mal in einer AppNote von TI glaube. Ich verwende den sehr oft.
Hi, hab die Funktion bei mir mal getestet (dco.c), also wenn ich das richtig verstehe stelle ich mit dem DELTA=125. ca 4 Mhz ein,oder? (125*33 kHz) --> wenn ich jetzt aber in die Register schaue wird bei mir RSEL1=1 und DCO1=1 gesetzt --> das ergibt laut Datenblatt ca. 200 kHz?? http://focus.ti.com/lit/ug/slau049f/slau049f.pdf (S.116) kann mir da jemand helfen??
Nach dem Diagramm im Datenblatt kann man meiner Erfahrung nach nicht gehen. Das stimmt hinten und vorne nicht. Wenn du wissen willst was tatsächlich für ein Takt rausgekommen ist, empfehle ich dir das entsprechende PxSEL Register zu setzen und dir den Takt direkt an einem Portpin ausgeben zu lassen. Mit einem Oszi oder Frequenzzähler kannst du dann genau schauen was anliegt.
so hab mir jetzt mal ein Oszi besorgt, am Pin 1.4 (MSP430f169) messe ich nun eine Frequenz von ca.300 kHZ. Sollten da nicht aber eigentlich 125*33kHz raus kommen? folgende Funktionhabe ich verwendet: void Set_DCO (void) // Set DCO to selected frequency //---------------------------------------------------------------------- -------- { #define DELTA 125 // (125 war voreingestell)target DCO = DELTA*(32768) = 4096000 unsigned int Compare, Oldcapture = 0; CCTL2 = CM_1 + CCIS_1 + CAP; // CAP, ACLK TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, cont-mode, clear while (1) { while (!(CCIFG & CCTL2)); // Wait until capture occured CCTL2 &= ~CCIFG; // Capture occured, clear flag Compare = CCR2; // Get current captured SMCLK Compare = Compare - Oldcapture; // SMCLK difference Oldcapture = CCR2; // Save current captured SMCLK if (DELTA == Compare) break; // If equal, leave "while(1)" else if (DELTA < Compare) // DCO is too fast, slow it down { DCOCTL--; if (DCOCTL == 0xFF) { if (!(BCSCTL1 == (XT2OFF))) BCSCTL1--; // Did DCO roll under?, Sel lower RSEL } } else { DCOCTL++; if (DCOCTL == 0x00) { if (!(BCSCTL1 == (XT2OFF + 0x07))) BCSCTL1++; // Did DCO roll over? Sel higher RSEL } } } CCTL2 = 0; // Stop CCR2 TACTL = 0; // Stop Timer_A } Bedank mich schon mal im vorraus für jeden Tipp!!
Also bei mir klappt das. Allerdings nur bis zur maximalen DCO-Frequenz. Die ist irgendwo bei ca 5MHz bei den MSP430x1x. Erst die 400er Reihe kann dann höhere DCO-Frequenzen liefern, weil sie die FLL+ eingebaut hat. Die 4,096MHz klappen aber bestens auf meinem MSP430F1611 hier.
Bei den neueren Modellen MSP430F2001..3, F2011..13 gibt es im Information Memory eine Tabelle, in der Kalibrierungswerte für die DCO-Register für einige definierte Frequenzen abgespeichert sind: CALBC1_1MHZ 0x10FF CALDCO_1MHz 0x10FE CALBC1_8MHZ 0x10FD CALDCO_8MHz 0x10FC CALBC1_12MHZ 0x10FB CALDCO_12MHz 0x10FA CALBC1_16MHZ 0x10F9 CALDCO_16MHz 0x10F8 Die an diesen Adressen gespeicherten Werte nach BC1 und DCO geschrieben und schon läuft das gute Stück mit den entsprechenden Frequenzen - bis 16 MHz (dann allerdings sind 3.3V Versorgungsspannung auch wirklich nötig).
Hallo Leute, ich hab mal ne relativ grundlegende Frage zum Thema DCO.... Kann ich den Takt den mit der DCO liefert als CPU Takt nutzen? Also so wie ich es im Datenblatt verstehe geht es wohl..... Aber ich bekomm es einfach net hin! Ich würde gerne den P1.0 mit 8 MHz toggeln (später dann auch etwas mehr, um einen Sensor an zusprechen). Hat einer von euch vielleicht nen Tipp? Gruß und Danke im voraus..... Marcel
> Kann ich den Takt den mit der DCO liefert als CPU Takt nutzen?
Das ist überhaupt kein Problem, da der MSP sowieso den DCO als CPU Takt
nutzt (solange man es nicht verstellt) :)
Der DCO liefert mit dem internen Widerstand am RC-Oszillator nur max. 5.6MHz oder sowas. Außerdem schwankt das recht heftig mit der Temperatur. Standardmäßig läuft die gesamte CPU auf DCO-Clock.... Welchen MSP benutzt du denn? Der neue FLL+ DCO kann auch höhere Frequenzen erzeugen, aber der alte (im F169 usw. z.B.) nur bis 5,6MHz. Einen Pin togglen macht man am besten mit dem Timer und den CCR Registern. geht wunderbar.
Hi erstmal vielen dank für die schnellen antworten!!!! ich nutze den "alten" f169 und wenn er nur 5,6 mhz toggelt solls mir auch recht sein ;). stabilität ist in dem zusammenhang auch nicht sooooooo mega wichtig es geht erstmal daru was zu sehen ..... also den mckl hab ich auf ca. 4mhz eingestellt und mit an p5.4 auf dem oszi angesehen --> es tut! jetzt will ich aber eine bestimmte reinfolge an low - high pegel an p1.0 ausgeben (ebend mit den 4mhz oder so) aber das geht nicht in der art: init_dco(); while (1) { P1Out ^= 0x01; } da toggelt er nur alle 32khz (low power quarz). wie stellt man es an das er jetzt den pin alle 250ns toggelt? muss ich da den timer nutzen oder geht es auch so? gruß Marcel
Also alle 4MHz schafft der so glaub gar nicht, schließlich sind das ja immer ein paar Befehle, die er ausführen muss. Und davon dauert einer im besten Fall schon 250ns. Nimm lieber einen Timer mit CCR-Register. Da kann man solche Spielerein machen. Kannst ja 1 ins CCR0 laden, dann sollte zumindest der halbe MCLK rauskommen. Aber 32khz is auch zu wenig. Bist du sicher, dass du dieses SELM Register nicht verändert hast und in keinem Low Power Mode bist?
Hi also ich habe es jetzt geschafft den DCO so einzustellen, dass der pin mit ca. 400khz toggelt. der systemtakt mclk ist ca 5mhz (mein oszi ist nen bissel alt und kann max 0,5µs/div). das ist ja schon mal nen anfang aber nen bissel schneller wäre dann doch noch gut (wenns mit 800khz gehen würde wäre ich glücklich). rahmenbedingungen: msp430f169 iar embedded 3.42a (kick start) code:
1 | void main(void) |
2 | {
|
3 | WDTCTL = WDTPW + WDTHOLD; // Stop WDT |
4 | P1DIR |= 0x11; // P1.4 output |
5 | P1SEL |= 0x10; |
6 | P1OUT |= 0x01; // P1.4 SMCLK output |
7 | |
8 | DCOCTL = 0xe0; |
9 | BCSCTL1 = 0x87; |
10 | BCSCTL2 = 0x00; |
11 | |
12 | P5DIR |= 0x10; |
13 | P5SEL |= 0x10; |
14 | |
15 | while (1) |
16 | {
|
17 | P1OUT ^= 0x01; |
18 | }
|
19 | }
|
jetzt ist die frage ob es schneller geht und wenn ja wie. danke und gruß marcel
Wie wär's wenn du es endlich mal mit einem Timer versuchen würdest? Wurde nun schon ein paar Mal gesagt und ist die schnellste Möglichkeit um einen Pin zu togglen. Wenn du aber eine "echte" Schnittstelle brauchst und nicht bloss Pingewackel, dann solltest du eine Hardware-Schnittstelle verwenden (Sofern vorhanden, z.B. SPI oder USART) oder aber in Software emulieren. Zweiteres ist dann aber insbesondere auf den MSPs (Im Vergleich zu den AVRs) schon arg langsam... 800kHz bei 4MHz MCLK dürfte schon arg eng werden wenn's SPI ist. Bei etwas komplexerem erst recht nicht möglich. Auch wenn du mit dieser Frequenz empfangen willst wirste wohl nicht weit kommen.
genau um so eine "echte" schnittstelle geht es! es ist quasi eine art spi zu realisieren. den treiber habe ich dafür schon da und der ist nicht mit timer realisiert -> wenn ich ihn net selber noch mal mit timer basteln will (was der fall ist) wäre ein schnelles toggeln der pins wünschenswert! ps. der treiber wurde für nen pic/avr geschrieben. diese prozessoren eignen sich aufgrund ihres doch recht hohen stromverbrauchs leider nicht unbedingt für meine anwendung. gruß marcel der timer kennt und diese in der regel auch verwendent ;)
Ich verwende die Hardware-SPI auch mit dem Ausgangssignal des Timers mit Output-Unit. Ist ziemlich einfach. Man stellt den Timer entsprechend ein, dass er das gewünschte High-Low Muster erzeugt, was ja dank der mehrfachen CCR und der verschiedenen Output Modes recht einfach ist, und lässt sich außerdem an der passenden Stelle einen Interrupt erzeugen. Im CCR-Interrupt lese ich dann den externen ADC per Hardware-SPI aus. das ganze hat den Vorteil, dass die Abtastpunkte wirklich äquidistant sind...
In meinem programm mochte ich die calibration CALDCO vom DCO überschreiben. Das programm dass da oben steht hat gut funktioniert aber was für eine möglichkeiten sind noch. Konnten sie mir eine Seite mit Übungen oder Beispiele für DCO code empfehlen? Ich danke Ihnen im Voraus!
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.