Hallo,
Ich versuche die Serielle Schnittstelle von meinen MSP430x169 zum laufen
zu bekommen. Leider bisher ohne Erfolg. Ich habe schon viele
Beispielprogramme ausprobiert nur bis jetzt hat nichts geklappt. Ich
benutze das MSP430169STK Board von Olimex. Die Serielle Schnittstelle am
PC habe ich auch schon getestet und die macht es noch. Auch habe ich
mein Programm schon auf einen anderen Board laufen lassen und dies
ebenfalls ohne Erfolg.
Hi Stephan,
als erstes fällt mir mal auf, dass Du zu Beginn der Routine die
Schnittstelle nicht zurücksetzt (also das SWRST Bit nicht setzt). Dies
wird explizit im Datenblatt empfohlen.
Außerdem wählst Du den ACLK als Quelle für die Schnittstelle. Der Takt
ist da, oder??
Viele Grüße
@ Ampfing
Bit habe ich jetzt vor der Initialisierung gesetzt. Der Takt ist da. Er
wird ohne Vorteiler vom 32768kHz Quarz abgegriffen.
@ Wolfgang-G
Nach meiner Berechnung wurde eine Baudrate von 9600 gewählt. Errechnet
sich aus der Quarzfrequenz(32768kHz)/9600Baud = 3.413. UBRx0 = 0x0003
und das Modulationsregister mit 0x4A. Werte und Berechnung im Datenblatt
zu finden.
Das ganze funktioniert jetzt ohne Probleme. Das Problem lag einzig darin
das ich die P3SEL und P3DIR Register beschrieben habe bevor ich das
SWRST Bit gelöscht habe. Um es euch zu zeigen hier mein Code der nun
ohne Probs funzt.
Mein einziges Problem ist jetzt nur noch das ich den Clock der UART0
nicht ausgegeben bekomme. Es ist der PIN3.3 welcher auch mit
initialisiert wurde (P3SEL |= 0x38; P3DIR |= 0x18;) Aber das spielt
jetzt kaum noch eine Rolle.
mfg
Stephan
Ach so ok, ich hatte das so verstanden das man den Clock mit dem die
Schnittstelle arbeitet, sprich den eingestellten ACLK, ausgeben kann.
Aber jetzt versteh ich das!
THX
Stephan
Hallo,
hab jetzt auch ein bißchen mit der seriellen Schnittstelle rumprobiert.
Habe folgende Funktionen für Initialisierung und Aufruf: (MSP430F1611 -
TXD0 auf PIN 3.4 RXD0 auf Pin 3.5)
IE1|=UTXIE0+URXIE0;// 2 -> TX- und RX-interrupt anschalten
18
19
20
}
21
22
voidSendUSART0c(charc)// ein einzelnes zeichen über die serielle schnittstelle (USART0) senden
23
// FJG: Obacht: x12xx : IFG1 => IFG2 !
24
{
25
while(!(IFG1&UTXIFG0));// warten, bis USART0 TX-buffer sendebereit
26
TXBUF0=c;
27
}
Die Interrupts wurden nach der Initialisierung mit _EINT(); aktiviert.
Problem ist nun, dass der in der Send-Funktion in der While-Schleife
hängenbleibt. Wenn ich die while-Schleife testweise weglasse,
funktioniert es, das gesendete Zeichen kommt im Terminal an. Aber das
klappt vielleicht bei einzelnen zeichen, aber wenn ich strings senden
will, sollte man ja schon schauen, ob die Schnittstelle sendebereit ist.
SMCLK ist 8Mhz, Baudrate 19200. Warum wird das TX-Flag nicht gesetzt und
das Programm hängt damit in der While-Schleife?
UTXIE Bit setzen und dann keine ISR für USART0_TX...das kann nicht
klappen. Je nach Compiler wird dann wenigstens ein RETI in die Interrupt
Vector Tabelle eingetragen, allerdings wird eben dann das TF-Flag eben
sofort gelöscht.
ach mist, da war vom vielen ausprobieren eine zeile, die da nicht
hingehörte. jetzt scheint das was supachris sagte zu stimmen. IE1 raus
und es funktioniert.
besten Dank.
Ist es eigentlich richtig so, dass ich meine Probleme an die schon
bestehenden Threads zu bestimmten Themen hänge oder lieber einen neuen
aufmachen? Denke, so ist es übersichtlicher
Ist auch logisch. Wenn es der GCC ist, wird in die Stelle für den USART
0 TX in die Vektor Tabelle ein RETI eingetragen (bzw. die Adresse des
unexpected ISR handlers). Tritt nun der Interrupt ein (also Senden
beendet), dann wird vor dem Einsprung in die ISR das Flag schon wieder
gelöscht, weil es ein Single-Source Interrupt ist. Da die ISR nur den
Rücksprungbefehl enthält, landest du gleich wieder im richtigen
Programm, aber das Flag ist nie gesetzt.