MSP430FG4618 und der UART?

OP #2242139
Lesenswert?

Hallo zusammen,

ich versuche nun mittlerweile verzweifelt den UART ans laufen zu 
kriegen.
Der Microcontroller befindet sich auf dem MSP430 Experimenters Board und 
es ist keine zusätzliche Hardware angeschlossen.

Es wird der größere der beiden Controller benutzt, also der 
MSP430FG4618.

So, ich will nun den UART ans Laufen kriegen und dann mit dem Computer 
kommunizieren.

Fangen wir erstmal beim Controller an, dort initialsiere ich den UART 
wie folgt:
1
void initUART()
2
{
3
  P2SEL |= (BIT4 | BIT5);     // Set TXD and RXD Pins
4
  U1ME |= UTXE1 + URXE1;
5
  U1CTL |= CHAR;              // 8-Bit Data, (1 Stop-Bit, No Parity)
6
  U1TCTL |= SSEL1;            // Set ACLK as UCLK
7
  U1BR0 = 0x03;               // Set Baudrate 9600 (at 32.768 KHz)
8
  U1BR1 = 0x00; 
9
  U1MCTL = 0x4A;
10
  U1CTL &= ~SWRST;            // Activate UART
11
  IE1 |= URXIE1 + UTXIE1;     // Activate UART-Interrupts
12
  IFG2 &= ~UTXIFG1;           // Clear Interrupt Flags
13
}

Dann habe ich mir Breakpoints in die beiden Interrupts gesetzt:
1
#pragma vector=USART1TX_VECTOR
2
__interrupt void USART1_TX(void)
3
{
4
 TXBUF1 = 0xFF; 
5
}
6

7
#pragma vector=USART1RX_VECTOR
8
__interrupt void USART1_RX(void)
9
{
10
 unsigned short test = RXBUF1; 
11
}

Aber es wird nie ein Breakpoint erreicht.
Nun frage ich mich die ganze Zeit, ob die UART denn wirklich läuft oder 
ob es da Probleme zum Beispiel mit dem Oszillator geben könnte, aber mir 
fällt keine Möglichkeit zum testen ein...

Das Experimenters Board hat ja bereits eine DSUB9-Buchse drauf. Deswegen 
gehe ich mal davon aus, dass ich keine Pegelwandler benötige.

Als Kabel benutze ich das beim STK500 mitgelieferte Kabel.
Wenn ich da mal die Durchgänge prüfe, dann komme ich auf folgendes 
Ergebnis (eigene Nummerierung):
 (Buchsen-Seite)           (Stecker-Seite)
  /----------\             /-----------\
 / 0  1  2  3  \          / 3  2  1  0  \
/ 4  5  6  7  8 \        / 8  7  6  5  4 \
-----------------       -------------------

In der hochgeladenen PDF (slau213a.pdf) findet ihr am Ende einen 
Schaltplan des Boards.

Vielleicht machen wir erstmal hier Pause, da ich zum Senden vom PC das 
.NET Framework benutze und hoffe, dass es da eigentlich keine Fehler 
geben sollte...

Ich hoffe, dass ich einige Leute finden, die mir auf die Sprünge helfen 
können :-)

Ciao,
Roland


EDIT: Vielleicht noch ein kleiner Hinweis:
Der RealTimer wird zum Beispiel so initialisiert und läuft dabei 
sekündlich:
1
void initBasicTimer(void) // Initialize basic timer
2
{
3
  // Basic timer setup
4
  // Set ticker to 32768/(256*128) = 1  (One Interrupt per second)
5
  // Enable BT interrupt
6
  BTCTL = BT_fCLK2_DIV128 | BT_fCLK2_ACLK_DIV256;
7
  IE2 |= BTIE;
8
}

Da dort die ACLK benutzt wird, habe ich versucht die ACLK auch für den 
UART zu benutzen und deswegen die Codevorlage abgeändert und SSEL1 
benutzt (in der Codevorlage wurde SSEL0 benutzt, ABER im Kommentar stand 
auch ACLK. Dies passt laut ApplicationNotes aber nicht zusammen - oder 
etwa doch???)
Angehängte Dateien:
OP #2242208
Lesenswert?

Lasse den Microcontroller nun zyklisch im Timer (sekündlich) etwas 
senden:
1
void SendUSART1c(char c)             // ein einzelnes zeichen über die serielle schnittstelle (USART1) senden
2
{
3
  while (!(IFG2 & UTXIFG1));           // warten, bis USART1 TX-buffer sendebereit
4
  TXBUF1 = c;
5
}

Allerdings entwickelt sich diese while-Schleife zu einer Endlosschleife 
und am PC selbst kommt nur Müll raus (wirre Zeichen - aber immerhin 
kommt etwas :-))

Breakpoints im Interrupt zum senden oder empfangen werden leider nicht 
erreicht.

Was ist da los?

EDIT: Um genauer zu sein, schafft der COntroller es nicht irgendein 
Zeichen zu senden (Endlosschleife!).
Dafür kommen beim Initialisieren der UART ein Rechteck und ein y mit 
Strich drüber am PC an...
OP #2242238
Lesenswert?

Da der Timer (wie im Edit erwähnt) genau mit einem Interval von einer 
Sekunde läuft, sollte die ACLK tatsächlich mit 32Khz takten.
Hier nochmal wie der Timer initialisiert wird:
1
void initBasicTimer(void) // Initialize basic timer
2
{
3
  // Basic timer setup
4
  // Set ticker to 32768/(256*128) = 1  (One Interrupt per second)
5
  // Enable BT interrupt
6
  BTCTL = BT_fCLK2_DIV128 | BT_fCLK2_ACLK_DIV256;
7
  IE2 |= BTIE;
8
}

(Im Timer selbst wird eine LED getoggled: Die blinkt wirklich 
sekündlich)

Meine Initialisierung sieht nun so aus (TX-Interrupt disabled):
1
void initUART()
2
{
3
  P2SEL |= (BIT4 | BIT5);     // Set TXD and RXD Pins
4
  U1ME |= UTXE1 + URXE1;
5
  U1CTL |= CHAR;              // 8-Bit Data, (1 Stop-Bit, No Parity)
6
  U1TCTL |= SSEL1;            // Set ACLK as UCLK
7
  U1BR0 = 0x03;               // Set Baudrate 9600 (at 32.768 KHz)
8
  U1BR1 = 0x00; 
9
  U1MCTL = 0x4A;
10
  U1CTL &= ~SWRST;            // Activate UART
11
  IE1 |= URXIE1;
12
  //IE1 |= URXIE1 + UTXIE1;     // Activate UART-Interrupts
13
  IFG2 &= ~UTXIFG1;           // Clear Interrupt Flags
14
}

Dennoch hat sich nichts geändert, er bleibt in der while-Schleife zum 
Senden für immer hängen...

EDIT: Was für ein FlowControl soll ich denn in der Software am PC 
einstellen?
HardwareFlowControl oder SoftwareFlowControl oder beides?
OP #2242304
Lesenswert?

Hallo zusammen,

ich glaube ich habe es.

Alle Code-Beispiele von TI benutzen die Pins URXD1 und UTXD1 (an Port4).
AUf dem Board ist die DSUB9-Buchse jedoch mit den Pins UCA0RXD und 
UCA0TXD verbunden.

(Siehe auch slau.pdf weiter oben)

Wie kann ich nun an diesen Pins eine UART herstellen? Brauche ich dazu 
eine Software-UART?
OP #2242495
Lesenswert?

Ja, die Schnittstelle ist per Optokoppler verbunden.

Hast du ein paar Stichworte, wie ich das Thema finden kann?

Kann mir jemand den Unterschied zwischen URXD1 / UTXD1 (an Port4)und 
UCA0RXD / UCA0TXD (an Port2) erklären?
Das wäre sehr nett.

Kann ich den Pins an Port2 eine Hardware-UART laufen lassen?


Ob der SMCLK im LPM4 läuft weiß ich gerade nicht, wieso?
#2242557
Lesenswert?

Roland M. schrieb:
> Kann mir jemand den Unterschied zwischen URXD1 / UTXD1 (an Port4)und
> UCA0RXD / UCA0TXD (an Port2) erklären?

Prinzipiell ist für deine Anwendung da erst mal keiner. Du musst nur die 
P2SEL dann entsprechend setzen, statt P4SEL. Siehe auch Zitat aus dem 
anderen thread:

P2.4/UCA0TXD --> USCI_A0/UART or IrDA mode
P2.5/UCA0RXD --> USCI_A0/UART or IrDA mode

P4.1/URXD1 --> receive data in - USART1/UART mode
P4.2/UTXD1 --> transmit data out - USART1/UART mode

Was bei dir aber komisch ist: Du willst UCA0 verwenden, initialisierst 
aber U1CTL Register usw.....früher bei den "alten" MSP430 war das für 
USART1, was dann UCA1TXD/UCA1RXD wäre...oder ist das jetzt mit den 
UCI/USCI und A/B anders?
OP #2242580
Lesenswert?

Ich will eine UART an der RS232 Schnittstelle betreiben, also an P2.4 
und P2.5.

Dann habe ich das wohl falsch gemacht, dass ich USART1 verwenden wollte.

Wenn ich UCA0 verwenden muss für die Pins, dann kann ich mich doch an 
diesem Thread halten, oder?
Beitrag "MSP430 und UART: Manchmal Datenmüll"

Heißt das ich brauche doch keine Software-UART?

(Sorry ich bin uC-Neuling und auf jeden Fall ein absoluter 
UART-und-so-ein-Kram-Anfänger...)

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