www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [MSP430] Probleme mit UART via XT2


Autor: Bernd K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bisher habe ich ueber die RS232 mit 9600baud Daten uebertragen (ALCK). 
Um hoehere Datenraten zu erreichen, hab ich an XT2 einen 8Mhz Quarz + 
Kondensatoren.
void init_Clock( void )
{ unsigned char i = 0;
  // Turning XT1 (32kHz) on
  _BIC_SR (OSCOFF);           // Turn on XT1
  BCSCTL1 &= ~XTS;          // LF mode
  for (i = 0xFFFF; i > 0; i--);   // Time for osc. to set
  // XT1 is on

  // Turning XT2 (8MHz) on
  BCSCTL1 &= ~XT2OFF;         // Turn on XT2
  do
  {                       // pruefroutine, ob 8 Mhz-oszillator schon stabil ist
    IFG1 &= ~OFIFG;       // OSCFault flag loeschen (zeigt oszillatorfehler an)
    for (i=0xFF;i>0;i--); // warten, ob es wieder gesetzt wird
  }
  while ((IFG1 & OFIFG) != 0);   // OSCFault immer noch gesetzt?

  BCSCTL2 |=  SELM_2 + DIVM_0 +   // MCLK source is XT2, MCLK div is 1
              SELS + DIVS_0;     // SMCLK souce is DCO, SMCLK div is 1
  BCSCTL1 |= DIVA_0;             // Divider for ACLK is 1

  // At this point we have the following clock configuration:
  // MCLK is 8 MHz (from XT2)
  // SMCLK is 8 MHz (from XT2)
  // ACLK is 32 kHz (from XT1)
}

void main(void)
{
    _STOP_WATCHDOG();    //definiert in "msp430def.h"
   
   ptr_mw  = &mw; 
   ptr_mw0 = &mw0; 
   ptr_mw1 = &mw1; 
   ptr_mw2 = &mw2;    
  
   P1SEL = 0x00;      //Std.IO
   P1DIR = 0xFF;      //alles Ausgänge
   
   P2SEL = 0x00;      //Std.IO
   P2DIR = 0xFF;      //alles Ausgänge
   
   P3SEL = 0xf0;     //P3.0..3 Standard I/O; P3.4..7 Peripheral Modul Function (UART)
   P3DIR = 0x00;     //P3.0..3 Ausgaenge; P3.4..7 = x

   P6SEL = 0xFF;        //Peripheral Modul Function (ADC12)
   
   //init_Clock();
   timera_init();
   timerb_init();
   init_DAC();
   init_ADC();
   init_SIO();
   
  
   //Interruptfreigaben
   //ADC12IE = 0xFFFF;  //Int-Freigabe für das Ergebnisregister ADC12MEM0
   //ADC12IE = ADC12IE2;   
   ADC12IE = 0x0004;             // ADC12 memory 0,2, 
   //ADC12IE = 0x0001; 
   TACCTL0 |= CCIE;   //Timer A C/C Int Enable (für TACCR0)

   TBCCTL0 |= CCIE;   //Tiemr_B C/C Int Enable (für TBCCR0)
   
   IE1     |= UTXIE0;   //SIO0 TX-Int freigeben
   
   _BIS_SR(GIE);     //GIE = 1, globale Interruptfreigabe
  

   TACTL |= MC_1;    //Timer_A starten
   // CPU Takt
   DCOCTL = DCO0 + DCO1 + DCO2;
   BCSCTL1 = RSEL0 + RSEL1 + RSEL2;
   BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;
     
  
   while(1);  //Endlosschleife - Warten auf Interrupts

}
void init_SIO(void)
{
//SIO0
  ME1 |= UTXE0;                 //Transmitter enablen
  U0CTL |= CHAR;                //8 data bits, 1 stop bit, no parity (8N1)
  //U0TCTL |= 0x10;              //ACLK als UCLK festlegen
    UTCTL0 |= SSEL1;           // SMCLK als UCLK festlegen
  //U0BR0 = 0x03;             //9600 baud aus 32.768 kHz erzeugen
  //U0MCTL = 0x4A;                //Korrektur der Division (Tabelle auf 13-16)
  //U0BR0 = 0x41;            // 19200 baud aus 8 MHz erzeugen
    //U0BR1 = 0x03;            // siehe application note tabelle 1, seite 9
    //U0MCTL = 0x09;           // keine korrektur der division noetig
    //UBR00=0xA0; UBR10=0x01; UMCTL0=0x00; /* uart0 8000000Hz 19198bps */
  //UBR00=0x41; UBR10=0x03; UMCTL0=0x09; /* uart0 8000000Hz 9600bps */
     UBR00=0x45; UBR10=0x00; UMCTL0=0xAA; /* uart0 8000000Hz 115107bp */
  U0BR1 = 0x00;                 
  U0CTL &= ~SWRST;              //USART freigeben
//  IFG1 &= ~UTXIFG0;             //initales Int-Flag löschen
}


Die Datenuebertragung ist fehlerhaft und ich weiss noch nich wie ich mit 
dem Pruefen vorgehen soll.
Zunaechst wollte ich den SMCLK und MCLK ueberpruefen.. Wie mache ich das 
am Besten?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hoch ist deine Betriebsspannung? Passen die Kondensatoren zur 
gefoderten Last des Quarzes? SMCLK, MCLK und ACLK kannst du dir an den 
Pins ausgeben lassen, welche genau das sind, hängt von deinem MSP430 ab. 
Ich nehme an, das ist ein MSP430F1xx? Dann muss für 8MHz die 
Betriebsspannung nahezu 3,6V betragen, siehe Datenblatt. Mit 3,3V läuft 
er instabil. Desweiteren wollte man sicherheitshalber vor dem 
Initialisieren der USART das SWRST Bit nochmal setzen, falls es vorher 
mal schon gelöscht wurde....beim ersten Mal ist es aber per Default 
gestezt.

Autor: Bernd K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Betriebsspannung betraegt 3.3V, es handelt sich um einen 
MSP430F1611. Die Kondensatoren passen zur Last. Ich moechte den 8Mhz nur 
fuer die Serielle Schnittstelle verwenden, der MSP selbst laeuft nicht 
mit den 8MHz.
Kann ich die Takte an Port 5 so ausgeben lassen?
P5SEL = 0xff;

Autor: Bernd K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs mal nachgemessen.. P5.4 und P5.5, also SMCLK und MCLK liegen bei 
5.1 MHz

Autor: Bernd K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Berechne jetzt die Uart aus 5.1 Mhz und die Datenuebertragung 
funktioniert mit 115200baud..

der Teil hier zerhaut die Clock-Einstellungen..

   // CPU Takt
   DCOCTL = DCO0 + DCO1 + DCO2;
   BCSCTL1 = RSEL0 + RSEL1 + RSEL2;
   BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;



Kann mir jemand erklaeren, wie ich das richtig konfigurieren muss?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, na dann musst du im BCSCTL2 einfach das SELS Bit wieder setzen, 
dann schaltet der SMCLK wieder auf die 8MHz vom XT2 um. Die löscht das 
ja bei der DCO-Einstellung, damit hat der SMCLK dann wieder DCOCLK.

Autor: Bernd K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Christian R.

Die Frequenz bleibt bei 5.1Mhz

hab jetzt verschiede Einstellungen probiert, aber SMCLK bekomme nicht 
auf die 8MHz.
 DCOCTL = DCO0 + DCO1 + DCO2;
 BCSCTL1 = RSEL0 + RSEL1 + RSEL2 + SELM_2 + DIVM_0 + SELS + DIVS_0;
 BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;

Begehe ich einen grundsaetzlichen Fehler?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja. Der DCO kann nur bis 5,x MHZ. Du musst einfach am Ende wieder
BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0 + SELS;
schreiben, dann wird der SMCLK wieder zurück auf den Quarz geschaltet. 
Vertausch doch einfach die Initialisierung von DCO und XT2, dann klappts 
auch.

Autor: Bernd K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Christian

Durch die Aenderung des SMCLK ist der ACLK(P5.6) nun voellig instabil. 
Der MSP laeuft nun instabil und verschluckt ab und zu Interrutps.. Hast 
du eine Erklaerung dafuer?

Bernd

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist Dein Code jetzt also so:
 DCOCTL = DCO0 + DCO1 + DCO2;
 BCSCTL1 = RSEL0 + RSEL1 + RSEL2 + SELM_2 + DIVM_0 + SELS + DIVS_0;
 BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0 + SELS;
 ???

In BCSCTL1 gibt es kein SELM_2 + DIVM_0 + SELS + DIVS_0
Damit verhaust Du Dir korrekte Einstellungen!

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich frag mich immer, wieso sich die Leute nicht an die Code-Examples von 
TI halten. Die funktionieren doch. Abweichende Einstellungen kann man 
dann immer noch machen. Ich setze den DCO immer auf ein Vielfaches des 
ACLK, da gibts eine Appnote mit dem Timer A. Dann kann man immer noch 
den Quarz aktivieren und nur den SMCLK auf den XT2 setzen.

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.