Forum: Mikrocontroller und Digitale Elektronik Jedes Byte falsch. Hat jemand eine erklärung


von mspmarkus (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
Ich programmiere auf einem Olimex Development Board MSP43F169LCD.
Die Daten übertrage ich mit UART und lese sie dann am PC über einen USB 
Adapter mit c# ein.
Dann zeige ich die Daten an und jedes 1165 Bit beginnt ein Fehler.
Kurze erklärung zu den Daten.
Ich sende im Moment noch Testdaten 255,255 ist mein Trennzeichen

Danach wird 1000 übertragen(232,3)
Dann 0 (0,0;)
Als letzter Wert (65,0)

Dann kommt wieder ein Trennzeichen.
Bei diesem Fehler bekomme ich als 2. Byte eine 17 und nach dem nächsten 
Trennzeichen 2 mal 226. Danach läuft alles wie gewohnt weiter.
Der Fehler tritt regelmäßig alle 1162 Byte auf.

Das Problem liegt nicht in c# ich bekomme den Fehler auch mit HTerm.

Ich kann mir nur denken das das Problem bei der UART liegt, die ist 
folgendermaßen konfiguriert:
ME2 |= UTXE1;                       // Enable USART1 TXD
U1CTL |= CHAR;                          // 8-bit character
U1TCTL |= SSEL1;                        // UCLK = SMCLK
U1BR0 = 0x45;                           // UBR = 8M/115,2kBd = 69,44444
U1BR1 = 0x00;                           //
                                 // UMCTL = 0,44444*8 = 3,55552 --> 4 
ones to be placed in UMCTL
                    // corrected baud rate = 8M/((4*70+4*69)/8) = 
115107,9137 Baud
                    // Baud rate error = 
((115107,9137-115200)/115200)*100% = -0,08%
U1MCTL = 0xAA;               // Modulation 0b10101010

U1CTL &= ~SWRST;                        // Initialize USART state 
machine


Sieht jemand meien Fehler? Oder weiss wie ich herausfinden könnte woher 
er kommt? Ich steh gerade echt an...
Vielen Dank!!

von mspmarkus (Gast)


Lesenswert?

Hoppla hab vergessen die Zahl im Betreff einzufügen... Naja hoffe der 
Text erklärt das Problem ;)

von mspmarkus (Gast)


Lesenswert?

und das bit am anfang sollte byte heissen...

von Mike (Gast)


Lesenswert?

mspmarkus schrieb:
> Der Fehler tritt regelmäßig alle 1162 Byte auf.

Nichts ist besser, als ein regelmäßig auftretender Fehler. Dann sollte 
sich im Simulator auch nachvollziehen lassen, was da schief läuft.

von Thorsten S. (whitejack) (Gast)


Lesenswert?

>>Dann zeige ich die Daten an und jedes 1165 Bit

>>Der Fehler tritt regelmäßig alle 1162 Byte auf

der Unterschied zwischen Bit und Byte ist aber klar, oder?

1165 nicht gleich 1162.

>>Danach wird 1000 übertragen(232,3)

was hat 1000 mit 232,3 zu tun? Wo ist das Komma in der Übertragung?

Was ist c#

>>Dann 0 (0,0;)


Wofür ist das Semikolon?

Was sendest du wie mit welcher funktion und welcher Baueinstellung. Wie 
wird das umgesetzt wer macht was warum  wieso wann und überhaupt!?

Die LED an meinem Controller leuchtet immer, sie sollte aber 2x blinken, 
ich glaube das Problem liegt in meinem Main(), was meint Ihr?

TS

von Bytebeißer (Gast)


Lesenswert?

Thorsten S. (whitejack) schrieb:
>>>Danach wird 1000 übertragen(232,3)
> was hat 1000 mit 232,3 zu tun? Wo ist das Komma in der Übertragung?

High Byte: 3 dez
Low byte:  232 dez  -> Zusammen 1000 dez

von mspmarkus (Gast)


Lesenswert?

Zu Beginn:Ja der unterschied zwischen bit und byte ist mir klar.

Bei den Werten handelt es sich um mein "Übertragungsprotokoll"
Jeder 16 Bit Wert wird auf 2 8 Bit Werte aufgeteilt.
        0000 0011 1110 1000
&  0000 0000 1111 1111
---------------------------
  0000 0000 1110 1000
In Dezimalzahlen erhält man hier das Ergebnis 232.

Glaub es is klar was ich mein...
Das Semlikon sollte ein Zwinkerndes Smiley sein, weil ich die Werte auch 
für 0 hingeschrieben hab... Is wohl nicht so gut gekommen der Witz 
"zwinker".

Also kommen ich folgendermaßen auf die Werte:

  unsigned short test1=1000;
  unsigned short test2=0;
  unsigned short test3=65;
  trans[0]=test1 & 0xFF;
  trans[1]=test1 >>8 & 0xFF;
  trans[2]=test2 & 0xFF;
  trans[3]=test2 >>8 & 0xFF;
  trans[4]=test3 & 0xFF;
  trans[5]=test3 >>8 & 0xFF;


Die Sendefunktion besteht aus
  while (!(IFG2 & UTXIFG1));           // warten, bis USART1 TX-buffer 
sendebereit
  TXBUF1 = s;

Das ganze wird aus einem Interupt aufgerufen
Hier die Clock und Counter Einstellung:

WDTCTL=WDTPW|WDTHOLD;   // Watchdog off
  P2OUT=~LED;        //Led einschalten
  P2DIR=LED;        //Ausgang der Status Led auf Output

  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0 = ((XTALFREQ/(1000*8))-1);
  TACTL = TASSEL_2 + MC_1 + ID_3;           // SMCLK, upmode, divider /8

  BCSCTL1 = RSEL0 + RSEL1 + RSEL2;          // XT2on, max RSEL
    BCSCTL2 |= SELM_2;                         // MCLK = XT2
    BCSCTL2 |= SELS;                         // SMCLK = XT2


Danke aber schon mal für den ersten Beitrag!

von Thorsten S. (whitejack) (Gast)


Lesenswert?

OK, es soll also ein 16Bit Wert übertragen werden, es werden also 2 
Bytes pro Aufruf übertragen, sie enthalten 2x8Bit, deren Ursprung in 
einer 16Bit Zahl begründet zu sein scheint?

(Low,High) ist die Schreibweise. Folgendes soll übertragen werden:

(255,255)  0xFF,0xFF  als 16Bit wert dezimal:65535

(232,3)    0xE8,0x03  als 16Bit wert dezimal:1000

(0,0)      0x00,0x00  als 16Bit wert dezimal:0

(65,0)     0x41,0x00  als 16Bit wert dezimal:65

Nach Byte wiederholt sollte sich das Muster also wiederholen!?

Das scheint es aber nicht zu tun, es kommen Bytes hinzu?

Leider ist die Beschreibung des Fehlers oben so schlecht. Es wird sich 
niemand die Mühe machen das auch noch alles rauszusuchen.

Für eine Vernünftige Antwort sollte zumindest das Problem einfach mal 
eindeutig und klar beschrieben werden, dann muss sich das nicht auch 
noch jeder hier zusammenreimen...

Also hau mal in die Tasten.

TS

von mspmarkus (Gast)


Lesenswert?

Ok noch ein Versuch.
Ja meine Werte wiederholen sich.
Alles funktioniert nach 1165 Byte beginnt ein Fehler. Der Fehler ist 
oben in der angehängten Grafik ersichtlich. Er liegt nicht in der 
Übertragung der Daten. Zumindest nicht in den tatsächlichen 
Übertragungsbefehlen. Die funktionieren.
Der Fehler wiederholt sich jedoch in regelmäßigen Abständen.

Meine Frage ist: Was könnte der Grund sein, dass sich nach einer relativ 
großen Anzahl an geglückten Übertragungen auf einmal ein Fehler 
einschleicht? Und hat jemand Lösungsvorschläge dazu?

Das einzige was mir einfällt ist, dass es an der UART liegt.



#define XTALFREQ     8000000

CCTL0 = CCIE;                             // CCR0 interrupt enabled
CCR0 = ((XTALFREQ/(1000*8))-1);
TACTL = TASSEL_2 + MC_1 + ID_3;           // SMCLK, upmode, divider /8

BCSCTL1 = RSEL0 + RSEL1 + RSEL2;          // XT2on, max RSEL
BCSCTL2 |= SELM_2;                         // MCLK = XT2
BCSCTL2 |= SELS;                         // SMCLK = XT2
ME2 |= UTXE1;                       // Enable USART1 TXD
U1CTL |= CHAR;                          // 8-bit character
U1TCTL |= SSEL1;                        // UCLK = SMCLK

U1BR0 = 0x45;                           // UBR = 8M/115,2kBd = 69,44444
U1BR1 = 0x00;

// UMCTL = 0,44444*8 = 3,55552 --> 4 ones to be placed in UMCTL
// corrected baud rate = 8M/((4*70+4*69)/8) =115107,9137 Baud
// Baud rate error =((115107,9137-115200)/115200)*100% = -0,08%
U1MCTL = 0xAA;
// Modulation 0b10101010

U1CTL &= ~SWRST;                 // Initialize USART state machine

von mspmarkus (Gast)


Lesenswert?

Nach dem Fehler auf der Graphik läuft alles wieder rund bis zum 
nächsten. Nur diese 2 Byte sind falsch!

von Noname (Gast)


Lesenswert?

Zeig am besten mal kompletten Code. Das Forum ist voll von Fragen die 
"daran kann es nicht liegen" enthalten. Die Ursachen können vielfältig 
sein. Du willst nicht wirklich die ganze Liste lesen und wir wollen sie 
nicht wirklich aufstellen.

von Noname (Gast)


Lesenswert?

Noch ein Tip. Reduziere den Code bis auf das Wesentliche. Also alles 
rausschmeissen, was nicht nötig ist, bzw. solange streichen, bis der 
Fehler nicht mehr auftritt bzw. nicht mehr relevant sein würde. Meist 
ist das auch ein guter Hinweis, woran es liegt.

Umgekehrt: mach doch mal mit den gezeigten Einstellungen einfach eine 
Schleife die immer dieselbe Zahl resp. eine aufsteigende Folge von 
Zahlen ausgibt.

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

sendest du deine Testdaten ohne Unterbrechung?
Wenn ja, dann könnte die Baudratenabweichung von ca. 0,6% dazu führen, 
das nach einer größeren Anzahl von Bytes ein Bitfehler auftritt.
Nimm mal eine kleinere Baudrate, die sich evl. mit weniger Fehler 
realisieren lässt, oder mache nach der Übertragung eines Datensatzes 
eine Pause.

Sascha

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.