PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MSP430FG4618 und der UART?



Eroli
27.06.2011, 13:26
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:



void initUART()
{
P2SEL |= (BIT4 | BIT5); // Set TXD and RXD Pins
U1ME |= UTXE1 + URXE1;
U1CTL |= CHAR; // 8-Bit Data, (1 Stop-Bit, No Parity)
U1TCTL |= SSEL1; // Set ACLK as UCLK
U1BR0 = 0x03; // Set Baudrate 9600 (at 32.768 KHz)
U1BR1 = 0x00;
U1MCTL = 0x4A;
U1CTL &= ~SWRST; // Activate UART
IE1 |= URXIE1 + UTXIE1; // Activate UART-Interrupts
IFG2 &= ~UTXIFG1; // Clear Interrupt Flags
}


Dann habe ich mir Breakpoints in die beiden Interrupts gesetzt:



#pragma vector=USART1TX_VECTOR
__interrupt void USART1_TX(void)
{
TXBUF1 = 0xFF;
}

#pragma vector=USART1RX_VECTOR
__interrupt void USART1_RX(void)
{
unsigned short test = RXBUF1;
}


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 dieser PDF (slau213a.pdf) findet ihr am Ende einen
Schaltplan des Boards: http://focus.ti.com/lit/ug/slau213a/slau213a.pdf

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,
Eroli


EDIT: Vielleicht noch ein kleiner Hinweis:
Der RealTimer wird zum Beispiel so initialisiert und läuft dabei
sekündlich:


void initBasicTimer(void) // Initialize basic timer
{
// Basic timer setup
// Set ticker to 32768/(256*128) = 1 (One Interrupt per second)
// Enable BT interrupt
BTCTL = BT_fCLK2_DIV128 | BT_fCLK2_ACLK_DIV256;
IE2 |= BTIE;
}


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

EDIT: Für die Aufmerksamen: Verzeiht mir, wenn ich die Frage in einem anderem Forum ebenfalls gestellt habe, aber es ist zeitlich leider etwas knapp bei mir...

Eroli
27.06.2011, 13:54
Wenn ich den Controller zyklisch (sekündlich) etwas senden lasse, dann kommt er leider nie mehr aus der while-Schleife raus:



void SendUSART1c(char c) // ein einzelnes zeichen über die serielle schnittstelle (USART1) senden
{
while (!(IFG2 & UTXIFG1)); // warten, bis USART1 TX-buffer sendebereit
TXBUF1 = c;
}



Am PC kommen ein bis zwei nicht identifizierbare Zeichen an, aber nach ein bis zwei zeichen ist ja auch schluss (eigentlich ist sofort schluss, er geht einmal in die while rein und kommt nie wieder raus)...

Bin total verwirrt :-/


EDIT: ich will mal etwas genauer sein. Er schafft es kein Zeichen zu senden, denn die While-Schleife ist eine Endlosschleife. Außerdem kommen bei der Initialisierung des UART am PC 2 Zeichen an: Ein rechteck und ein y mit Strich drüber...

EDIT:
Und wie sieht es mit dem FlowControl aus? Was soll ich da in der Software zum Mitlesen auf dem PC einstellen? HardwareFlowControl oder SoftwareFlowControl oder beides?

Eroli
27.06.2011, 14:32
Ich habe euch zum reproduzieren mal eine komplette Main zum testen drangehangen. Vielleicht liegt der Fehler ja ganz wo anders...

19186

Eroli
27.06.2011, 14:43
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?

martin.r
03.07.2011, 16:59
Schau dir nochmal die Codebeispiele an:
http://www.ti.com/lit/zip/slac118

msp430xG46x_uscia0_uart_115k.c
msp430xG46x_uscia0_uart_115k_lpm.c
msp430xG46x_uscia0_uart_9600.c

Damit sollte es laufen. Viel Erfolg.