Hallo, ich lese 3-4 Analogwerte ein und möchte diese in Echtzeit auf dem PC in einem Diagramm sehen. Gibt es da eine Software für, die den Comport "ausliest" und wenn ja wie? Wie muss der µC senden? Toll wäre wenn ich die Variablen A-D senden könnte: A:24,21 B:151,26 C:45,23 D:0,25 A:24,25 B: C: D: und so weiter... Tobias
Die "Echtzeit" wird dabei immer "unechter" je feiner du die Auflösung für deine Werte machst. Da die serielle Schnittstelle nur bis max. 250 kbit/s schafft. Deine Auswertung der Messwerte (dieses A:24,21) etc. würde ich durch den PC durchführen lassen, denn der ist vermutlich um einiges schneller damit fertig als wenn der µc es macht. Du bräuchtest dann auf dem µc in einer Endlosschleife immer nur nacheinander Analog1 bestimmen, per RS232 senden, Analog2 bestimmen, senden, etc. und dann am PC mit einer Software in grafische(?) Daten umwandelt. Ansonsten, ein Programm, dass den Com-Port permanent überwacht ist z.B. Hyper-Terminal Schöne Grüße, Alex Edit: Mir ist da gerade noch was eingefallen: Unter der Annahme das du 10Bit A/D Wandler benutzt, würde ich dann für jeden Port (A,B,C,D) je 2Byte (=16Bit) senden, wobei die "freien" 6 Bit zur Identifikation des nun gesendeten Ports verwendet werden können. Die maximale Wiederholrate wäre denn demnach 5208 Hz je Port.
Schick die Werte als ASCII Code per RS232. Hyper-Terminal kann die dann auffangen und ind Textdatei speichern. Ab besten trenne die einzelne Kanäle mit einem TAB-Zeichen (bei printf-Befehl wäre das "\t") Ganze Messung schließe mit RET-Zeichen ("\r"). Dann hättest du in der Text-Datei die Kanäle schön in Spalten und die Messungen in Reihen angeordnet. Öffne danach Textdatei, kopiere die Daten und füge in eine Exel Tabelle Wegen TABs werden die Daten in einzelnen Zellen gespeichert: A B C D... 24,21 151,26 45,23 0,25 24,62 152,21... Mit dieser Datentabelle kannst du nun im Exel grafisches Diagramm erstellen und die Daten graphisch betrachten und abspeichern. Beispiel ind C für String Vorbereitung: char text[30]; //Array für Stringaufnahme sprintf(text,"%i\t%i\t\%i\t\%i\r", a, b, c, d);//Daten in einen String mit "TABs" und "RET" umwandeln printUart(text);//Ausgabe des Strings über RS232(Funktion selbst geschrieben)
@ Alex: Also mit "Echtzeit" habe ich etwas übertrieben. Wenn das Diagramm auf dem PC eine Sekunde verzögert angezeigt wird, wäre das auch nicht sooo schlimm. @ Andi: Tolle Idee mit dem Tab. Aber was ist denn das RET-Zeichen und wofür ist das gut? Ist das vielleicht ein allgemeines Zeichen für ENDE oder so? Also ich wollte auf jeden Fall im ASCII Code per RS232 senden. Wenn ich das mit dem Hyper-Terminal aufzeichne, kann ich das aber nicht sofort in Excel ansehen sondern erst, wenn die Messung zu ende ist... Und wie gesagt unbedingt als Kurvendiagramm, mit nur kurzen Verzögerungen.
Vielleicht kannst Du ja Deine Ausgabe an Logview anpassen (ist "Donationware"): http://www.logview.info Viele Grüße, Stefan
;-) ja die Software ist nicht übel, müsste man nur herausbekommen wie man die ansteuern muss... Aber nochmal zu den TAB´s: Der Befehl geht leider unter Basic nicht und ich konnte auch nichts in der Hilfe finden. Also bisher habe ich immer so gesendet: "Test1" als Text und H ist die Variable Print "Test1" ; H Tobias
Da musst Du keine Geheimnisse rausbekommen, das ist dokumentiert unter: Geräteliste -> Testformate -> Testformat Lader -> Testformat Datenlogger und das sieht auf einem mc sehr einfach zu implementieren aus. Wenn die Baudrate unpassend ist: ich verwende dann gern einen USB->RS232 Wandler, mit dem kann man der PC-Applikation eine Baudrate vortäuschen, während die "echte" Baudrate zum mc eine ganz andere ist (wer will heute schon noch mit 9600Baud arbeiten?). Gruß, Stefan
@Tobias TAB ist kein Befehl, sondern ein ASCII-Steuerzeichen. Du kannst es in Basic normalerweise mit CHR$(9) senden, also: PRINT "Test1"+CHR$(9)+"Wert" fügt zwischen "Test1" und "Wert" einen Tabulator ein. Mit RET ist weiter oben Return gemeint, ASCII 13, also in Basic CHR$(13). Eigentlich heisst es korrekt CR. Oft ist anschliessend auch noch ein LF (Line Feed; Zeilenschaltung) erforderlich, das ist ASCII 10. Severino
super! mit dem TAB werde ich gleich mal ausprobieren @Stefan fasse mal zusammen: - Daten kommen im Sekundentakt - 10V = 10000 im Datenformat - Erweiterungen sind ungenutzt: einfach 000 dezimal senden soweit ganz einfach...aber wofür steht: oben: 1-2-3-4-4-4 und: 1234567890 123456789 Die Buchstaben darunter ersetze ich durch meine Werte/Variablen und zum Schluss: <cr><lf> ??? Tobias ??? 1 2 3 4 4 4 12345678901234567890123456789012345678901234567 8 k;tttttt;UUUUU;IIIII;CCCCCC;PPPPPP;TTTTT;y;zzz<cr><lf> (48 Byte) k Kanalnummer tttttt Zeit in Sekunden (neuer Datensatz beginnt bei 0) UUUUU Spannung in mV IIIII Strom in mA CCCCCC Ladung in mAh PPPPPP digitaler Zähler TTTTT Temperatur in 0.1°C Schritten y Status dezimal (0 = laden, 1 = entladen, 2 = Pause, 9 = keine Aktion) zzz Erweiterungen (im Moment einfach 000 dezimal)
Also ich habe nun ein kleines testprogramm geschrieben welches jede sekunde die Spannung um 1 hochzählt. Aber leider funktiniert das nicht: im Hyper-Terminal sieht das schon ganz gut aus aber LogView sagt nix... Also gesendet wird: 'senden ;kanal ; Zeit ; Spannung ; Print ; K ; ";" ; Tttttt ; ";" ; Uuuuu ; ";" Strom ; Kapazität; Zähler ; ; Temp. ;Status ; Iiiii ; ";" Cccccc ; ";" ; Pppppp ; ";" ; Ttttt ; ";" ; Y ; ";" ; ;Erweiterung Zzz; '< Cr >< Lf> und das kommt auf dem Comport an: 1;0;0;0;0;0;0;9;0 1;1;2;0;0;3;0;0;0 1;2;4;0;0;6;0;0;0 1;3;6;0;0;9;0;0;0 1.Stelle Kanal 1: bleibt 2.Stelle Sekunden werden hochgezählt 3.Stelle Spannung immer +2 6.Stelle Drehzahl immer +3 8.Stelle Status bei Start auf 9, danach immer auf 0 nur weiß ich nicht was ich mit < Cr >< Lf> machen soll, naja und die zahlen darüber?: 1 2 3 4 4 4 12345678901234567890123456789012345678901234567 8 k;tttttt;UUUUU;IIIII;CCCCCC;PPPPPP;TTTTT;y;zzz<cr><lf> 1;0;0;0;0;0;0;9;0 1;1;2;0;0;3;0;0;0 1;2;4;0;0;6;0;0;0 1;3;6;0;0;9;0;0;0
>nur weiß ich nicht was ich mit < Cr >< Lf> machen soll, naja und die >zahlen darüber?: > 1 2 3 4 4 4 >12345678901234567890123456789012345678901234567 8 >k;tttttt;UUUUU;IIIII;CCCCCC;PPPPPP;TTTTT;y;zzz<cr><lf> Die Zahlen in den oberen beiden Reihen musst Du natürlich NICHT senden - die zeigen Dir nur die Ziffernstellen an (damit Du es beim Abzählen leichter hast): obere Reihe sind die Zehnerstellen, untere Reihe die Einsterstellen. <CR><LF> bedeutet "Carriage Return", "Line Feed" und entspricht den Zahlen 13 und 10 (dezimal) bzw. 0D-hex und 0A-hex. Siehe dazu auch: http://de.wikipedia.org/wiki/Zeilenvorschub Dein Problem ist wahrscheinlich, dass Deine Zahlen nicht die Stellenzahl haben, die das Format verlangt, sende mal statt 1;0;0;0;0;0;0;9;0 1;1;2;0;0;3;0;0;0 1;2;4;0;0;6;0;0;0 1;3;6;0;0;9;0;0;0 1;000000;00000;00000;000000;000000;00000;9;000 1;000001;00002;00000;000000;000003;00000;0;000 1;000002;00004;00000;000000;000006;00000;0;000 1;000003;00006;00000;000000;000009;00000;0;000 Jede Zeile muss dabei mit CR und LF abgeschlossen werden, siehe oben. Wie Du das Deinem Basic beibringst, weiss ich nicht. Zum Testen kannst Du ggf. einfach mal diese Strings an Logview senden. Gruß, Stefan
Sehr komfortabel ist Multimes. Deine 4 Daten kannst du in Multimes 4 auf jeweils eigenen Kanälen mitloggen. Du mußt die Ziffern dabei in Asci senden, das Datenformat ( Zeichenlänge , Trennzeichen usw. und alle Schnittstellenparameter sind frei kofigurierbar. Ich benutze es ständig in Verbindung mit uC. Display, Tabellen und Grafikdarstellung - wie du willst. Es muß aber eine Datensatz sein, also wertA Trennzeichen wertB trennzeichen wertC trennzeichen WertD datenabschlußzeichen Es stellt sich allerdings tatsächlich die Frage was du unter Echtzeit verstehst, ich glaube ich hab bisher so 3 Daten/sek geschafft, limitierend war das aber meine Messroutine, nicht das Programm.
@Stefan <CR><LF> bedeutet "Carriage Return", "Line Feed" und entspricht den Zahlen 13 und 10 (dezimal) bzw. 0D-hex und 0A-hex. ach so. Weiss jemand wie ich Hex Zeichen in Basic sendet? Habe das so versucht: Print "1;000013;08239;05010;000017;000252;00000;0;000" ;Hex(0a);Hex(0d) Aber da kommt immer eine Fehlermeldung vonwegen "Numeric parameter expected [0A]"
so nun hab´ ich´s gefunden.... Das muss ich gar nicht senden, weil das der µC von selber sendet! ;-) Also ist der Fehler gefunden: es sind die fehlenden NULLEN! so funktioniert es :-) Print "1;000001;08239;05010;000017;000252;00000;0;000" nur wie bekomme ich die Nullen in die Zahlen? Ich möchte ja eigendlich einen Analogport auslesen und das Ergebniss mit Nullen auffüllen.
Wie gesagt, ich programmiere nicht mit Basic. Probier doch mal, jede einzelne Deiner Zahlen mit STR$ (Zahl) in einen String umzuwandeln. Mit LEN (String) bekommst Du dann die Länge raus, und damit kannst Du dann ausrechnen, wieviel Nullen Du vorne noch anhängen musst. Zum Schluss setzt Du den String zusammen - alle Zahlen-Strings plus die Semicolons dazwischen. Das Ergebnis schickst Du dann an den PC. Bei basic-spezifischen Sachen musst Du mal andere hier fragen, ode Du liest Dir diese Seite durch: http://www.qbasic.de/ Dann auf Textverarbeitung - Manipulation von Zeichenketten (Strings) gehen. Gruß, Stefan
Ja super, String*6 ist das eine um max 6 Zeichen zu benutzen und dann: Test_in2 = Str(Test_in1) Tttttt = Format(Test_in2 , "000000") Print Test Danke ;-) kann geschlossen werden
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.