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


von Bernd K. (Gast)


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.
1
void init_Clock( void )
2
{ unsigned char i = 0;
3
  // Turning XT1 (32kHz) on
4
  _BIC_SR (OSCOFF);           // Turn on XT1
5
  BCSCTL1 &= ~XTS;          // LF mode
6
  for (i = 0xFFFF; i > 0; i--);   // Time for osc. to set
7
  // XT1 is on
8
9
  // Turning XT2 (8MHz) on
10
  BCSCTL1 &= ~XT2OFF;         // Turn on XT2
11
  do
12
  {                       // pruefroutine, ob 8 Mhz-oszillator schon stabil ist
13
    IFG1 &= ~OFIFG;       // OSCFault flag loeschen (zeigt oszillatorfehler an)
14
    for (i=0xFF;i>0;i--); // warten, ob es wieder gesetzt wird
15
  }
16
  while ((IFG1 & OFIFG) != 0);   // OSCFault immer noch gesetzt?
17
18
  BCSCTL2 |=  SELM_2 + DIVM_0 +   // MCLK source is XT2, MCLK div is 1
19
              SELS + DIVS_0;     // SMCLK souce is DCO, SMCLK div is 1
20
  BCSCTL1 |= DIVA_0;             // Divider for ACLK is 1
21
22
  // At this point we have the following clock configuration:
23
  // MCLK is 8 MHz (from XT2)
24
  // SMCLK is 8 MHz (from XT2)
25
  // ACLK is 32 kHz (from XT1)
26
}
27
28
void main(void)
29
{
30
    _STOP_WATCHDOG();    //definiert in "msp430def.h"
31
   
32
   ptr_mw  = &mw; 
33
   ptr_mw0 = &mw0; 
34
   ptr_mw1 = &mw1; 
35
   ptr_mw2 = &mw2;    
36
  
37
   P1SEL = 0x00;      //Std.IO
38
   P1DIR = 0xFF;      //alles Ausgänge
39
   
40
   P2SEL = 0x00;      //Std.IO
41
   P2DIR = 0xFF;      //alles Ausgänge
42
   
43
   P3SEL = 0xf0;     //P3.0..3 Standard I/O; P3.4..7 Peripheral Modul Function (UART)
44
   P3DIR = 0x00;     //P3.0..3 Ausgaenge; P3.4..7 = x
45
46
   P6SEL = 0xFF;        //Peripheral Modul Function (ADC12)
47
   
48
   //init_Clock();
49
   timera_init();
50
   timerb_init();
51
   init_DAC();
52
   init_ADC();
53
   init_SIO();
54
   
55
  
56
   //Interruptfreigaben
57
   //ADC12IE = 0xFFFF;  //Int-Freigabe für das Ergebnisregister ADC12MEM0
58
   //ADC12IE = ADC12IE2;   
59
   ADC12IE = 0x0004;             // ADC12 memory 0,2, 
60
   //ADC12IE = 0x0001; 
61
   TACCTL0 |= CCIE;   //Timer A C/C Int Enable (für TACCR0)
62
63
   TBCCTL0 |= CCIE;   //Tiemr_B C/C Int Enable (für TBCCR0)
64
   
65
   IE1     |= UTXIE0;   //SIO0 TX-Int freigeben
66
   
67
   _BIS_SR(GIE);     //GIE = 1, globale Interruptfreigabe
68
  
69
70
   TACTL |= MC_1;    //Timer_A starten
71
   // CPU Takt
72
   DCOCTL = DCO0 + DCO1 + DCO2;
73
   BCSCTL1 = RSEL0 + RSEL1 + RSEL2;
74
   BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;
75
     
76
  
77
   while(1);  //Endlosschleife - Warten auf Interrupts
78
79
}
80
void init_SIO(void)
81
{
82
//SIO0
83
  ME1 |= UTXE0;                 //Transmitter enablen
84
  U0CTL |= CHAR;                //8 data bits, 1 stop bit, no parity (8N1)
85
  //U0TCTL |= 0x10;              //ACLK als UCLK festlegen
86
    UTCTL0 |= SSEL1;           // SMCLK als UCLK festlegen
87
  //U0BR0 = 0x03;             //9600 baud aus 32.768 kHz erzeugen
88
  //U0MCTL = 0x4A;                //Korrektur der Division (Tabelle auf 13-16)
89
  //U0BR0 = 0x41;            // 19200 baud aus 8 MHz erzeugen
90
    //U0BR1 = 0x03;            // siehe application note tabelle 1, seite 9
91
    //U0MCTL = 0x09;           // keine korrektur der division noetig
92
    //UBR00=0xA0; UBR10=0x01; UMCTL0=0x00; /* uart0 8000000Hz 19198bps */
93
  //UBR00=0x41; UBR10=0x03; UMCTL0=0x09; /* uart0 8000000Hz 9600bps */
94
     UBR00=0x45; UBR10=0x00; UMCTL0=0xAA; /* uart0 8000000Hz 115107bp */
95
  U0BR1 = 0x00;                 
96
  U0CTL &= ~SWRST;              //USART freigeben
97
//  IFG1 &= ~UTXIFG0;             //initales Int-Flag löschen
98
}

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?

von Christian R. (supachris)


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.

von Bernd K. (Gast)


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;

von Bernd K. (Gast)


Lesenswert?

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

von Bernd K. (Gast)


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?

von Christian R. (supachris)


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.

von Bernd K. (Gast)


Lesenswert?

@Christian R.

Die Frequenz bleibt bei 5.1Mhz

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

Begehe ich einen grundsaetzlichen Fehler?

von Christian R. (supachris)


Lesenswert?

Ja. Der DCO kann nur bis 5,x MHZ. Du musst einfach am Ende wieder
1
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.

von Bernd K. (Gast)


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

von Stefan (Gast)


Lesenswert?

Ist Dein Code jetzt also so:
1
 DCOCTL = DCO0 + DCO1 + DCO2;
2
 BCSCTL1 = RSEL0 + RSEL1 + RSEL2 + SELM_2 + DIVM_0 + SELS + DIVS_0;
3
 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!

von Christian R. (supachris)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.