Hallo Liebe Leute, ich programmiere seit kurzem an einem MSP430F149 und bin nun auf ein Problem gestoßen, welches ich nicht direkt verstehe und wobei ich bitte eure Hilfe bräuchte :). Undzwar folgendes: IDEE: Ich empfange über den UART ein Paket und werte es danach aus. REALISIERUNG (verbal): 1) Normales einlesen aus dem RXBUF in ein Arry in einer Interrupt Routine 2) Starten eines Timers, sobald für zB 1 sec kein Byte empfangen wurde Sendung als komplett ansehen und in den Interruptroutine des Timers hüpfen 3) Dort dann die Auswertung des Paketes aufrufen und dieser Routine einen Zeiger auf den Speicherbereich übergeben. PROBLEM: Der empfang funktioniert wunderbar, solange ich keine Routine "Auswerten" eingefügt habe. Sobald ich dies jedoch tue, steht in den Empfangsarray nur durcheinander oder fehlende Werte.... Die Frage ist nun, ist das ein grundsätzliches Verständnissproblem meinerseits, oder kann ich im Code etwas falsch gemacht haben und die Idee müsste grundsätzlich gehen. Falls ja suche ich gerne mal alles relevante zusammen und poste es :-). Es ist halt nur komisch, da es alles funktioniert sobald ich die Routine auskommentiere (das einlesen!), diese aber nicht direkt das einlesen beeinflusst!? Vielen Dank und Grüße, Bort.
Kannst Du mal relevante Teile des Codes posten?
Oki, habs schnell mal zusammengesucht, das wichtigste zumindest ;). Der Fehler liegt dort unten an dem "CheckPackage". Ist es drinnen, steht nur schrott im rxbuf_uart1, ist es draußen geht alles wunderbar.... und ich meine vor dessen Aufruf, dh die Routine ansich hat noch gar nix gemacht und dennoch beeinflusst sie den buffer :(. Grüße
1 | unsigned char rxbuf_uart1[255] = {0}; |
2 | |
3 | |
4 | void handle_usart1rx_interrupt(void) __interrupt[USART1RX_VECTOR] |
5 | {
|
6 | |
7 | rxbuf_uart1[k1] = U1RXBUF; |
8 | k1++; |
9 | start_timer_uart0(); |
10 | |
11 | }
|
12 | |
13 | |
14 | void start_timer_uart0(void) |
15 | {
|
16 | TACCTL1 = CCIE; // CCR0 interrupt enabled |
17 | TACCR1 = 3276; |
18 | TACTL |= TACLR; // Timer zurücksetzen |
19 | }
|
20 | |
21 | |
22 | void interrupt_timer_uart0(void) __interrupt[TIMERA1_VECTOR] |
23 | {
|
24 | |
25 | CheckPackage(rxbuf_uart1,k1); |
26 | |
27 | k0=0;k1=0; |
28 | |
29 | }
|
Hallo Bort, also, das ist mir aufgefallen: - Wieso stellst Du den Timer erst ein und machst dann einen Reset? Der setzt - wenn ich mich nicht täusche - doch auch den Zählerstand zurück, oder? - Was ist k0? - Wo startest Du den Timer? - Woher weißt Du, dass im Buffer nur Schrott steht? Viele Grüße
Hiho, vor allem ist interessant, was Du in dem CheckPackage so treibst...
Hallo, also das mit dem Timer soll so ablaufen: Sobald er ein Zeichen per UART empfängt soll er gestartet und zurückgesetzt werden. Wenn er dann wieder ein Zeichen innerhalb der Ablaufzeit empfängt sol das Zählregister gelöscht werden und der Timer von neuen anfangen (mir fiel da nix besseres ein ;-)), bis die Pause lang genug war und er in der ISR ausgeschalten wird, bis zum nächsten Paket. k0 ist die Zählvaribale für den UART0, hatte ich vergessen rauszunehmen. Ich habe einfach mal einen "Halt Punkt" vor dem Aufrufen der Check Routine gesetzt und mir den Speicher angesehen. D.h. bevor ich in die Routine gesprungen bin. Und wenn sie auskommentiert war ging alles, ansonsten nicht.... Ich hatte auch schon Interrupts ausgeschalten und geschaut ob es daran liegt, nix.... also ich sehe wahrscheinlich den Wald vor Bäumen ned :(. Meine Ideen was es evt sein könnte: 1) Speicherüberschreiben durch die Routine? 2) Headerdateien Problem? 3) kA Danke und Grüße :-). EDIT: In dem Checkpackage Werte ich dann eigentlich nur das Paket aus. Das mache ich, indem ich der Routine einen Zeiger auf den Speicherbereich gebe. Darin rumschreiben tu ich nicht, nur lesen und je nach empfangenem Paket versch, Texte ausgeben.
ja Check package wäre spannend... ich tippe auf ein readers - writers Problem
Oki :-). Ich wette das ist nur ein kleiner Idiotenfehler ;-(. Grüße.
Setzt doch nal ein Breakpoint bevor er CheckPackage aufruft. Sind da die Daten noch OK? Ist eigentlich k1 auch noch OK oder ist dieser Wert dann auch "durcheinander"?
Habe nen Breakpoint vor dem Aufruf schon gesetzt, es ist alles durcheinander bevor! er die Checkpackage aufruft. Sowie k1 als auch der rxbuf_uart1. Das ist ja gerade das komische an der ganzen Sache.... er greift nichtmal auf die Routine zu und dennoch spinnt das einlesen rum, bricht manchmal vorzeitig ab etc. Hab ich evt was an der Einleseroutine falsch? am Timer? Geht das so nicht? Aber ich habe das auch alles schon anders probiert, hatte auch nix geholfen... :-( EDIT: geht nicht: CheckPackage(); geht: //CheckPackage(); ;) ;) ;) EDIT2: Kann es sein, dass die debug_printf was mit dem Problem zu tun haben? Ich habe grade mal sukzessiv einige Stellen auskommentiert und voila, es ging..... strange... ich muss noch viel lernen ;-)
Hmm, noch eine andere Idee. Mag sein, dass der Stack überläuft und in Deinen Variablen rumschreibt. Kannst Du mal das Mapping-File posten?
ist das das richtige? Sry, bin ein Neuling ;-). Im übrigen funktioniert alles einwandfrei, insofern ich KEINE debug_printf Funktion in der CheckPackage Routine verwende....
Sieht eigentlich ganz gut aus. Glaube nicht, dass es da Überläufe gibt. Jetzt hab ich auchmal ne dumme Frage :-) Verwendet die debug_printf auch UART0 ? Ich bin mir nicht ganz sicher, wie das debug_printf implementiert ist. Aber wenn diese Funktion und Dein Programm auf derselben Schnittstelle werkeln, wird's sicher interessant...
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.