Forum: Mikrocontroller und Digitale Elektronik MSP430 F435/449, UART0, Senden per Interrupt des Sendemoduls


von Guenther G. (guenna)


Lesenswert?

Moin!
Ich möchte mit dem oben genannten Prozessor im Speicher abgelegte Daten
mit dem Sendemodul des UART0 senden.
Das Empfangsmodul soll damit nichts zu tun haben (Stichwort: echo
RXBuffer...wer was damit anfangen kann), das Senden soll also nicht
durch den Interrupt des Empfangsmoduls ausgelöst werden (so wie ich es
in allen Beispielprogrammen gefunden habe...dort werden immer erst
Zeichen eingelesen, der Interrupt des Empfangsmoduls löst bei jedem
gültigen Zeichen im Empfangspuffer einen Interrupt aus, der dazu
benutzt wird, das gerade eingelesene Zeichen gleich wieder zu senden).
Ein Knackpunkt ist auch die richtige Initialisierung der USART des
MSP430.
Also falls es jemanden gibt, der auch schon mal den USART des MSP430
zum reinen Senden benutzt hat oder einfach nur mehr Ahnung vom MSP430
hat als ich...ich hoffe auf gute Vorschläge.
Danke
Guenna

von Yagan Z. Dongobar (Gast)


Lesenswert?

Guenna,

es ist kein Problem, mit der MSP430-UART0 nur zu senden. Es gibt sogar
einen separaten Interruptvektor für den Sender.
Vielleicht helfen Dir die folgenden einfachen Funktionen (Demoprogramm,
mit IAR-Entwicklungssystem erzeugt):

#include  <msp430x12x2.h>

#define TXL     12

// Port1-Bits:

#define RTS     0x01

#define EnableInterrupts() _BIS_SR(GIE)

static short Txi;
static BYTE RxAddr, CheckSum;

static char TxBuffer[TXL] = { 0x37, 'A', 'F', 'F', 'E', 'N',
'Z', 'I', 'R', 'K', 'U', 0x88 };

// Initialisierung, Baudrate aus 32KHz-Takt gewinnen.

void InitUart ( void )          // Baudrate = 1200 Bd, Fehler ca. 1.1%
    {
    P1OUT &= ~RTS;              // RTS deaktiviert.
    P3SEL |= 0x30;              // P3.4,5 = USART0 TXD/RXD
    UCTL0 |= SWRST;             // Reset UART
    UTCTL0 |= SSEL0;            // UCLK = ACLK
    UBR00 = 27;                 // 32k/1200 = 27.3
    UBR10 = 0;
    UMCTL0 = 0;                 // Modulation
    UCTL0 |= CHAR+MM;           // 8-bit character + Addressbit.
    ME2 |= UTXE0+URXE0;         // Enable USART0 TXD/RXD
    UCTL0 &= ~SWRST;            // Initalize USART state machine
    }

// Wenn kein Empfang erwünscht, URXE0 weglassen.


#pragma vector=UART0TX_VECTOR
__interrupt void IntTxUart ( void )
    {
    if ( Txi < TXL ) // nächstes Zeichen senden.
        {
        TXBUF0 = TxBuffer[Txi++];
        }
    else // fertig, Sender abschalten.
        {
        IE2 &= ~UTXIE0;         // Disable USART0 TX interrupt
        }
    }

// Sendung starten.
void SendUart ( void )
    {
    P1OUT |= RTS;               // RTS aktivieren.
    Delay(2);
    TXBUF0 = TxBuffer[0];       // Erstes Zeichen senden.
    Txi = 1;
    IE2 |= UTXIE0;              // Enable USART0 TX interrupt
    }

// Warte bis TxBuffer fertig gesendet.
void WaitTxReady ( void )
    {
    while ( Txi < TXL );
    while ( !(UTCTL0 & TXEPT) );
    Delay(2);
    P1OUT &= ~RTS;
    }


void main(void)
    {

    WDTCTL = WDTPW+WDTHOLD;     // Stop watchdog timer
    P1DIR |= RTS|BLINKY;        // Set P1 to output direction
    InitUart();
    EnableInterrupts();           // Enable interrupts

    while (TRUE)
        {
        SendUart();
        WaitTxReady();
        }
    }

Ciao, Yagan

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.