www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik MSP430 DCO einstellen

Autor: Christian S. (aliendrummer)
Datum: 20.12.2006 17:01

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: 20.12.2006 17:11

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: 20.12.2006 17:33
Dateianhang: dco.c (1,6 KB, 444 Downloads) | formatierter Code

Der angehängte Code klappt bestens. Gabs mal in einer AppNote von TI
glaube.
Ich verwende den sehr oft.
Autor: Christian S. (aliendrummer)
Datum: 20.12.2006 19:28

danke - sowas hab ich gesucht!
Autor: direct_y (Gast)
Datum: 09.01.2007 12:12

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: 09.01.2007 12:33

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: 09.01.2007 16:15

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: 10.01.2007 10:51

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 t. Firefly (rufus) (Moderator)
Datum: 10.01.2007 11:15

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: 10.04.2007 14:43

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: 10.04.2007 14:52

> 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: 10.04.2007 15:05

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: 10.04.2007 15:13

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: 10.04.2007 18:50

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: 11.04.2007 15:46

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: 11.04.2007 17:42

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: 11.04.2007 22:43

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: 12.04.2007 10:20

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: 16.10.2007 18:46
Dateianhang: exercise.doc (31 KB, 62 Downloads)

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel





Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net