mikrocontroller.net

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


Autor: Guenther Guenther (guenna)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Yagan Z. Dongobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.