www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 USART1 benutzen


Autor: Rotschi Hoschi (hoschis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ?!?
#include <msp430x16x.h>

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

char i, j;

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


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

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

}

#pragma vector=UART1TX_VECTOR
__interrupt void usart1_tx (void)
{
  if (i < sizeof answer1-1)             // string schon 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
}

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



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 ?!?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rotschi Hoschi (hoschis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, haben meinen deutlich längeren Code beim rumkopieren ändern 
wollen, was scheinbar eine dumme Idee war. Habe in nun im Programm 
geändert und oben nochmals gepostet....

Also bin für jeden Hinweis seeehr dankbar!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was willst Du mit:
while (!(IFG1 & UTXIFG0));   // USART0 TX buffer ready?
TXBUF0 = 'X';

Überall sonst initialisierst und verwendest Du USART1 ?!

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

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Rotschi Hoschi (hoschis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtig.... da verwende ich noch den falschen UART...
  while(1) {
  while (!(IFG2 & UTXIFG1));   // USART0 TX buffer ready?
   TXBUF1 = 'X';

} 

Aber leider bringt es keine Besserung....

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

Bewertung
0 lesenswert
nicht lesenswert
Er sendet nicht, oder sendet er aber du bekommst nichts?

Autor: Rotschi Hoschi (hoschis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich debugge mit IAR und er bleibt bei
while (!(IFG2 & UTXIFG1));  
 stehen....

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
  UTCTL1|= SSEL0;                      // Clock source = ACLK
  UBR01  = 0x0d;                       // 32kHz/2400 = 13.6
  UBR11  = 0x00;                       //
  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!

Autor: Rotschi Hoschi (hoschis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ZwiscEin 32.768KHz Quarz ist angeschlossen!!!!!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ZwiscEin 32.768KHz Quarz ist angeschlossen!!!!!
Gut :-)
Wo ist er angeschlossen und läuft er auch (Oszi zur Hand)?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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!

Autor: Rotschi Hoschi (hoschis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Leider kein Oszi zur Hand :-(


2. Hmm ja kann die Interrupts schon einmal abschalten, aber 
grundsätzlich wäre  das ja egal denn dann würde mein Breakpoint in der 
Intrsubroutine doch auslösen oder?

Autor: Rotschi Hoschi (hoschis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach dem Motto "Ein reboot tut immer gut" läuft das Programm nun ohne 
meckern, den Part:
  while(1) {
  while (!(IFG1 & UTXIFG0));   // USART0 TX buffer ready?
   TXBUF0 = 'X';

} 
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?

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

Bewertung
0 lesenswert
nicht lesenswert
> Hat jemand übrigens ein Terminal-programm zu empfehlen?
Für einfache Sachen verwende ich OC-Console

Autor: SERIAL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Putty ist ganz okay.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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. :-)

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau doch mal hier: 
http://focus.ti.com/mcu/docs/mcuflashtools.tsp?sec... 
da stehn die Beispiel-Codes auch für USART1.

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

Bewertung
0 lesenswert
nicht lesenswert
Bei mathar gibt's auch schöne Beispiele:
http://www.mathar.com/msp_usart1.html

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.