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
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!
@ 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
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.
@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.
@ 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 . . .
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.
> 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.
@ 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
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?
@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.
@ 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
@ 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
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...
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...
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).
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.
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.
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...
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?
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.
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 ;)
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.
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.