www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 DCO einstellen


Autor: Christian S. (aliendrummer)
Datum:

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

Autor: antworter (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:
Angehängte Dateien:

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

Autor: Christian S. (aliendrummer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke - sowas hab ich gesucht!

Autor: direct_y (Gast)
Datum:

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

Autor: Jörg S. (Gast)
Datum:

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

Autor: direct_y (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Marcel Rudolph (Gast)
Datum:

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

Autor: Jörg S. (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

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

Autor: Marcel Rudolph (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

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

Autor: marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x11;                            // P1.4 output
  P1SEL |= 0x10;
  P1OUT |= 0x01;                            // P1.4 SMCLK output
                                
  DCOCTL = 0xe0;
  BCSCTL1 = 0x87;
  BCSCTL2 = 0x00; 
  
  P5DIR |= 0x10;
  P5SEL |= 0x10;
 
  while (1)
  {
   P1OUT ^= 0x01; 
  }
}

jetzt ist die frage ob es schneller geht und wenn ja wie.

danke und gruß marcel

Autor: Philipp Burch (philipp_burch)
Datum:

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

Autor: Marcel Rudolph (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

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

Autor: maria (Gast)
Datum:
Angehängte Dateien:

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

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.