Forum: Mikrocontroller und Digitale Elektronik MSP430 RXBUF --> Array --> Auswerten = Problem - Hilfe


von Bort M. (bort)


Lesenswert?

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.

von szimmi (Gast)


Lesenswert?

Kannst Du mal relevante Teile des Codes posten?

von Bort M. (bort)


Lesenswert?

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
}

von Ampfing (Gast)


Lesenswert?

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

von szimmi (Gast)


Lesenswert?

Hiho,
vor allem ist interessant, was Du in dem CheckPackage so treibst...

von Bort M. (bort)


Lesenswert?

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.

von Berti (Gast)


Lesenswert?

ja Check package wäre spannend... ich tippe auf ein readers - writers 
Problem

von Bort M. (bort)


Angehängte Dateien:

Lesenswert?

Oki :-). Ich wette das ist nur ein kleiner Idiotenfehler ;-(.

Grüße.

von Jörg S. (Gast)


Lesenswert?

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"?

von Bort M. (bort)


Lesenswert?

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 ;-)

von szimmi (Gast)


Lesenswert?

Hmm, noch eine andere Idee. Mag sein, dass der Stack überläuft und in 
Deinen Variablen rumschreibt. Kannst Du mal das Mapping-File posten?

von Bort M. (bort)


Angehängte Dateien:

Lesenswert?

ist das das richtige? Sry, bin ein Neuling ;-).

Im übrigen funktioniert alles einwandfrei, insofern ich KEINE 
debug_printf Funktion in der CheckPackage Routine verwende....

von szimmi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.