www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik unidirektionales RS232 Problem


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe folgendes Problem:

Ich habe ein kleines Protokoll geschrieben was es ermöglicht Daten in 
einem festen Rahmen von meinem Pic zum Pc zu senden. Die Übertragung 
erfolgt dabei unidirek. per Funk.

Auf dem Pc habe ich nun eine Anwendung geschrieben die mir die Daten je 
nach Byte, Integer, Float darstellen kann ohne das ich mir über das 
Hyperterminal alles einzeln herausrechnen muss.

Das ganze klappt auch wunderbar solange ich die Daten in eine Schleife 
packe die die Daten jeweils nach Abfrage des TX-Flags sendet. Sobald ich 
das ganze aber nur zu bestimmten Zeitpunkten schicke per Timer-Interrupt 
bekomme ich nur   Datenmüll und ab und zu dazwischen verwertbare Daten. 
Leider kann ich die Daten aber nur azyklisch senden, da die Hauptaufgabe 
des uC in der Werteerfassung und Regelung liegt die mit 200Hz arbeiten.

Was kann ich machen um einen kontunuierlichen Stream zu bekommen? Die 
Daten sollen mit 1200-4800 baud je nach Entfernung übertragen werden. 
Der Einfachheit halber aber zuerst einmal fest mit 2400baud.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stören sich vielleicht der Meßinterrupt und der Interrupt für RS232 ?

Autor: Matthias G. (matze84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Messung erfolgt im Hauptprogramm und wird bis der Timerinterrupt(zur 
Regelung) eintrifft gemittelt. Die Regelung erfolgt dann im 200Hz Takt, 
und in diesem dann auch die UART Ausgabe.
Leider brauche ich aber bald noch einen Interrupt zum Input Capture der 
Fernsteuerungs PPM und dann wird es wohl noch schwieriger. Aber mit dem 
jetzigen TimerInt allein müsste es doch eine Möglichkeit geben?

Wenn ich das Senden in die main() packe funktioniert es schon besser 
aber dann trifft ja auch alle 5ms der (Stör)Interrupt ein.. es scheint 
als müssten die Daten kontinuierlich gesendet werden, d.h. Byte an Byte

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
200Hz = 5ms
2400 = (1/2400) * 10 Bit = 4,x ms

Wartest du denn auch ab, ob das Senden abgeschlossen wurde oder pustest 
du einfach das nächste Byte raus?

Ralf

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und du überprüfst auch vor jedem Senden, ob das TX-Register frei ist (d. 
h. das vorige Byte komplett gesendet wurde)?

Autor: Matthias G. (matze84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, nach jedem Sendebefehl folgt ein while(!TXINT)

Polle ich zyklisch, also eine Schleife die nur sendet funktioniert das 
ganze ja. Nur wenn ich zu bestimmten Zeitpunkten senden will geht es 
nicht.... z.B. 200Hz statt 240Hz(bei 2400baud und je 10Bit)

@tastendrücker
ich überprüfe -nach- jedem Byte und nicht vorher, aber sollte ja kein 
unterschied machen oder? Da das letzte ja erstma übertragen sein muss 
bevor es weiter geht..

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du eine einfache Funkstrecke hast, und Pausen während der 
Übertragung entstehen, solltest Du vor deinem Datenpaket eine Präambel 
mitschicken, sonst wird das erste Zeichen verschluckt.
http://www.funkmodul.com/datei/pdf/app6.pdf

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich überprüfe -nach- jedem Byte und nicht vorher, aber sollte ja kein
> unterschied machen oder? Da das letzte ja erstma übertragen sein muss
> bevor es weiter geht..
Kosten dich aber mehr Zeit, denn während das Wartens kannst du nichts 
anderes machen. Wenn du es vorher prüfst ist es wahrscheinlicher das es 
schon gesendet ist weil ja mehr zeit seit dem letzen Senden vergangen 
ist.

Autor: Matthias G. (matze84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter
stimmt, so hab ich das noch nicht gesehen

@gast
danke für den Link, aber durch mein sync byte was immer zu anfang 
mitgeschickt wird würde das ja diese Präambel ergeben. wusste auch 
garnicht das dies im manchester code erfolgen sollte, zum glück geht es 
auch ohne(oder der sender/empfänger hat dies schon implementiert) bis zu 
150m

Aber wie kann ich ein Datenpaket schicken, wenn dies schon nach dem 
ersten Byte vom TimerInt ausgenockt wird? 200Hz Regler<-> 240Hz TX

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>aber durch mein sync byte was immer zu anfang
>mitgeschickt wird würde das ja diese Präambel ergeben.
Nö, wenn der Empfänger eben genau diesess Sync-Byte nicht richtig 
erkennt.

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe als Präambel z.B. 3 Bytes 0xAA gesendet (möglichst viele 
010-Wechsel, da ich ohne Manchaster gesendet habe).

Autor: Matthias G. (matze84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
d.h. nach längerer Pause immer eine Präambel mitsenden (also 0xAA bzw. 
0x55), heißt das jedesmal wenn die Daten nicht kontinuierlich fließen? 
Das würde ja heißen ich müsste dann jedesmal 3Byte umsonst schicken... 
lieber wäre mir eine Möglichkeit die Daten kontinuierlich zu schicken um 
das zu vermeiden und trotzdem den Regler bei 200Hz laufen zu lassen. Die 
Präambel würde ich dann z.B. alle 100Bytes mitsenden, falls der String 
"abreisst"

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.