[MSP430] Probleme mit UART via XT2

Gast #1042567
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?
#1042622
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.
Gast #1042653
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;
Gast #1042690
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?
Gast #1043542
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?
Gast #1045970
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!
#1046009
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren