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!!
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.
>>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
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
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!
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
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
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.
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.
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