Re: Zeitmessung Kategorie: Programmierung (von André H. - 13.03.2004 12:51) | ||
Als Antwort auf Zeitmessung von ChristianK - 12.03.2004 22:04 | ||
| ||
Hallo Christian, Ich sehe zwar nicht, wo Du genau die Zeitwerte herbekommst, jedoch solltest Du bei Zeitmessungen, bei denen die Genauigkeit besser als 1sek. sein mu� immer den Systemtimer benutzen. Da� Dir das Auskommentieren der LCD-Ausgabe gut eine sek. bringt, glaube ich Dir gern. Denn Du schreibst wahrscheinlich nonstop auf das Display ohne gro�e Pause zwischen den Ausgaben. (Wie gro� ist sleep messpause; ?) Normal reicht es immer Displayausgaben nur 4 bis 5 mal pro Sekunde zu machen. Dementsprechend könnte man dies Abfangen. (z.B. alle x Schleifendurchgänge eine Ausgabe oder den timer benutzen.) Aber hier eine vereinfachte Funktion zur Zeitmessung: function zeitmess(long timeout/*in ms*/) returns long {long timer,lcdtimer; lcdtimer=system.timer(); timer=system.timer(); // Start Zeitmesung loop { // Programmcode während der Messung //... if lcdtimer-system.timer()<=0 { lcdtimer=system.timer()+200; // LCD-Ausgaben während der Messung alle 200ms // ... } if system.timer()-timer>=timeout or <Stopbedingung(en)> { timer=timer-system.timer(); break; // Timeout, Schleife verlassen } } return timer; // Hier z.B. Zeitdauer in ms zurückgeben } MfG André H. > Hallo zusammen, > > ich habe Probleme eine einigermassen genaue Zeitmessung hinzukriegen. > auf 100msec genau würde reichen. > Hier die Messfunktion: > > > function strom_messen(string richtung) returns int > { > halt write_timedate; > long summe; > messungen = 1; > summe = 0; > messzeit = messpause; // Vorlauf von Vorprogramm > strom_maxwert = 0; > string_out(3,2,richtung); > strom = ports.adc(div.messport) - div.strom_offset; > if strom > (strom_grenzwert+ 150) return 999;// Abbruch, Kurzschluss ?? > rblcd.clear(); > strom_out(2, 10, strom_grenzwert); > string_out(3, 2, richtung); > loop > { > strom = ports.adc(div.messport) - div.strom_offset; // Strommessung > if strom > strom_maxwert > strom_maxwert = strom; > // rblcd.delline(2); > //strom_out(2, 0, strom); // Stromwert anzeigen > //strom_out(2, 10, strom_grenzwert); > //rblcd.goto(4,0); > //rblcd.bargraph(strom/2, 100); > messungen = messungen + 1; > summe = summe + strom; > if math.abs(messzeit - time_wait) < 220 // ZwischenTest, schaltet Switch ? > { > if endschalter_status()==1 // > { > div.fehlercode = 1; // Falsche Richtung ?? > break;// > } > } > if messzeit - time_wait >320 // Messzeit > Wartezeit - 200 msec > and endschalter_status()==1 break;//Break wenn Endschalter ein > sleep messpause; > messzeit = messzeit + messpause; > } > messzeit = messzeit + 2*messpause; > resume write_timedate; > return summe/messungen; //Mittelwert zurückgeben > } > > Ich habe schon verschiedenes ausprobiert, die auskommentierten Zeilen LCD-Anzeigen > brachten eine gute Sekunde. Priorität des threads hochsetzen hat auch nicht viel gebracht. > Eine externer thread mit Zeitmessung brachte auch nicht viel. > Ich liege immer noch etwa 1 Sekunde unter dem tatsächlichen Wert. > Hat jemand eine Idee wie ich das genauer hinkriegen kann ?? > Danke für jeden Tip. > > MfG > ChristianK Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: Zeitmessung (von ChristianK - 13.03.2004 21:49) |