Hallo, ich versuche mit LabView über RS232 meinen Atmega8 (C) auszulesen als Temperaturlogger. Der µC misst die Temperatur (mit DS18S20) und schickt einen Datenstring an LabView zum Darstellen. Leider funktioniert dies mit meiner Lösung eher willkürlich. Diese lautet: LabView liest in einer While-Schleife jede Millisekunde die RS-232 Schnittstelle aus und wartet auf ein Startbyte. Wenn das Startbyte kommt springt LV aus der While Schleife in die nächste Sequenz und liest den Datenstring um ihn zu verarbeiten. Der µC misst die Temperaturen und sendet nach Deendigung der Messung erst das Startbyte und dann die Daten: put_string(ok); put_string(daten); Das Problem: LabView empfängt die Daten nicht im gleichem zeitlichen Abstand. Eine Messung dauert ca. 1,5 Sekunden, also müsste LV alle 1,5 Sekunden Daten bekommen, tuts aber nicht, mal passen die 1,5 Sek. dann sinds wieder 4 usw. Wie kann ich diesen Ablauf synchronisieren? Mir kommt es vor also bo LabView das Startbyte manchmal verpasst und sich der ganze Prozess erst nach einigen Messungen wieder einfängt. Über Hyperterminal geht alles wunderbar nur bei LabView läuft es eher zufällig. Interrupts fallen meiner Meinung nach als Lösung aus, da die Messung der TempSensoren nicht durch Interrupts gestört werden dürfen. Kann mir hier jemand behiflich sein? Ich denke ich bin nicht der erste mit dem Problem, hab aber bisher nichts dazu finden können. Danke sehr! Thomas
Thomas schrieb: > Der µC misst die Temperaturen und sendet nach Deendigung der Messung > erst das Startbyte und dann die Daten: > put_string(ok); > put_string(daten); Hallo Thomas , vielleicht mal nur so als Test - nur den datenstring mit angehängten CR oder LF senden , das OK brauchst Du doch eigentlich nicht , oder ? In dem Moment wenn die Daten OK sind sendet der Atmega sie einfach , sonst eben nicht. Und dem Labview mußt Du mitteilen das es den Lesebuffer ausliest wenn dort Daten sind , wie das aber einzustellen ist kann ich Dir leider nicht sagen . Ansonsten frag doch mal im Labview Forum danach. Gutes Gelingen und Grüße Michael
Ich mach das so wie im Anhang. Sobald Bytes eingelesen wurden und die Anzahl Zeichen (in meinem Beispiel mehr als 200) passt, dann werte ich aus (True case, nicht abgebildet) im anderen Fall warte ich 100ms (bei mir kommen alle 1s Werte). In den 100ms müssen dann natürlich alle 200 Zeichen bereits da sein (Baudrate beachten).
Herzlichen Dank für den Tipp Robo. Ich bin damit schon weiter gekommen. Ich habe jetzt nur noch das Problem, dass ich beim Starten des LV Programms immer direkt einen Overrun habe, der erst durch Continue klicken der Fehlermeldung behoben wird. Ich nehme an, dass sich bis zum Programmstart zuviele Daten angesammelt haben, da der µC ständig läuft. Wie kann ich das verhindern? Außerdem würde ich gerne direkt nach dem Empfang der Daten eine Antwort von LV an den µC senden. Dafür habe ich das Programm wie auf den Bildern gezeigt erweitert. Es geht aber so noch nicht. Meine Idee ist dabei folgende. Das senden eines Bytes (8N1, Baud 9600) dauert 1,04 ms. Meine Zeichenkette ist 15 Bytes lang. Es dauert also 15,6 ms bis der µC die Bytes gesendet hat und 15,6 ms bis LV sie gelesen hat, anschließende nach ca. 32 ms wird dann die Antwort gesendet, die der µC lesen soll. Im µC habe ich das so realisiert put_string(daten); // Daten senden _delay_ms(31); // 32 ms Warten get_string(stringbuffer); // Antwort lesen Das scheint aber nicht zu funktionieren. Ich habe immer noch nicht verstanden wie ich den Prozess synchronisieren kann. Die uart.c Datei ist im Anhang. Wenn noch mehr Code benötigt wird bitte melden. Danke für alle Tipps!
kleiner Nachtrag meine Kontroll LED in ISR(USART_RXC_vect) leuchtet wenn LV die Antwort sendet, ich komme aber irgendwie nicht an die Daten
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.