MSP430 Probleme mit UART und Hyperterminal

Gast #611590
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
  }
}
Angehängte Dateien:
Gast #611596
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?
Gast #611660
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.
Persönliche Seite #611764
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.
Angehängte Dateien:
Gast #612323
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
Gast #613031
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
Persönliche Seite #613148
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.
Gast #613205
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
Gast #613221
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren