Forum: Mikrocontroller und Digitale Elektronik MSP430FG4618 und der UART?


von Roland N. (eroli)


Angehängte Dateien:

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???)

von Roland N. (eroli)


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...

von Christian R. (supachris)


Lesenswert?

Deaktivier mal den TX-Interrupt, den brauchst du erst mal nicht. Und 
sicher, dass der ACLK mit 32kHz läuft? Irgendwie scheint die Baudrate 
nicht zu stimmen, wenn nur Müll ankommt.
Funktionierts denn mit HyperTerm? Und hast du mal ein Code-Beispiel von 
TI 1:1 getestet?

von Roland N. (eroli)


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?

von Roland N. (eroli)


Angehängte Dateien:

Lesenswert?

Vielleicht liegt der Fehler ja ganz wo anders (zum Beispiel an diesen 
blöden LPMs und dergleichen)?

Habe euch deswegen mal die komplette Main hochgeladen, die das Verhalten 
reproduziert.

von Roland N. (eroli)


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?

von Hans (Gast)


Lesenswert?

Läuft im LPM4 noch der SMCLK?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Könnte es sein, daß dieses "Experimenter's Board" eine galvanisch 
getrennte serielle Schnittstelle nutzt? Die pc-seitigen Pegelwandler 
funktionieren bei der nur, wenn der PC bestimmte Handshakeleitungen auf 
definierte Pegel setzt, da sonst die Speisespannung für die Pegelwandler 
fehlt.

Das Thema hatten wir hier vor ein paar Wochen schon mal.

von Roland N. (eroli)


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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?


von Roland N. (eroli)


Lesenswert?

Ist der Code-Snippet am Ende des Threads lauffähig?
Weißt du das zufällig?

Ansonsten ist das genau dasselbe Problem wie bei mir und lässt meine 
Hoffnung noch nicht ganz erlöschen ;-)

von Christian R. (supachris)


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?

von Roland N. (eroli)


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...)

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.