Forum: Mikrocontroller und Digitale Elektronik UART am MSP430 bekommt kein tx-ready flag


von derGastlie (Gast)


Lesenswert?

Hallo,

ich verwende den Beispielcode von ti (msp430x24x_uscia0_uart_01_115k.c) 
um meine UART am MSP zu testen. Beim debugen sehe ich jedoch, dass er 
die ganze Zeit in der while-Schleife hängen bleibt und somit wartet bis 
der tx-buffer ready ist. Ich habe mir das Datenblatt durchgeschaut, 
jedoch wüsste ich nicht was ich nun noch ändern sollte, damit er endlich 
sein ready-flag erhält. Ich hoffe mir kann hier jemand weiterhelfen.

1
{
2
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
3
  if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)                                     
4
  {  
5
    while(1);                               // If calibration constants erased
6
                                            // do not load, trap CPU!!
7
  }   
8
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
9
  DCOCTL = CALDCO_1MHZ;
10
  P3SEL = 0x30;                             // P3.4,5 = USCI_A0 TXD/RXD
11
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
12
  UCA0BR0 = 8;                              // 1MHz 115200
13
  UCA0BR1 = 0;                              // 1MHz 115200
14
  UCA0MCTL = UCBRS2 + UCBRS0;               // Modulation UCBRSx = 5
15
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
16
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
17
18
  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
19
20
  
21
while(1)
22
{
23
    while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
24
    UCA0TXBUF = zeichen++;                         // TX -> RXed character
25
}

von noips (Gast)


Lesenswert?

Welche Entwicklungsumgebung benutzt du?

von Stefan (Gast)


Lesenswert?

Du schickst den µC in den LPM0 und erwartest ernsthaft, dass dieser sich 
selbst wieder aufweckt, um die while-Schleife zu bearbeiten ???

von derGastlie (Gast)


Lesenswert?

@ noips:
Ich nutze den "Code Composer Essentieals"

@ Stefan:
Sorry, stimmt. Hatte den Code einfach vom Beispiel hier rein kopiert. 
Den Teil mit "LPM0_bits +" habe ich in meinem Code raus gelöscht.

Zur korrekten Angabe hier noch mal der richtige Code (bei dem ich im 
debug-Modus in der "while (!(IFG2&UCA0TXIFG));"-Schleife hängen bleibe):
1
{
2
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
3
  if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)                                     
4
  {  
5
    while(1);                               // If calibration constants erased
6
                                            // do not load, trap CPU!!
7
  }   
8
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
9
  DCOCTL = CALDCO_1MHZ;
10
  P3SEL = 0x30;                             // P3.4,5 = USCI_A0 TXD/RXD
11
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
12
  UCA0BR0 = 8;                              // 1MHz 115200
13
  UCA0BR1 = 0;                              // 1MHz 115200
14
  UCA0MCTL = UCBRS2 + UCBRS0;               // Modulation UCBRSx = 5
15
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
16
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
17
18
  __bis_SR_register(GIE);       // Enter LPM0, interrupts enabled
19
20
  
21
while(1)
22
{
23
    while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
24
    UCA0TXBUF = zeichen++;                         // TX -> RXed character
25
}

von Dennis (Gast)


Lesenswert?

Wo ist denn dein RX-IR-Handler? Der ist aber schon auch noch irgendwo 
vorhanden, oder?

von Mathias H. (mathias_h)


Lesenswert?

Folgendes funktioniert bei mir:
1
P3SEL |= 0x30 ; // P3 . 4 , 5 = USCI A0 TXD/RXD
2
UCA0CTL1 = UCSSEL_2 ;
3
 UCA0BR0 = 0x1A ; //9600@1Mhz
4
 UCA0BR1 = 0x00 ;
5
 UCA0MCTL = UCBRS_2 ;    
6
UCA0CTL1 &= ~UCSWRST;

sieht so aus, als ob die Modulation fehlerhaft ist! (die andern Zeilen 
sind auch gleich!)

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.