Forum: Mikrocontroller und Digitale Elektronik MSP430F155 UART Bitorder


von Lars D. (eitum)


Lesenswert?

Hallo zusammen.

Ich habe ein skurilles Verhalten bei meiner UART und bräuchte einmal 
fachmännichen Rat, da mir das Datenblatt und Dr. Google nicht mehr 
weiter helfen.

1. Ich habe 2 Platinen mit der gleichen Hard & Firmware.
2. Die Kommunikation hat bereits funktioniert, bevor ich den Watchdog 
aktiviert habe.
3. Das Problem lässt sich auch nicht durch deaktivieren des WDT beheben.

Ich schicke mehrere Bytes von Platine 1 zu Platine 2.  Die Daten die ich 
aber empfange sind aber bitweise gedreht.   Sprich :
ich sende:     0b10110011
ich empfqange  0b11001101

Ich kann dies mit einem Osci bestätigen. Wenn ich in den Sendebuffer 
U0TXBUF schaue stehen die Daten noch original drin.

Laut Datenblatt gibt es keine Option die Daten entsprechend zu 
modifizieren, ich kann mir daher nicht erklären warum dies geschieht.

Anbei noch meine Init Funktion. Ich benutze einen Uhrenquarz mit 
32768Hz.
1
void fnInitUart0()
2
{
3
    ME1    |=  UTXE0 + URXE0;       // enable USART0  (TX- and RX-part)
4
    
5
  UCTL0  |=  CHAR;                // 8 data bits, 1 stop bit, no parity (8N1)
6
  UTCTL0  |=  SSEL0;            // ACLK used as UCLK (32768Hz)
7
8
  UBR00  =  0x03;              // 9600Baud at 32768Hz
9
    UBR10  =  0x00;                // 9600Baud at 32768Hz
10
    UMCTL0  =  0x29;          // 9600Baud at 32768Hz
11
  
12
  UCTL0  &=   ~SWRST;              // release USART
13
  IE1   |=   URXIE0;          // enable rX-interrupt
14
  IFG1   &=   ~URXIFG0;        // delete first interrupt-flag
15
}

von Jörg S. (joerg-s)


Lesenswert?

Lars D. schrieb:
> Ich kann dies mit einem Osci bestätigen.
Was bestätigen? Das er die Daten korrekt sendet? Du hast beachtet das 
bei UART LSB First ist?

> Das Problem lässt sich auch nicht durch deaktivieren des WDT beheben.
Einen Power On Reset hast du aber schon mal gemacht?

> Wenn ich in den Sendebuffer U0TXBUF schaue stehen die Daten noch
> original drin.
Also Sendebuffer 0xB3, Empfangsbuffer 0xCD?
Es wird immer nur 1 Byte gesendet?

von Lars D. (eitum)


Lesenswert?

Jörg S. schrieb:
>> Ich kann dies mit einem Osci bestätigen.
>
> Was bestätigen? Das er die Daten korrekt sendet? Du hast beachtet das
>
> bei UART LSB First ist?

Ich kann bestätigen, dass die Daten am Ausgangspin bereits MSB gesendet 
werden. Sprich: Sendebuffer 0xB3  auf der leitung kommt: 1011 1100

Jörg S. schrieb:
>> Wenn ich in den Sendebuffer U0TXBUF schaue stehen die Daten noch
>
>> original drin.
>
> Also Sendebuffer 0xB3, Empfangsbuffer 0xCD?
>
> Es wird immer nur 1 Byte gesendet?

Es werden mehrere Bytes gesendet aber die natürlich nach einander und es 
wird immer erst auf Freigabe Uart gewartet. Die Bytereihenfolge ist 
nicht verändert.

Jörg S. schrieb:
>> Das Problem lässt sich auch nicht durch deaktivieren des WDT beheben.
>
> Einen Power On Reset hast du aber schon mal gemacht?

Leider kann ich das nicht. Die Platinen sitzen auf Batteriezellen und 
sind in einem Stapel verbaut. ich komm nur an die Anschlüsse heran. Ich 
hab das ganze aber auch an einem Anderem neuen Stapel probiert mit dem 
gleichem Ergebnis.

Wie gesagt, das ganze System hat bereits funktioniert ich habe nur eine 
Quellcodedokumentation gemacht +  Watchdog aktiviert.
Hardwareseitige Probleme kann ich daher ausschließen. Da ich im 
Datenblatt nichts finde das man die Bitreihenfolge verändern kann bin 
ich etwas ratlos wie es zu dem Phänomen kommt.

von gerda (Gast)


Lesenswert?

Lars D. schrieb:
> habe nur eine
> Quellcodedokumentation gemacht +  Watchdog aktiviert

Dann wirds wohl daran liegen :-\

von Lars D. (eitum)


Lesenswert?

Quelldokomentation kanns nicht sein, die wird ja vom Kompiler 
rausgehauen.
und Watchdog hab ich wieder deaktiviert und das Verhalten blieb gleich.

Ich suche jemanden der ein ähnliches Problem eventuell auch schon hatte, 
da ich wirklich schon alles versucht habe was mir einfällt.

von Jörg S. (joerg-s)


Lesenswert?

Lars D. schrieb:
> Leider kann ich das nicht. Die Platinen sitzen auf Batteriezellen und
> sind in einem Stapel verbaut. ich komm nur an die Anschlüsse heran. Ich
> hab das ganze aber auch an einem Anderem neuen Stapel probiert mit dem
> gleichem Ergebnis.
Da in deinem Code Ausschnitt die Register nicht komplett neu gesetzt 
werden, sondern nur verändert ( |= ) würde ich die mal auf einem 
definierten Wert setzen. Oder wie gesagt irgendwie einen Power On Reset 
erzwingen.

von Lars D. (eitum)


Lesenswert?

Hab am Anfang mal alle Register auf 0 gesetzt. Keine Änderung des 
Verhaltens. Wenn ich mir die Register in der Übersicht anschaue sind 
auch nur die bits gesetzt die ich sage.

Achja ich nutze das code composer studio v5

von Erik (Gast)


Lesenswert?

hallo Lars D.

deine angaben
  UBR00  =  0x03;              // 9600Baud at 32768Hz
    UBR10  =  0x00;                // 9600Baud at 32768Hz
    UMCTL0  =  0x29;          // 9600Baud at 32768Hz

ich würde das abändern
UMCTL = 4Ah ///  steht bei mir in der Tabelle  für F149

vielleicht auch nur ein Denkfehler
wenn ich mir werte im Memory angucke sind manchmal auch die
Stellen verdreht ,je nachdem  ob 8Bit oder 16Bit Anzeigeformat

mfg Erik

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.