MSP430 DCO einstellen

Gast #472199
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.
Gast #472419
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!!
Persönliche Seite #472979
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).
Gast #536889
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
#536904
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.
Gast #536911
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
#537114
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?
Gast #537809
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
#537923
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.
Gast #538113
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 ;)
#538315
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...
Gast #677713
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!
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren