mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430F1611 USART Probs große Datenmengen


Autor: Verwickler (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich habe folgendes Problem. Ich habe eine MSP430 Platine mit einer 
Externen Gerätschaft verbunden. Diese externe Gerätschaft schaufelt in 
periodischen Abständen ca. 2000 Byte bei 115200 Baud über die RS232 
Schnittstelle raus.
Diese Daten solle jetzt einfach empfangen werden und auf die 2e USART 
Schnittstelle   meiner MSP430 Platine durchgereicht werden. so weit so 
gut ... vom Prinzip her  funktioniert das ganze auch ... jedoch habe ich 
das Problem dass nicht alle Daten auch hinten ankommen, der MSP430 
sozusagen einfach Daten verschluckt.
Handshakeleitungen sind nicht vorhanden ... :(
Ich habe schon in meiner ISR einen Counter vorgesehen , welcher bei 
jedem Empfangenen Zeichen auf einen bestimmten Wert gesetz wird ( z.B 2) 
dieser counter wird in einem Timer einfach runtergezählt ... wird für 
eine gewisse Zeit kein neues Zeichen empfangen(counter auf Null) , so 
findet eine Ausgabe des gesamten Empfangsbuffers statt. 
(Zusatzabfragekriterium ... neue Daten empfangen! )
Eigentlich sollte das so funktionieren ... sollte ;O)
Das Problem dabei sind einfach die großen Datenmengen ... bei kleineren 
Datenmengen bis ca 200 Byte funzt es einwandtfrei ... die entsprechenden 
Buffer sind auch groß genug ausgelegt ... (RAM des MSP430 10 kByte).
Habt ihr da vielleicht eine Idee wie ich solch großen Datenmenge handlen 
kann ...
Im Anhang noch der Quellcode für die USART Routinen und die Abfrage 
evtl. emfangener Daten.


mfG

der Verwickler

Autor: Sym (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beide Interfaces haben nur nominell die gleiche Geschwindigkeit. Kannst 
du sicherstellen, dass es keinen Bufferover bzw. underflow gibt?
Deine Beschreibung deutet nämlich darauf hin.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hört sich fuer mich auch so an.

Fragen:

-Globale Variablen 'volatile'????
Warum ist 'TXBUF0              = RXBUF1;' auskommentiert???
Funktioniert es denn wenn du in der ISR nur diese Zeile hast? Das wuerde 
bewirken, dass die empfangenen Daten sofort wieder rausgehen, allerdings 
musst du beim Senden der einzelnen Bytes nen kleinen Delay einbauen um 
dem "Durchschleuss MSP" die moeglichkeit zu geben die ISR sauber und 
ohne Timing Probleme abzuarbeiten.

Sollte das Funktionieren liegts an deinem Programm und nicht am MSP.

Tipp: schon mal ueber die Verwendung eines Ringpuffers nachgedacht??? 
Herr Fleury (in diesem Forum schon oefters erwaehnt) hat da ne schoene 
Library fuer AVR, die du portieren koenntest.

mfg

Alex

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann hier nicht einfach vom RXbuffer eines UARTS lesen und direkt in 
den TX Burffer des zweiten UARTS schreiben. Warum? Weil wie bereits 
gesagt die Datenraten nicht exakt identisch sind.

Beispiel. RS232 kann problemlos mit 1% Baudratenfehler arbeiten. Nehmen 
wir an, deine Datenquelle arbeitet mit +1% Fehler, dein MSP mit 0% 
Fehler. D.h. aber dass nach 100 vom MSP weitergereichten Zeichen deine 
Quelle schon 101 gesendet hat. Wo bleibt das eine Zeichen? Wenns richtig 
gemacht wird im Softwarepuffer.

Also muss der RX Interrupt die Daten in einen kleinen Softwarepuffer 
schreiben (FIFO) und der TX Interrupt sie daraus lesen.

MFG
Falk

Autor: S. Z. (szimmi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau das wird das Problem sein. Die Quelle schuettet Dich mit Daten mit 
größerer Baudrate (durch die Toleranz) zu, als das Du diese wegschaffen 
kannst.
Da führt kein Weg an einem Ringpuffer vorbei. Aber es muss natuerlich 
nach den 2000 Bytes genug Zeit sein, die "überschüssigen" Bytes noch zu 
senden, bevor das nächste Paket eintrifft. Kann man ja mal nachrechnen, 
RS232 funktioniert meines Wissens bis +/-5%.
Ich versuchs mal: Bei 115200, +5% Toleranze beim Senden sind die 2000 
Bytes nach 165ms beim MSP angekommen. Dein MSP hat nehmen wir mal worst 
case an -5% (aber da Du ja einen Quarz verwendest, ist das rein 
theoretisch), macht beim Senden der 2000 Bytes 182ms.
Du brauchst also mindestens 17ms zwischen den Paketen Pause,um überhaupt 
eine Chance zu haben.
Nichtsdestotrotz, Ringpuffer-rules.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ S. Z. (szimmi)

>RS232 funktioniert meines Wissens bis +/-5%.

RS232

Theoretisch bis +/-3%, real sollte man kleiner 1% nutzen.

MFG
Falk

Autor: Verwickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute !
Es funktioniert ... ich habe ein wenig an der Baudratenmodulation 
"rumgedreht" und den Empfangsbuffer geringfügig größer gemacht ... hatte 
mich da möglicherweise um ein paar Byte verzählt ;)
In jedem Fall werden jetzt alle 2000 Byte fehlerfrei rübergewuppt :)
Danke auf jeden Fall für die Vorschläge und Anregungen ...

der Verwickler

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.