www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Problem mit uart


Autor: Franky (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei ein Programm zur Kommunikation zwischen meinem MSP 
und dem PC über die serielle Schnittstelle zu schreiben. Es soll so 
aussehen, dass ich am PC Tasten drücke (Hyperterminal), diese 
Tastendrücke werden dann aufsummiert und auf einem LCD ausgegeben. 
andersherum möchte ich durch einen Tastendruck eine 1 anden PC senden. 
Das ist keine gescheite Anwendung, aber ich möchte auch erst einmal nur 
die Kommunikation an sich hinbekommen.

Ich sehe jetzt aber vor einem Problem. Das ganze funktioniert irgendwie 
nicht. Wenn ich das Programm starte und am PC Tasten drücke wird das 
auch an dem Display am MSP angezeigt. Drücke ich nun den Taster am MSP 
wird nix gesendet. Anschließend wird auch nix mehr vom PC empfangen.

Wie es scheint bleibt der dann in der Datei uart bei "while (!(IFG1 & 
UTXIFG0)); " hängen. Den kompletten Code habe ich ja im Anhang.

Ich komme da nicht weiter. Wäre klasse, wenn sich mal jemand den Code 
ansehen könnte.
Bin für jeden Tip offen.

Grüße
Euer Franky

Autor: Franky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich bin ein wenig weiter. problme macht irgendwie das senden. das 
empfangen ist kein problem, das läuft einwandfrai, solange nichts 
gesendet wird. also nach dem ersten tastendruck und somit dem ersten 
versuch etwas zu senden hängst sich das ganze irgendwie auf.

Ich habe hier jetzt mal meine interrupt-routine für den empfang:

#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
    if(StringReady == 0)
    {
      if(RXBUF0)
      {
        zaehl++;
        StringReady = 1;         // Wenn auf '1', darf der String 
ausgelesen
                                 // werden
        _BIC_SR_IRQ(LPM0_bits);  // Exit LPM0
      }
    }
}/* __interrupt void usart0_rx (void) */

Hier einmal meine Funktion zum senden:

void SendUSART0(unsigned char* str)  // Einen String über die serielle
{                                    // Schnittstelle (USART0) senden
  while (*str != 0)
  {
    while (!(IFG1 & UTXIFG0));       // Warten, bis USART0 TX-Buffer 
sendebereit
    TXBUF0 = *str++;
  }
  while (!(IFG1 & UTXIFG0));         // Warten, bis USART0 TX-Buffer 
sendebereit
  TXBUF0= 0x0D;                      // "ENTER" senden als Abschluss
}

und hier meine initialisierung des uart:

void InitUART(void)
{
  P3DIR = 0x1F;
  P3SEL = 0x30;                    // P3.4 und P3.5 als USART0 TXD/RXD

  ME1 |= UTXE0 + URXE0;            // TX- und RX-Modul erst mal 
anschalten
  UCTL0 |= CHAR;                   // 8 Data Bits, 1 Stop Bit, no parity 
(8N1)
  UTCTL0 |= SSEL0;                 // ACLK als UCLK festlegen
  UBR00 = 0x03;                    // 9600 Baud aus 32.768 kHz erzeugen
  UBR10 = 0x00;                    // Siehe Application Note Tabelle 2, 
Seite 10
  UMCTL0 = 0x4A;                   // Korrektur der Division
  UCTL0 &= ~SWRST;                 // USART freigeben
  IE1 |= URXIE0 + UTXIE0;          // TX- und RX-interrupts anschalten
  IFG1 &= ~UTXIFG0;                // Initales Interrupt-Flag löschen
   //_BIS_SR(GIE);
  _BIS_SR(LPM0_bits + GIE);        // Ab in den LPM0 mit Interrupts ...
}

wie gesagt, der empfang funtioniert einwandfrei, bis etwaas gesendet 
werden soll. dabei hängt sich das ganze auf.

Wäre klasse, wenn mir da jemand weiterhelfen könnte. das ist zum 
verzweifeln. würde mich nciht wundern, wenn das mal wieder nur an einer 
klitze kleinigkeit hängt.

gruß
euer franky

Autor: Franky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nachtrag:

mit while (!(IFG1 & UTXIFG0)); warte ich ja daraus, dass ich etwas 
senden kann, der das buffer sendebereit ist. da bleibt der immer hängen, 
egal ob vorher schon irgendwann einmal etwas empfangen oder gesendet 
wurde.

Autor: szimmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm,
hast Du überhaupt die TX-ISR definiert?:
#pragma vector=UART0TX_VECTOR
__interrupt void usart0_Tx (void)
...
Wenn Du die nicht hast, findet der MSP bei dem Interrupt keine gültige 
Adresse und landet im Nirvana.
Ich denke mal, Du brauchst den Interrupt nicht:
 (IE1 |= URXIE0 + UTXIE0;
  in
  IE1 |= URXIE0; ändern)
da Du das Flag pollst. Kannst das Flag UTXIFG0 trotzdem pollen, das wird 
unabhängig von der Interrupt-Freigabe gesetzt.

Autor: szimmi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:
Falls Du den Interrupt doch brauchst, ich habe mal ein TI-Bsp. 
angehängt, wo man das ganz gut sieht, wie man vorgehen muss.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn´s der fehlende TX-Interrupt-Handler wäre, müsste das Zeichen am PC 
ankommen. Sonst wüsst ich aber auch nix. Vermutest du den Absturz an der 
Stelle, oder bleibt der Debugger da hängen? Wenn du einen falschen 
Int-Vektor hast, müsstest du im Debugger dann sehen, dass er an eine 
seltsame Stelle im Flash springt und dort kein Disassembly zu finden 
ist.

Autor: Franky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich habe folgendes gemacht:

IE1 |= URXIE0 + UTXIE0;
  in
  IE1 |= URXIE0;

Weiter nix, dann lief es schon.

denke, dass der debugger an der stelle stehen blieb, da die bedingung 
halt immer erfüllt war.


vielen dank.

grüße
franky

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee, eher weil der Prozessor an den nicht vorhandenen Interrupt-Vektor 
gesprungen ist...

Autor: szimmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jupp, das denke ich wohl auch...

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.