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.
Stören sich vielleicht der Meßinterrupt und der Interrupt für RS232 ?
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
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
Und du überprüfst auch vor jedem Senden, ob das TX-Register frei ist (d. h. das vorige Byte komplett gesendet wurde)?
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..
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
> 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.
@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
>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.
Ich habe als Präambel z.B. 3 Bytes 0xAA gesendet (möglichst viele 010-Wechsel, da ich ohne Manchaster gesendet habe).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.