mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MXP430 DCO UART


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich Programmiere gerade den MSP430F179 mit einem externen Takt von 
32.768khz.
Ich möchte nun über die Uart0 eine Baudrate von 115200 baud erzeugen. 
Dazu brauch ich einen DCO takt von 1 Mhz. Mein Problem ist das ich die 
eingestellte DCO Frequenz nicht messen kann und somit auch die Register 
der Uart nicht richtig einstellen kann. Kann mir da jemand helfen in dem 
er mir die Registereinstellungen geben kann damit ich meine Baudrate 
erzeugen kann??

Danke schon mal.

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

Bewertung
0 lesenswert
nicht lesenswert
Einfach den Takt auf einem Portpin ausgeben lassen. Da es keinen F179 
gibt, hier mal der Code für einen F149:

SMCLK auf P5.5:
P5DIR |= BIT5;
P5SEL |= BIT5;

MCLK auf P5.4:
P5DIR |= BIT4;
P5SEL |= BIT4;

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst den DCO auch vom Timer A automatisch auf ein ganzzahliges 
vielfaches der 32,768kHz einstellen.

Hier der Code: DELTA ist der Vervierfachungsfaktor:
//------------------------------------------------------------------------------
void Set_DCO (void)                         // Set DCO to selected frequency
//------------------------------------------------------------------------------
{

#define DELTA 125              // 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
}

Zu Beachten ist aber, dass der DCO einen schrecklichen Temperatur- und 
Betriebsspannungsdrift hat. Für so schnelle Kommunikation ist das dann 
ein ganz schönes Glücksspiel, vor allem, wenn sich mal die Temperatur 
ändert.
Am besten die o.g. Funktion zyklisch ausführen, z.B. alle 1 Min oder so.
Oder einen Quarz an XT2 anschließen.

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

Bewertung
0 lesenswert
nicht lesenswert
> Am besten die o.g. Funktion zyklisch ausführen, z.B. alle 1 Min oder so.
> Oder einen Quarz an XT2 anschließen.
Oder externen Oszillator Widerstand benutzen (ROSC).

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe.
Läuft jetzt,nach ein bisschen tüfteln.

Stefan

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.