Forum: Mikrocontroller und Digitale Elektronik MSP430 UART Schnittstelle initialisieren


von Fridolin (Gast)


Lesenswert?

Hallo! Ich bin neu auf dem Gebiet der µC. Ich möchte erstmal einfach nur 
errechnete Werte mit dem UART ausgegen.

Ich habe allerdings ein Verständnisproblem, wie man den UART-Port 
initialisiert und ihn dazu bewegt etwas auszugeben.

Im USER-Guide steht:

Note: Initializing or Reconfiguring the USART Module
The required USART initialization/reconfiguration process is:
1) Set SWRST (BIS.B #SWRST,&UxCTL)
2) Initialize all USART registers with SWRST = 1 (including UxCTL)
3) Enable USART module via the MEx SFRs (URXEx and/or UTXEx)
4) Clear SWRST via software (BIC.B #SWRST,&UxCTL)
5) Enable interrupts (optional) via the IEx SFRs (URXIEx and/or UTXIEx)
Failure to follow this process may result in unpredictable USART 
behavior.

Ich möchte mein Programm in C schreiben, aber ich habe überhaupt keine 
Ahnung wie nun der entsprechende C-Code dazu aussehen muss. Ich hab 
schon ein paar Codebeispiele gefunden, aber ich möchte genau verstehen, 
wie es funktioniert.

Wie soll das denn aussehen Set SWRST ? Ich verstehe die Schritte einfach 
nicht und wie man da was setzt.

Ich habe die Suche benutzt, aber es fehlt mir die Erläuterung zu den 
Codeschnipseln. Ich will nicht einfach nur kopieren und nichts 
verstehen, dann steh in Zukunft wieder dumm da, wenn ich mal was ändern 
will, oder nen anderen Port nehmen möchte.

Bin für jede Hilfe dankbar!
Grüße Fridolin

von Dennis (Gast)


Lesenswert?

Weil ich gerade zufällig ähnliches offen habe:
1
// ##################################################################### USCI A1
2
void configure_usci_a1 (void)
3
{
4
  // Configuration of USCI A1
5
  // HART Modem HT2015
6
  // UART-mode
7
  
8
  // USCI A1 CONTROL REGISTER 1
9
  // --------------------------
10
  // UCSWRST  : Hold USCI in reset state
11
  // UCSSEL_2 : Clock source is SMCLK
12
  // UCRXEIE  : Erroneous received character causes interrupt
13
  UCA1CTL1 |= UCSWRST;
14
  UCA1CTL1 |= (UCSSEL_2 | UCRXEIE);
15
  
16
  // USCI A1 CONTROL REGISTER 0
17
  // --------------------------
18
  // UCPEN    : Parity enable
19
  UCA1CTL0 = UCPEN;
20
  
21
  // USCI A1 BIT RATE CONTROL REGISTER
22
  // ---------------------------------
23
  // UCA1BR0  : Low-Byte of prescaler
24
  // UCA1BR1  : High-Byte of prescaler
25
  UCA1BR0 = 0;  // 12*256 = 3072 (Prescaler) -> 3686400 / 3072 = 1200 (Baud)
26
  UCA1BR1 = 6;
27
  
28
  UCA1CTL1 &= ~UCSWRST;      // Release USCIA1 from software-reset -> now active
29
  
30
  HART_CLEAR_RX_IFG;
31
  
32
  HART_RX_INT_ENABLE;
33
}
34
// -----------------------------------------------------------------------------

von Dennis (Gast)


Lesenswert?

OK, das mit dem Prescaler musste jetzt mal gedanklich korrigieren - da 
steht noch n anderer Wert drin ;-) (anderer Quarz)

von Fridolin (Gast)


Lesenswert?

ich glaub ich habs jetzt verstanden!

Wenn

U0CRT &= SWRST;

und

U0CRT = 0x01;

das gleiche sind :)

von Dennis (Gast)


Lesenswert?

Fridolin schrieb:
> ich glaub ich habs jetzt verstanden!
>
> Wenn
>
> U0CRT &= SWRST;
>
> und
>
> U0CRT = 0x01;
>
> das gleiche sind :)

Keine Ahnung...kenne die Positionen der einzelnen Bits im Register nicht 
auswendig. Du solltest aber grundsätzlich nicht mit 0x01 o.ä. arbeiten, 
sondern die im Datenblatt angegeben Kürzel (#defines) verwenden - dann 
verstehst du es besser und andere können dir ggf. helfen.

Aber nur mal nebenbei:

> U0CRT &= SWRST;
Wenn du ein einzelnes Bit setzen willst, dann mit: U0CRT |= SWRST;
Zum Löschen: U0CRT &= ~SWRST;

von Fridolin (Gast)


Lesenswert?

wo ist der Unterschied zwischen U0CRT |= SWRST und UOCRT &= SWRST ?

von Dennis (Gast)


Lesenswert?

Fridolin schrieb:
> U0CRT = 0x01;

Hiermit weist du ein ganzes Byte zu [0000 0001]

Ist OK, aber nur wenn du das auch wirklich wolltest - es beeinflusst 
nicht nur das erste Bit.

Um erstmal nur den Reset zu setzen ist es aber in Ordnung - nur falls 
andere Bits per default '1' waren, sind sie dann jetzt '0' - AUFPASSEN 
;-)

von Fridolin (Gast)


Lesenswert?

Ja das war so geplant :)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Fridolin schrieb:
> wo ist der Unterschied zwischen U0CRT |= SWRST und UOCRT &= SWRST ?

Mit

    U0CRT |= SWRST

setzt Du das Bit SWRST, ohne die anderen in U0CRT zu verändern.

Mit

    U0CRT &= SWRST

setzt Du das Bit SWRST nur, wenn es vorher auch gesetzt war, alle 
anderen Bits in U0CRT werden gelöscht.

von Fridolin (Gast)


Lesenswert?

Ok alles klar vielen Dank!

von codehamster (Gast)


Lesenswert?

und falls du die Register für die Baudrate nicht von Hand rechnen 
willst, hier ein Onlinerechner:

http://mspgcc.sourceforge.net/baudrate.html

Vorsicht Frequenz des Clocks in Hz eingeben!

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.