Forum: Mikrocontroller und Digitale Elektronik MSP430 Probleme mit UART und Hyperterminal


von reflection (Gast)


Angehängte Dateien:

Lesenswert?

Salu zusammen

Ich habe hier eine kleine Seriel/USB Platine von FTDI. (MM232R)

Folgendes:

1. Wenn ich den USB Stecker einstecke am PC findet der Programmer das 
Device nicht mehr (TI USB-FET)

2. Wenn ich Hyperterminal starte erscheint folgende Meldung (siehe 
Anhang) Eingestellt habe ich 115200  8N1  Flusssteuerung: Keine

Hier nun der Code:

Ich denke er führt den Code aus, da das Display auf einmal stehen bleibt 
(nehme an er läuft in den Interrupt) aber ich sehe in Hyperterminal 
nichts. Wann muss ich eigentlich Hyperterminal öffnen? Vor dem starten 
des uP oder danach? Liegt es an HT (Fehlermeldung) das es nicht funzt? 
Wäre über Hilfe froh wie ich was auf den Bildschirm bekomme :o)

Greets reflection

#include  <msp430x14x.h>
#include  <signal.h>

unsigned char answer1[] = "Buchstabe ";
unsigned char answer2[] = " gedrueckt\r\n";

int i, j;

void uart(void)
{
  WDTCTL = WDTPW + WDTHOLD;             // Watchdog aus
  P3SEL |= 0xC0;                        // P3.6 und 3.7 als USART1 
TXD/RXD

  ME2 |= UTXE1 + URXE1;                 // TX- und RX-Modul einschalten
  UCTL1 |= CHAR;                        // 8 data bits, 1 stop bit, no 
parity (8N1)
  UTCTL1 |= SSEL0;                      // UCLK als ACLK festlegen
  //UTCTL1 |= SSEL1;                      // UCLK als SMCLK festlegen
  UBR01 = 0x45;                         // 115200 baud aus 8MHz erzeugen
  UBR11 = 0x00;                         // Siehe Application Note / 
Tab.2 S.10
  UMCTL1 = 0x2C;                        // Modulation der Baudrate durch 
Korrektorfaktor
  UCTL1 &= ~SWRST;                      // USART freigeben
  IE2 |= URXIE1 + UTXIE1;               // TX- und RX-interrupts 
anschalten
  IFG1 &= ~UTXIFG1;                     // initales interrupt-flag 
loeschen

  _BIS_SR(LPM3_bits + GIE);             // ab in den LPM3 mit interrupts 
...
  //_BIS_SR(GIE);
}

interrupt (UART1TX_VECTOR) usart1_tx(void)
{
  if (i < sizeof answer1-1)             // String zu Ende?
    TXBUF1 = answer1[i++];              // String ausgeben
  else if (i == sizeof answer1-1)       // wenn erster string zu ende 
...
    {
      TXBUF1 = RXBUF1;                  // ... dann den getippten 
buchstaben ausgeben
      i++;
    }
  else if (j < sizeof answer2-1)        // wenn auch der ausgegeben ist 
...
    TXBUF1 = answer2[j++];              // ... dann den zweiten string 
ausgeben
}

interrupt (UART1RX_VECTOR) usart1_rx(void)
{
  {
  i = 0;
  j = 0;
  TXBUF1 = answer1[i++];                // ersten buchstaben von answer1 
ausgeben
  }
}

von reflection (Gast)


Lesenswert?

Ach ja, an Xin Xout hängt ein 8MHz Quarz welchen ich hier für die 
Baudrate benutzen möchte. Ist vielleicht da der Fehler? Den Watchdog 
schalte ich auch in meiner Main Routine schonmal aus. Kann es da zu 
Probs führen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Fehlermeldung lässt darauf schließen, daß Du nicht direkt "COM1" 
(oder welche Nummer auch immer) verwendest, sondern Dich mit irgendeinem 
Modem verbindest.

Hyperterminal (oder welches Terminalprogramm auch immer) sollte vor dem 
Starten des µC, aber nach dem Anschließen des USB-RS232-Wandlers an den 
PC gestartet werden.

von reflection (Gast)


Lesenswert?

Prob ist, das mein uP nicht anläuft wenn ich das USB Kabel einstecke und 
danach den Strom des uP's einschalte. Muss nochmal die Hardware 
kontrollieren.

WIe würde ich denn das umgehen das er mit einem Modem verbindet? Bei 
gewissen Ports steht "In use" bei anderen nichts. Wenn ich nun einen der 
nicht "In use" ist auswähle, kann er auch keine Verbindung öffnen.

von Rufus Τ. F. (rufus) Benutzerseite


Angehängte Dateien:

Lesenswert?

Daß mit der Schnittstelle und nicht mit einem Modem kommuniziert wird, 
stellt man unter Hyperterminal bei den "Eigenschaften der Verbindung" 
ein.

Das sieht in etwa so aus wie im Anhang.

Natürlich muss die Schnittstellennummer mit der des 
USB-zu-Seriell-Wandlers übereinstimmen ... sonst kommunizierst Du mit 
irgendwas vollkommen anderem.

von Christian R. (supachris)


Lesenswert?

Vielleicht hast du auf dem FTDI den gleichen COM-Port wie am TI-USB 
Debugger, dann klappt das natürlich nicht.
Oder deine Hardware-Verdrahrung stimmt nicht, so dass du den auf MSP auf 
Reset ziehst oder sowas...

von reflection (Gast)


Lesenswert?

Salu zusammen

Es hat funktioniert! Ich bekomme irgendwelche Hieroglyphen raus. Denke 
mal das ich noch ein Baudraten Prob habe. Danke nochmals für die Tipps. 
Prob mit HT lag am Computer, habe einen anderen genommen und jetzt 
funzts!

Greets reflection

von szimmi (Gast)


Lesenswert?

Hmmm,
moechte ich zu Hause auch mal machen können. Wenn was am Rechner nicht 
klappt, einfach einen anderen nehmen :-)

von reflection (Gast)


Lesenswert?

:o)

Also es funktioniert, musste noch ein paar Sachen am Clock und an der 
Baudrate anpassen. Das obenstehende Programm läuft so wie es da steht.

Nun habe ich einen String, oder besser gesagt ein Array of char das ich 
immer wenn ich while(1) durchlaufe an den PC senden will. Was muss ich 
da an den Interrupts ändern, blick da nicht durch. Vom PC soll gar 
nichts kommen, er soll einfach immer wieder den String senden.

Habe da so was versucht, ohne Interrupt, aber des klappt net :o) Weiss 
jemand rat? Was mache ich falsch?

void send_uart(char string[])     // String an PC senden
{
    int i;
    for (i = 0; string[i] != '\0'; ++i )
    {
    TXBUF1 = string[i];
    }
    i = 0
    return;
}

Manchmal schaffe ich es das ein paar Zeichen rauskommen, aber nicht 
alles und wild durcheinander. An der Baudrate kann es nicht liegen, wie 
gesagt, das oben hat gefunzt

Danke schonmal für die Hilfe

Gruss

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du beschreibst TXBUF, ohne zu warten, ob die Schnittstelle sendebereit 
ist.

Das Senden eines Zeichens dauert aber deutlich länger als ein 
Schleifendurchlauf. Die UART-Hardware signalisiert, wenn ihr Sendepuffer 
leer ist. Das geschieht mit dem Bit UTXIFG1 im Interruptstatusregister 
IFG2 (für UART1) und mit UTXIFG0 im Interruptstatusregister IFG1 (für 
UART0).

Probiere mal das hier:
1
void send_uart(char* p)     
2
// String über UART1 versenden
3
{
4
  while (*p)
5
  {
6
    while (!(IFG2 & UTXIFG1));                
7
    TXBUF1 = *p++;
8
  }
9
}

Davon abgesehen solltest Du Dir mal ein Buch über das Programmieren in C 
zu Gemüte führen, am Ende einer void-Funktion ist weder ein return 
erforderlich noch ein "auf-null-setzen" benutzter Variablen.

von reflection (Gast)


Lesenswert?

Danke Rufus, das werde ich probieren. Buch habe ich übrigens gestern 
bestellt :o) Musste auch feststellen das ich da noch eine rechte Lücke 
habe. C ist halt doch nicht überall gleich wie Java und das ist halt das 
einzige was ich mal einigermassen gelernt habe.

Gruss

von reflection (Gast)


Lesenswert?

@Rufus

Es funktioniert so wie Du es oben geschrieben hast. Ist mir jetzt auch 
klar warum. Langsam aber sicher wird mir immer mehr klar mit den uP's. 
Ist halt rel. komplex wenn man noch nie was darüber gehört hat, aber 
geht nicht gibts nicht, da muss ich jetzt halt durch. Das nächste ist 
ein Minijoystick (Handy) und eine SD Karten Ansteuerung mit FAT. Die 
Hardware habe ich bereits implementiert, nur halt die Software noch 
nicht.

Gruss

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.