mikrocontroller.net

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


Autor: Bort M. (bort)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: szimmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst Du mal relevante Teile des Codes posten?

Autor: Bort M. (bort)
Datum:

Bewertung
0 lesenswert
nicht 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


unsigned char rxbuf_uart1[255] = {0};


void handle_usart1rx_interrupt(void) __interrupt[USART1RX_VECTOR]
  {

      rxbuf_uart1[k1] = U1RXBUF; 
      k1++;
      start_timer_uart0();
     
  } 


void start_timer_uart0(void)
{
  TACCTL1 = CCIE;                         // CCR0 interrupt enabled
  TACCR1 = 3276;
  TACTL |= TACLR;                        // Timer zurücksetzen
}


void interrupt_timer_uart0(void) __interrupt[TIMERA1_VECTOR]
{

  CheckPackage(rxbuf_uart1,k1);
 
  k0=0;k1=0;

}

Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: szimmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hiho,
vor allem ist interessant, was Du in dem CheckPackage so treibst...

Autor: Bort M. (bort)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Berti (Gast)
Datum:

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

Autor: Bort M. (bort)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Oki :-). Ich wette das ist nur ein kleiner Idiotenfehler ;-(.

Grüße.

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"?

Autor: Bort M. (bort)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: szimmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bort M. (bort)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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....

Autor: szimmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.