www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430: UART empfängt nicht und erzeugt Fehler im Debugger


Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gemeinde,

ich habe ein Problem mit einem MSP430F123. Ich will den UART per Polling 
nutzen. Senden geht, auch Strings. Aber ich kann nix empfangen. Wenn ich 
einen Breakpoint auf die While-Schleife in getc() setzte, bis dorthin im 
Debugger laufe, ein Zeichen per HTERM an den MSP sende (mit 300 Baud!) 
und dann im Debugger auf F11 (Single Step) drücke kommt immer wieder 
"Failed to excute step". Der Cursor im Dissassebler springt zum Label 
?cstart_begin. Was kann das sein? Die Interrupts sind definitiv nicht 
aktiv. Der MSP läuft mit einem 3,6864MHz Quarz an Xin/Xout. Das ist auch 
OK, hab ich gemessen, und ausserdem kann ich senden und per HTERM 
empfangen. Nur nicht umgekehrt. Ärgerlich, an so ner Trivialität 
festzuhängen :-(
// get a char from UART

uint8_t getc(void) {
  uint8_t tmp;
  while (!(IFG2 & URXIFG0));                // USART0 RX data available?
  tmp = RXBUF0;
  return tmp;
}

// put a char to UART

void putc(uint8_t data) {
  while (!(IFG2 & UTXIFG0));                // USART0 TX buffer ready?
  TXBUF0 = data;
}

// put a string to UART

void puts(char *data) {
  char tmp;
  while (tmp=*data++) putc(tmp);                // write char to UART when not NULL
}

int main( void )
{
  uint8_t i;
  char string[]="Test ";
  
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

  // Switch XO to high speed Xtal, use als MCLK, SMCLK and ACLK
  BCSCTL1 |= XTS;                           // ACLK = LFXT1 = HF XTAL
  do
  {
      IFG1 &= ~OFIFG;                       // Clear OSCFault flag
      for (i = 0xFF; i > 0; i--);           // Time for flag to set
  }
  while ((IFG1 & OFIFG));                   // OSCFault flag still set?
  BCSCTL2 |= SELM_3;                        // MCLK = LFXT1 (safe)

  
  // Configure IO
  P1DIR=0xFF;                               // unused
  P2DIR=0xFF;                               // P2.3 DATA_OUT, out
  P3DIR=0x9F;                               // P3.3 CLOCK_OUT, out
                                            // P3.4 TXD, UART, out
                                            // P3.5 RXD, UART, in
                                            // P3.6 DATA_IN, in
                                            // P3.7 DATA_DIR, out
  P2OUT = 0x08;                             // set clock_out high

  // Configure UART @ 115k2, no Interrupts; TODO
  UCTL0 |= SWRST;                          // Reset USART state machine  
  P3OUT |= 0x10;  
  P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD  
  ME2 |= UTXE0 + URXE0;                     // Enabled USART0 TXD/RXD
  UCTL0 |= CHAR;                            // 8-bit character
  UTCTL0 |= SSEL0;                          // UCLK = ACLK
//  UBR00 = 0x20;                             // 115200 baud @ 3.6864 MHz
  UBR00 = 0x00;                             // 300 baud @ 3.6864 MHz
  UBR10 = 0x30;                             // 
  UMCTL0 = 0x00;                            // Modulation
  UCTL0 &= ~SWRST;                          // Initalize USART state machine
  
 // inc_reset();

  puts(string);
  while(1) {                                // endless main loop
//    putc('A');
//    puts(string);
//    _delay_us(10000);
    i=getc();
    putc(i);            // test
//    if (i=='P') cmd_p_large();
//    if (i=='p') cmd_p_small();
  }

}


MfG
Falk

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kein Wunder, die beiden Flags UTXIFG0 und URXIFG0 liegen ja auch im IFG1 
Register und nicht im IFG2. Dort liegen die für die 2. USART, falls 
vorhanden.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Christian R. (supachris)

>Kein Wunder, die beiden Flags UTXIFG0 und URXIFG0 liegen ja auch im IFG1
>Register und nicht im IFG2. Dort liegen die für die 2. USART, falls
>vorhanden.

Nein, beim MSP430F12xx liegen die in IFG2. Siehe Datenblatt. Und Senden 
geht ja schliesslich auch ordentlich, ohne verschluckte Zeichen.

MfG
Falk

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich einen Breakpoint auf die While-Schleife in getc() setzte...
Dann setz den Braekpoint doch mal auf "tmp = RXBUF0;" Oder schau einfach 
erst mal nach (Mit dem Debugger) ob das gesendete Zeichen überhaupt im 
Empfangsregister landet.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, mein Fehler. Dachte, der F123 gehört zur selben Gattung wie die 
14x und 16x usw. Wieder was gelernt.

Ansonsten kann ich sonst keinen Fehler sehen. Ist die Hardware definitiv 
in Ordnung? Mal das Echo-Beispiel mit dem Interrupt aus den Demos 
probiert? Evtl. steht im Errata Sheet auch was drinne?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Jörg S. (joerg-s)

>Dann setz den Braekpoint doch mal auf "tmp = RXBUF0;" Oder schau einfach
>erst mal nach (Mit dem Debugger) ob das gesendete Zeichen überhaupt im
>Empfangsregister landet.

Das versuche ich ja. Aber der Prozessor stürzt scheinbar nach verlassen 
der While-Schleife ab!

@ Christian R. (supachris)

>Ansonsten kann ich sonst keinen Fehler sehen. Ist die Hardware definitiv
>in Ordnung?

Denke ich schon. Senden geht, ist sehe auch die RX Daten vom PC direkt 
am Pin sauber anliegen.

> Mal das Echo-Beispiel mit dem Interrupt aus den Demos
>probiert?

Nein. Aber mit Polling muss es doch erst recht klappen, das ist doch nun 
weiss Gott trivial.

> Evtl. steht im Errata Sheet auch was drinne?

Der gleiche Prozessor ist schon auf einer anderen Platine erfolgreich 
mit UART im Einsatz. Aber ich schau nochmal nach.

MfG
Falk

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das versuche ich ja. Aber der Prozessor stürzt scheinbar nach verlassen
> der While-Schleife ab!
Dan erst mal weg mit der while Schleife und dafür ne andere Testroutine 
Z.B.:
uint8_t getc(void) 
{
  unsigned char tmp[20];
  unsigned char i;

  i = 0;

  temp[i] = RXBUF0;

  while (1)
  {
    if (RXBUF0 != tmp[i]) tmp[++i] = RXBUF0;
    if (i == 10) break;  // Evt. hier Breakpoint
  }

  _NOP();   // Oder hier Breakpoint
}

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AHHHHHH!!!!!

Asche auf mein unwürdiges Haupt!

Ich hab in meinem Debugaufbau ein Kabel falsch angeklemmt. Statt an RX 
vom uC an VCC vom Programmieradapter, weil beide nebeneindander liegen 
und über Widerstände getrennt sind! Klar, das Startbit zieht mir dann 
VCC auf Masse (AUA!) und macht einen Reset vom Debugger.

MfG
Falk

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.