Forum: Mikrocontroller und Digitale Elektronik MSP430 DCO einstellen


von Christian S. (aliendrummer)


Lesenswert?

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

von antworter (Gast)


Lesenswert?

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

von Christian R. (supachris)


Angehängte Dateien:

Lesenswert?

Der angehängte Code klappt bestens. Gabs mal in einer AppNote von TI 
glaube.
Ich verwende den sehr oft.

von Christian S. (aliendrummer)


Lesenswert?

danke - sowas hab ich gesucht!

von direct_y (Gast)


Lesenswert?

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

von Jörg S. (Gast)


Lesenswert?

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.

von direct_y (Gast)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von Marcel Rudolph (Gast)


Lesenswert?

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

von Jörg S. (Gast)


Lesenswert?

> 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) :)

von Christian R. (supachris)


Lesenswert?

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.

von Marcel Rudolph (Gast)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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?

von marcel (Gast)


Lesenswert?

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

von Philipp B. (philipp_burch)


Lesenswert?

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.

von Marcel Rudolph (Gast)


Lesenswert?

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 ;)

von Christian R. (supachris)


Lesenswert?

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

von maria (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.