Forum: Mikrocontroller und Digitale Elektronik unidirektionales RS232 Problem


von Matthias (Gast)


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.

von Pete K. (pete77)


Lesenswert?

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

von Matthias G. (matze84)


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

von Ralf (Gast)


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

von tastendrücker (Gast)


Lesenswert?

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

von Matthias G. (matze84)


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..

von gast (Gast)


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

von Peter (Gast)


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.

von Matthias G. (matze84)


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

von gast (Gast)


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.

von tastendrücker (Gast)


Lesenswert?

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

von Matthias G. (matze84)


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"

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.