Forum: Mikrocontroller und Digitale Elektronik MSP430: UART Verständnis/Problem


von Stefan (Gast)


Lesenswert?

Hallo,

ich wollte heute mal mit der Programmierung der seriellen Schnittstelle 
mit dem MSP430 beginnen. Auf meinem Board befindet sich zwar ein 8 MHz 
Quarz, allerdings wollte ich ausschließlich den DCO als Taktquelle 
verwenden. Hier mein Programm (ein paar Deklarationen von bool etc. habe 
ich weggelassen):
1
#include <msp430x16x.h>
2
3
// ...
4
5
int main( void )
6
{
7
8
    char    sendString[14] = "Hello World! ";
9
    int     i;
10
    bool    led = false;
11
    
12
    WDTCTL  = WDTPW | WDTHOLD; 
13
    
14
    // Initialize the USART0 output pins
15
    P3SEL  = 0x10;  // Select UTXD0 function for pin 3.4
16
    P3DIR  = 0x10;  // UTXD0 is an output pin
17
    
18
    // Initialize the USART0 module
19
    U0CTL = SWRST;  // USART0 software reset
20
    U0TCTL |= SSEL0 + SSEL1;
21
    U0CTL |= CHAR;  // Select transmission mode:
22
                    // 8 databits, no parity, 1 Stopbit
23
                                            
24
/*
25
  uart calculator: http://mspgcc.sourceforge.net/baudrate.html
26
  ...
27
*/
28
29
UBR00=0x53; UBR10=0x00; UMCTL0=0x21; /* uart0 800000Hz 9603bps */
30
UBR01=0x53; UBR11=0x00; UMCTL1=0x21; /* uart1 800000Hz 9603bps */
31
32
                                             
33
    ME1    = UTXE0;   // Enable USART0 transmit
34
    U0CTL &= ~SWRST;  // Clear the USART0 software reset
35
                      //   (now the new settings are
36
                      //   applied to the serial port).
37
38
    // Write "Hello World!" to serial port for ever
39
    while( true )
40
    {
41
        i = 0;
42
        while( sendString[i] != 0 )         
43
        // send the sendString (blocking)
44
        {
45
            while(!(IFG1 & UTXIFG0)) ;
46
            TXBUF0 = sendString[i];
47
            i++;
48
          
49
        }
50
    }
51
}

Mit dem Hyperterminal unter 9600 bps empfange ich allerdings nichts. Mit 
dem Oszi gibt es an Port P3.4 Anzeichen dafür, dass der MSP sendet. Das 
Programm funktioniert auch nicht, wenn ich

> U0TCTL |= SSEL0 + SSEL1;

auskommentiere.

Ich fürchte, dass wohl meine Baud/Taktquellen Einstellungen falsch sind.
Die Berechnung der Baudrate mache ich mit dem Script: 
http://mspgcc.sourceforge.net/baudrate.html bei einer DCO Freq. von 
800000 Hz.

Kann mir jemand weiterhelfen?

Danke!

von Falk B. (falk)


Lesenswert?

@ Stefan (Gast)

>ich wollte heute mal mit der Programmierung der seriellen Schnittstelle
>mit dem MSP430 beginnen. Auf meinem Board befindet sich zwar ein 8 MHz
>Quarz, allerdings wollte ich ausschließlich den DCO als Taktquelle
>verwenden.

MööööööP!

Gehe zurück zu den Grundlagen. Gehe direkt dorthin. Ziehe keine 4000 
Euro ein.

AVR-Tutorial: UART, unter Senden, gilt auch für den MSP30.

>http://mspgcc.sourceforge.net/baudrate.html bei einer DCO Freq. von
>800000 Hz.

Dumm nur, dass dein DCO selten genau auf 8 Mhz schwingt.

MfG
Falk

von Christian R. (supachris)


Lesenswert?

Der DCO macht ohne Abgleich IRGENDWAS bei ungefähr 800Khz, ist extrem 
abhängig von der Temperatur und von der Betriebsspannung. Ich hab bei ca 
20°C immer irgendwas zwischen 730 und 810 kHz gemessen. Du musst 
zumindest (in regelmäßigen Abständen) den DCO in Abhängigkeit des 32Khz 
Quarzes nachstellen. Ansonsten hast du mit der UART keine Chance.

von Stefan (Gast)


Lesenswert?

@Christian:

Danke, dann werde ich es wohl doch mit dem Quarz versuchen.

@Falk:

Schön, dass Du meine E-Mail Adresse hier so postest! Das gibt wieder 
ordentlich Spam-Email. Was bezweckst Du damit?

> MööööööP!
> ...
> ...
>Dumm nur, dass dein DCO selten genau auf 8 Mhz schwingt.

Wie ich schon sagte, 800000 Hz - das sind keine 8 MHz. Danke für den 
tollen Beitrag.

von Falk B. (falk)


Lesenswert?

@ Stefan (Gast)

>Schön, dass Du meine E-Mail Adresse hier so postest! Das gibt wieder
>ordentlich Spam-Email. Was bezweckst Du damit?

Gehts noch? Du selber hast sie doch gepostet. Denkst du die bösen SPAMER 
ignorieren das dort oben, und nehmen nur meine Kopie?
Leute gibts . . .

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Stefan wrote:
> Danke für den tollen Beitrag.

Ehrlich gemeinter und nicht sarkastischer Tipp:
Gewöhn dir das schnell ab. Damit kommst du hier nicht weit.

Falk hat einen Fehler gemacht. OK. Aber das macht er selten und er 
antwortet echt oft.

Wenn so ein Fehler nix Essentielles ist, und der Kern der Antwort stimmt 
ja, sieht man nonchalant darüber hinweg.

von Stefan (Gast)


Lesenswert?

> Gehts noch? Du selber hast sie doch gepostet.

Aber nicht, damit sie im Forum angezeigt wird, denn da steht: "Email 
(wird nicht angezeigt)".

Was genau gibt es sonst noch dazu zu sagen?

Im übrigen: Woher soll ich wissen, dass das AVR Tutorial auch für den 
MSP430 geeignet ist?

@Stefan B.

Ich bin weiß Gott nicht das erste mal in einem Forum und mir sind Dinge, 
wie Netiquette kein Fremdwort. Und natürlich habe ich mich vorher im 
Forum umgeschaut. Aber wir sind hier nicht im Kindergarten:

> MööööööP!
> Gehe zurück zu den Grundlagen. Gehe direkt dorthin. Ziehe keine 4000
> Euro ein.

... und das, wo er noch nicht mal mein Posting richtig gelesen hat (800 
kHz sind keine 8 MHz... ich wüsste auch nicht, dass der DCO mit 8 MHz 
gestartet wird - soviel zum Thema Grundlagen). Insofern ist das Posting 
von Falk im Gegensatz zu Christians Posting absolut sinnfrei.

> Wenn so ein Fehler nix Essentielles ist

Ich verlange, dass meine E-Mail Adresse im Posting von Falk unleserlich 
gemacht wird.

von Falk B. (falk)


Lesenswert?

@ Stefan (Gast)

>Aber nicht, damit sie im Forum angezeigt wird, denn da steht: "Email
>(wird nicht angezeigt)".

Dann beschwer dich beim Admin der Seite. Ich bin ein normaler User.

>Im übrigen: Woher soll ich wissen, dass das AVR Tutorial auch für den
>MSP430 geeignet ist?

Musst du gar nicht. Aber ich wette, dass auch in der Doku vom MSP30 
geschrieben steht, dass eine UART-Kommunikation einen Quarz braucht.

>Ich verlange, dass meine E-Mail Adresse im Posting von Falk unleserlich
>gemacht wird.

Sag das dem Admin.

MFg
Falk

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Falk jetzt sei du auch nicht so stur. Du kannst zwar den Beitrag nicht 
mehr bearbeiten, weil Folgeposts da sind, aber du kannst die Nachricht 
mit der Adresse löschen und damit der "Sinn" nicht verloren geht, vorher 
mit Antworten mit Zitat aber mit ausge-x-ter Email an den Thread 
anhängen.

BTW. Kann es sein, dass Moderatoren die Email sehen und normale User 
(Gäste und Registrierte) nicht?

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

@Falk:

Ich kann mich ja verlesen haben, aber im "MSP430x1xx User's Guide" (TI: 
slau049f) steht es im Kapitel 13 - UART MODE nicht drin. Ich hab es auch 
nicht in M. Sturms "Mikrocontrollertechnik am Beispiel der 
MSP430-Familie" oder Bierls "Das große MSP430 Praxisbuch" gefunden.

von Falk B. (falk)


Lesenswert?

@ Stefan B. (stefb)

>mehr bearbeiten, weil Folgeposts da sind, aber du kannst die Nachricht
>mit der Adresse löschen und damit der "Sinn" nicht verloren geht, vorher

Ein gute Fee hat schon die Emailadresse gelöscht. Danke, gute Fee.

>BTW. Kann es sein, dass Moderatoren die Email sehen und normale User
>(Gäste und Registrierte) nicht?

Keine Ahnung.

MFG
Falk

von Falk B. (falk)


Lesenswert?

@ Stefan (Gast)

>Ich kann mich ja verlesen haben, aber im "MSP430x1xx User's Guide" (TI:
>slau049f) steht es im Kapitel 13 - UART MODE nicht drin.

Ok, es sthet dort nicht explizit drin. Nur implizit, weil immer von 
einem Uhrenquarz bzw. 1,024 MHz Quarz die Rede ist.

> Ich hab es auch nicht in M. Sturms "Mikrocontrollertechnik am Beispiel der
> MSP430-Familie" oder Bierls "Das große MSP430 Praxisbuch" gefunden.

Tja, dann würde ich das ggf. als Mangel der Bücher ansehen. Ist auch 
egal, jetzt sollte es dir klar sein, oder? Ausserdem sollte manden guten 
Humor nicht verlieren . . .

MFG
Falk

von Stefan (Gast)


Lesenswert?

Ok - Friede ;)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Der Baudratenfehler sieht nicht zu hoch aus.
http://mspgcc.sourceforge.net/baudrate.html

Die Frage ist - ebenso wie beim internen RC-Oszillator vom AVR - wie 
stabil die Taktquelle läuft.

Der Taktquellenfehler geht in den Baudratenfehler ein und das wird beim 
obigen Codegenerator nicht berücksichtigt; dort wird dieser Fehler als 0 
angenommen.

Es gibt von TI ANs, die vielleicht helfen.

MSP430 LFXT1 Oscillator Accuracy => Frequenzlage +- 25ppm bei 
Raumtemperatur bei dem 32.768 kHz Quarz

Die schlagen natürlich durch, wenn der 32.768 kHz Quarz benutzt wird, um 
den DCO zu kontrollieren (z.B. AN Controlling the DCO Frequency of the 
MSP430x11x)

Bei Raumtemperatur müsstest du auf einen grundlegenden Baudratenfehler 
von +- 0.8% kommen, noch ausreichend für die Übertragung. Anders sieht 
es bei anderen Temperaturen aus - dort wächst der Grundfehler stark.

Ohne Rekalibrierung des DCO mit einem 32.768 kHz Quarz (oder einem 50 Hz 
Signal) sieht es übler aus.

In der 2. AN steht, dass die Frequenz n+1 zum Aufbau der DCO Frequenz 
statt genau 12% höher als die Frequenz n produktionsbedingt zwischen 7% 
und 16% höher liegen kann. D.h. Grundfehler +-33 rel.% zusätzlich zum 
Absolutfehler wo n liegt.

Letztlich kann man auch den temperaturabhängigen DCO Fehler (also den 
Absolutfehler oben) anhand von Bild 4-6 im User's Guide abschätzen. 
Zwischen -40°C und +90°C wandert f(DCO) von fast +25% mehr bis -25% (bei 
internem R im RC-Oszillator, externer R sieht besser aus) weniger als 
eingestellt.

Diese Fehler rattern beide in den Taktquellenfehler und damit in den 
Baudratenfehler rein...

von Stefan (Gast)


Lesenswert?

Ich werde es halt mit dem exteren 8 MHz Quarz machen. Das Beispiel 
sollte eigentlich den Umgang mit dem UART demonstrieren, wobei ich den 
selbst grade noch erlerne. Ich dachte, dass ich eventuell nur mit dem 
DCO arbeiten könnte, um "unnötigen" Ballast im Form von Takteinstellung 
im Beispiel über Board werfe. Die Rekalibrierung des DCOs wird aber 
vermutlich viel aufwendiger werden...

von Jörg S. (Gast)


Lesenswert?

Dann können wir wieder zum Thema zurück kommen? Gut.

Wenn du UART per DCO machen willst, empfehle ich einen externen DCO 
Widerstand zu verwenden (Pin Rosc mit 100k gegen VCC schalten).

von Stefan (Gast)


Lesenswert?

Ja das geht natürlich mit dem externen Widerstand. Aber selbst das wäre 
dann vermutlich schwieriger. Dann müsste ich ja erstmal die genaue 
Frequenz messen. Wenn ich aber die 8 MHz kenne, kann ich ja entsprechend 
auf 1,0x MHz teilen und die Standard-Einstellungen nehmen.

Danke nochmal.

von Christian R. (supachris)


Lesenswert?

Die Kalibrierung des DCO durch einen 32kHz Quarz ist ziemlich einfach. 
Man kann alle ganzzahligen Vielfachen erzeugen, zumindest so in etwa. 
Denn der DCO trifft ja selten genau diese Frequenz, dazu sinds einfach 
zu wenige Taps.
Wie der eingestellt wird, hab ich hier schon mehrfach gepostet.
Mit den externen DCO-Widerstand geht das eigentlich recht genau, und 
wenn´s kein industrieller Temp-Bereich sein muss, ausreichend.

Vorsicht bei 8MHz Quarz !!! Da brauchst du eine Betriebsspannung von 
3,6V sonst läuft der MSP nicht zuverlässig und der Debugger schmiert 
dauernd ab. Aber steht ja im Datenblatt in dem Diagramm.

Am besten ist es natürlich immer, einen Baudratenquarz zu nehmen, die 
7,3728MHz laufen gerade so noch mit 3,3V, ich betreib den MSP dann aber 
mit 3,4V da läufts stabil.

von Jörg S. (Gast)


Lesenswert?

> Dann müsste ich ja erstmal die genaue Frequenz messen.
Kein Oszi zur Hand?

von Stefan (Gast)


Lesenswert?

Doch ich habe hier in der Uni Oszi. Aber wie gesagt: ich lege das jetzt 
auf den 8 MHz Quarz aus, sofern die Spannung ausreichend groß ist (3,6 
V). Allerdings kann ich auch nicht so einfach auf den DCO mit externen 
Quarz zurückgreifen, weil die MSPs auf dem Board fest verlötet. Mal 
schaun...

von Christian R. (supachris)


Lesenswert?

Stefan wrote:
> Allerdings kann ich auch nicht so einfach auf den DCO mit externen
> Quarz zurückgreifen, weil die MSPs auf dem Board fest verlötet. Mal
> schaun...

Den Satz versteh ich nicht. Was genau willst du machen?

von szimmi (Gast)


Lesenswert?

Hiho,
Du brauchst die 3,6V nicht zwingend. Teile die 8 MHz für den MCLK auf 4 
MHz runter. Dann läuft die CPU mit 4 MHz und 3,3V reichen aus. 8 MHz 
CPU-Clock sind bei den MSP430F1xxx sowieso mit Vorsicht zu genießen, wie 
supachris bereits erwähnte.

von Stefan (Gast)


Lesenswert?

Es sollte heissen:

> Allerdings kann ich auch nicht so einfach auf den DCO mit externen
> WIDERSTAND zurückgreifen, weil die MSPs auf dem Board fest verlötet. Mal
> schaun...

das Problem ist halt, dass ich nicht mal eben auf die Platine noch einen 
Widerstand drauf löten kann, weil es insgesamt 30 Platinen sind, auf 
denen das Beispiel-Programm laufen muss ;)

von Christian R. (supachris)


Lesenswert?

Achso. Weil da "externer Quarz am DCO" stand. Das war bissl verwirrend. 
Ja, dann musst du den 8MHz Quarz nehmen, und wenn 4MHz CPU Takt 
ausreichen, den herunter takten, um mit 3,3V auszukommen. Oder halt 3,6V 
Betriebsspannung bereit stellen.

von Stefan (Gast)


Lesenswert?

Naja ich hab jetzt den 8 MHz Quarz auf 1 MHz getaktet. Das funktionierte 
wunderbar.

von Christian R. (supachris)


Lesenswert?

Wie soll man den Satz jetzt wieder verstehen? Hast du den runter geteilt 
auf 1MHz oder einen 1MHz Quarz an den HF-Oszillator angeschlossen?

von Stefan (Gast)


Lesenswert?

Ich habe ihn runter geteilt, das hört sich aber auch irgendwie komisch 
an. 30 neue 1 MHz Quarze aufzulöten hätte wohl auch was länger gedauert. 
Wie auch immer: funktioniert ja.

von Christian R. (supachris)


Lesenswert?

Naja, hört sich komisch an, ist aber korrekt. Einen 8MHz Quarz kann man 
nicht auf 1MHz takten. Gut, wenn es jetzt klappt.

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.