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!!
Hoppla hab vergessen die Zahl im Betreff einzufügen... Naja hoffe der Text erklärt das Problem ;)
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
Nach dem Fehler auf der Graphik läuft alles wieder rund bis zum nächsten. Nur diese 2 Byte sind falsch!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
