MSP430 USART1 benutzen

OP #816713
Servus,

probiere einen MSP430F1611 mit dem USART1 Modul mit dem PC über die 
RS232 zu verbinden. Habe auch die Threads hier darüber gelesen, doch 
irgendwo stehe ich an ?!?
1
#include <msp430x16x.h>
2

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

6
char i, j;
7

8
void main(void)
9
{
10
  WDTCTL = WDTPW + WDTHOLD;             // watchdog aus
11
  
12
  P3OUT  =  0x00;                 //! - Clear Port
13
  P3DIR |=  0x7b;                 //! - P3.2,7 = input; rest = output
14
  P3SEL |=  0xce;                 //! - P3.0,4,5 = I/O function; rest = SPI & UART
15
  
16
  P6OUT  =  0x00;                 //! - Clear Port
17
  P6DIR |=  0xe0;                 //! - P6.5,6,7 = output; rest = input
18
  P6SEL |=  0x1f;                 //! - P6.5,6,7 = I/O function; rest = ADC 
19

20

21
  ME2 |= UTXE1 + URXE1;                 // TX- und RX-modul erst mal anschalten
22
  UCTL1 |= CHAR;                        // 8 data bits, 1 stop bit, no parity (8N1)
23
  UTCTL1|= SSEL0;                      // Clock source = ACLK
24
  UBR01  = 0x0d;                       // 32kHz/2400 = 13.6
25
  UBR11  = 0x00;                       //
26
  UMCTL1 = 0x6b;                       // Modulation
27
  UCTL1 &= ~SWRST;                      // USART freigeben
28
  IE2 |= URXIE1 + UTXIE1;               // TX- und RX-interrupts anschalten
29
  
30
  
31
  IFG2 &= ~UTXIFG1;                     // initales interrupt-flag loeschen
32
    __bis_SR_register(GIE);         //! - general interrupt enable
33
  
34
  while(1) {
35
  while (!(IFG1 & UTXIFG0));   // USART0 TX buffer ready?
36
   TXBUF0 = 'X';
37

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

42
}
43

44
#pragma vector=UART1TX_VECTOR
45
__interrupt void usart1_tx (void)
46
{
47
  if (i < sizeof answer1-1)             // string schon zu ende?
48
    TXBUF1 = answer1[i++];              // string ausgeben
49
  else if (i == sizeof answer1-1)       // wenn erster string zu ende ...
50
    {
51
      TXBUF1 = RXBUF1;                  // ... dann den getippten buchstaben ausgeben
52
      i++;
53
    }
54
  else if (j < sizeof answer2-1)        // wenn auch der ausgegeben ist ...
55
    TXBUF1 = answer2[j++];              // ... dann den zweiten string ausgeben
56
}
57

58
#pragma vector=UART1RX_VECTOR
59
__interrupt void usart1_rx (void)
60
{
61
  i = 0;
62
  j = 0;
63
  TXBUF1 = answer1[i++];                // ersten buchstaben von answer1 ausgeben
64
}

Wenn ich debugge habe ich nichts erreicht, darum habe ich die Zeile mit 
while(1) eingebaut um zu sehen ob der Buffer jemals ready ist, scheint 
aber nicht der Fall zu sein ?!?
Persönliche Seite #816721
Der gepostete Code ist mit Sicherheit nicht der von Dir verwendete Code, 
der nämlich lässt sich noch nicht einmal übersetzen.

Es fehlt eine schließende geschweifte Klammer, die die 
while(1)-Statement in main() abschließt.

Außerdem verwendest Du diversen Pofel, der im Code weder definiert noch 
deklariert ist.
Gast #816748
Und was willst Du mit:
1
while (!(IFG1 & UTXIFG0));   // USART0 TX buffer ready?
2
TXBUF0 = 'X';

Überall sonst initialisierst und verwendest Du USART1 ?!
Gast #816755
> while (!(IFG1 & UTXIFG0));   // USART0 TX buffer ready?
Wieso UART0 ready wenn du UART1 verwenden willst? :)

> TXBUF0 = 'X';
Hier genauso, du willst auf UART1 senden, schiebst die Daten aber auf 
UART0.
Gast #816844
Das hatten wir doch erst vor ein paar Tagen...

Wenn Du Sample-Code von TI verwendest, dann lies auch mal die 
Beschreibung dazu durch!
Mit
1
  UTCTL1|= SSEL0;                      // Clock source = ACLK
2
  UBR01  = 0x0d;                       // 32kHz/2400 = 13.6
3
  UBR11  = 0x00;                       //
4
  UMCTL1 = 0x6b;                       // Modulation
brauchst Du zwingerdermaßen einen 32kHz Uhrenquarz an LFXT1!
Ich könnte wetten, Du verwendest den internen DCO, dann ist die USART 
natürlich tot!
Gast #816888
>ich debugge mit IAR und er bleibt bei
>while (!(IFG2 & UTXIFG1));
>stehen....
Ich glaube, er bleibt nur "scheinbar" stehen, Du hast schließlich den 
TX-Interrupt freigegeben, d.h. sobald UTXIFG1==1 wird, wird die ISR 
aufgerufen.

Laß die IRQ's zum testen erst mal deaktiviert!
OP #816908
Nach dem Motto "Ein reboot tut immer gut" läuft das Programm nun ohne 
meckern, den Part:
1
  while(1) {
2
  while (!(IFG1 & UTXIFG0));   // USART0 TX buffer ready?
3
   TXBUF0 = 'X';
4

5
}
habe ich weggelassen und was ich im Hyperterminal sende wird 
zurückgegeben...

was der Fehler bisher war weis ich leider nicht :-/


Hat jemand übrigens ein Terminal-programm zu empfehlen?
Gast #879291
Hallo, ich würde auch gerne die USART1 hernehmen.
Allerdings bin ich absoluter Neuling in sachen C und MSP430.
Durch des hin und hergestopsel weis ich nu nich was richtig ist.
Kann veileicht einer nochmal den kompletten funktionierenden c-code 
Posten?
Wär super. :-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.