Forum: Mikrocontroller und Digitale Elektronik MSP430 Problem mit uart


von Franky (Gast)


Angehängte Dateien:

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

von Franky (Gast)


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

von Franky (Gast)


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.

von szimmi (Gast)


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.

von szimmi (Gast)


Angehängte Dateien:

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.

von Christian R. (supachris)


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.

von Franky (Gast)


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

von Christian R. (supachris)


Lesenswert?

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

von szimmi (Gast)


Lesenswert?

Jupp, das denke ich wohl auch...

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.