Forum: Mikrocontroller und Digitale Elektronik MSP430 F2618 UART Echo


von Susi G. (susay)


Lesenswert?

Hallo µC Forum,
ich versuche schon den ganzen Tag über die serielle Schnittstelle mit TX 
UART0 PIN 3.4 etwas an den Rechner auszugeben.
Das Senden über RX funktioniert ... es ist also erstmal ausgeschlossen 
das der falsche COM Anschluss oder ähnliches gewählt ist.
Die Baudrate ist am Terminal und im Code auf 9600 gestellt. Den µC habe 
ich auch schon einmal ausgetauscht um auszuschließen das, dass PIN 
kaputt ist. Ich arbeite mit IAR Workbench.
Am TX liegen 3,2V von seitens des µC an. Ich habe folgende zwei 
Funktionen geschrieben.
1
void InitUart ()
2
{
3
  P3SEL |= P4 + P5;         //set PIN 3.4 & 3.5 as UART
4
  P3DIR |= P4;              //output direction, P3.4 output
5
  
6
  __enable_interrupt();     //enable general interrupt
7
  
8
  //muss USCI extra gestartet werden? ME1 gibt es nicht?
9
  
10
  //Control Register 0 - UCA0CTL0
11
  UCA0CTL0 &= ~UC7BIT;      //UC7BIT  - 0 8-bit character data bit
12
                            //UCMODEx - 00 UART mode
13
                            //UCSPB   - 00 one stop bit
14
                            //UCSYNC  - 0 UART mode
15
 
16
  //Control Register 1 - UCA0CTL1                         
17
  UCA0CTL1 = UCSSEL_0;      //UCA0CTL1 - 00 Clock Source UCLK = ACLK
18
    
19
  //Baudrate
20
  UCA0BR0 = 0x03;           //32k/9600 - 3,413
21
  UCA0BR1 = 0x00;
22
23
  //Modulation
24
  UCA0MCTL = 0x4A;          //0100 1010 - 3433 4343
25
  
26
  UCA0CTL0 &= ~UCSWRST;     //Clear UCSWRST - UART freigeben
27
  
28
  IE2 |= UCA0RXIE;          //Interrupt Enable RX interrupt
29
  
30
  //initiales interrupt flag löschen??
31
}
32
33
void EchoUart() //run in main while(1)
34
{
35
  //wenn Buffer bereit dann ...
36
  //Variante 1
37
  UCA0TXBUF = 'A';          //send char
38
  //Variante 2
39
  //UCA0TXBUF = UCA0RXBUF;  //echo rx
40
  P1OUT ^= BIT0;            //toggle LED P1.0
41
}
In den Beispielen zur UART steht immer das man das Modul aktivieren 
muss, doch im F2618 Header gibt es kein ME1 und ein intiales Flag das 
gelöscht werden soll habe ich auch nicht gefunden. Der in den Beispielen 
aufgeführte Befehl zum programmieren eines UART Interrupts funktioniert 
mit dem F2618 leider auch nicht:
1
#pragma vector=USART0RX_VECTOR
2
__interrupt void usart0_rx (void)
Ob der USART Buffer bereit ist lässt sich auch nicht abfragen (while 
(!(IFG2 & UTXIFG1));) da ich UTXIFG1 nicht kenne.

Der TI UG schreibt zur Intitialisierung folgendes:
Initializing or Re-Configuring the USCI Module
The recommended USCI initialization/re-configuration process is:
1. Set UCSWRST (BIS.B #UCSWRST,&UCAxCTL1)
2. Initialize all USCI registers with UCSWRST = 1 (including UCAxCTL1)
3. Configure ports.
4. Clear UCSWRST via software (BIC.B #UCSWRST,&UCAxCTL1)
5. Enable interrupts (optional) via UCAxRXIE and/or UCAxTXIE

Das habe ich doch somit alles gemacht oder? Ich würde mich freuen wenn 
mir jemand helfen kann.

von Jörg S. (joerg-s)


Lesenswert?

Susi G. schrieb:
> In den Beispielen zur UART steht immer das man das Modul aktivieren
> muss, doch im F2618 Header gibt es kein ME1...
Vielleicht solltest du Beispiele nehmen die für deinen µC passend sind.

Z.B. MSP430x261x_uscia0_uart_03.c von
http://www.ti.com/lit/zip/slac151
1
#include  "msp430x26x.h"
2
3
void main(void)
4
{
5
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
6
  P3OUT &= ~(BIT4+BIT5);
7
  P3SEL = 0x30;                             // P3.4,5 = USCI_A0 TXD/RXD
8
  UCA0CTL1 |= UCSSEL_1;                     // CLK = ACLK
9
  UCA0BR0 = 0x03;                           // 32kHz/9600 = 3.41
10
  UCA0BR1 = 0x00;                           //
11
  UCA0MCTL = UCBRS1 + UCBRS0;               // Modulation UCBRSx = 3
12
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
13
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
14
15
  __bis_SR_register(LPM3_bits + GIE);       // Enter LPM3, interrupts enabled
16
}
17
18
// Echo back RXed character, confirm TX buffer is ready first
19
#pragma vector=USCIAB0RX_VECTOR
20
__interrupt void USCI0RX_ISR(void)
21
{
22
  while (!(IFG2&UCA0TXIFG));                 // USCI_A0 TX buffer ready?
23
  UCA0TXBUF = UCA0RXBUF;                     // TX -> RXed character
24
}

von Susi G. (susay)


Lesenswert?

Vielen Dank mit dem Beispiel funktioniert es. Leider habe ich kein 
Beispiel für mein Derivat gefunden und bin nun erstaunt das es das doch 
gibt.

Gibt es irgendeinen Trick sich durch den TI Ressourcen Junggel zu 
hangeln? Die Suchfunktion hat mir in dem Fall nicht weiter geholfen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Susi G. schrieb:
> Gibt es irgendeinen Trick sich durch den TI Ressourcen Junggel zu
> hangeln?

http://www.ti.com/lsds/ti/microcontroller/16-bit_msp430/msp430_software_landing.page

Hier findet man Codebeispiele zu allen MSP430-Familien, 2618 ist 
offensichtlich von "261x" abgedeckt, also "MSP430F241x, MSP430F261x" 
(http://www.ti.com/lit/zip/slac151) anklicken.

Fertig.

von Susi G. (susay)


Lesenswert?

Ich danke für die geduldige und schnelle Beantwortung meiner Anfänger 
Frage.

[CLOSED]

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.