mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 USART String senden


Autor: Rotschi Hoschi (hoschis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus, habe folgendes Problem. Mein USART läuft RX/TX Interrupts, beim 
Senden von mehreren Symbolen, klappt leider immer nur eines. Ich kann ja 
nicht die Abfrage
while(!(IFG2 & UTXIFG1));
 machen wann ich was ins TX Sende Register schreiben kann, denn das 
funktioniert bei INterrupts ja nicht.

Daher sende ich über meine funktion SendUSART:
void SendUSART1(char* str)             // einen string über die serielle schnittstelle (USART1) senden
{
  for(int zaehl = 0; zaehl < sizeof str; zaehl++)
  {
    send_tx[zaehl] = str[zaehl];
  }
  TXBUF1 = send_tx[0];
}
Und zähle dann in meiner interrupt senderoutine das array durch, und 
lasse den ersten wert weg. leider funktioniert das nicht ?!?
#pragma vector=UART1TX_VECTOR           //Transmitting - Interrupt-Routine
__interrupt void usart1_tx (void)
{
    for(int zaehl = 1; zaehl < sizeof send_tx; zaehl++)
  {
    TXBUF1 = send_tx[zaehl];
  }
}

Autor: Johnny Maxwell (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu brauchst du denn eigentlich TX Interrupts?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ja nicht klappen. Du sendest ja alle Zeichen gleich hintereinander 
weg, wenn du per TX-Int benachrichtigt wurdest, dass du ein Zeichen 
senden darfst. Wenn schon mit TX-Int, dann musst du dir eine globale 
volatile Variable anlegen, die die Position im Sende-Array anzeigt, und 
dann per TX-ISR immer nur ein zeichen senden und diese Variable 
hochzählen.

Aber warum TX-ISR? Hast du in der Zwischenzeit so viel anderes mit der 
CPU zu tun?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Übrigens noch ein 2. Fauxpas: Du sendest, abgesehn von dem Fehler, den 
ich beschrieben habe, immer das gesamte Array, egal wieviele Zeichen die 
USART_Send reingeschrieben hat.

Autor: Tom D. (toolmmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich versteh nich so ganz warum deine Funktion mit nem Pointer arbeitet, 
wenn du ihn nie verwendest. So wie deine Funktion ausschaut kannste 
einfach mit dem Pointer arbeiten. z.B so:
void SendUSART1(char* str)             // einen string über die serielle schnittstelle (USART0) senden
{
  while (*str != 0)
  {
    while (!(IFG2 & UTXIFG1));         // warten, bis USART0 TX-buffer sendebereit
    TXBUF1 = *str++;                   //senden des aktuellen wertes, auf dem der Pointer zeigt und anschliessend addieren um 1 (naechster wert)
  } 
}

und als test, lässt du ueber dein ISR von der URXD immer was ausgeben. 
z.b.:
#pragma vector = UART1RX_VECTOR
__interrupt void usart1_rx(void)
{
   sendUSART1("Ich bin ein UART1RX_ISR");
}
so läuft das meiner meinung nach wunderbar :)

mfg

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.