www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik MSP430 USART String senden

Autor: Rotschi Hoschi (hoschis)
Datum: 02.04.2008 21:23

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: 02.04.2008 23:02

Wozu brauchst du denn eigentlich TX Interrupts?
Autor: Christian R. (supachris)
Datum: 03.04.2008 07:56

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: 03.04.2008 07:58

Ü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: 13.05.2008 17:02

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net