TTimer zu ungenau - wie funktioniert der EpikTimer?

Für Fragen von Einsteigern und Programmieranfängern...
Eva
Beiträge: 11
Registriert: Di 7. Aug 2012, 10:17

TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von Eva »

Hallo zusammen,

ich (Studentin im Forschungspraktikum) programmiere gerade ein kognitionspsychologisches Experiment, bin aber eher noch eine ziemliche Anfängerin.

Mein Problem: Für das Experiment brauche ich eine sehr genaue Zeitmessung, der TTimer kann das leider nicht leisten. Ich bin jetzt auf den EpikTimer gestossen, hab ihn auch schon installiert, habe aber keine Ahnung, was ich mit ihm anstellen muss, damit er in etwa dies macht:

Erst 1000 ms gar nichts anzeigen, dann 100 ms ein Fixationskreuz (.bmp), dann 100 ms wieder gar nichts, dann 200 ms einen Stimulus (.bmp) und dann wieder von vorn. Außerdem will ich bei Tastendruck die Zeit (in ms) messen.

Mit dem TTimer löse ich den Ablauf bisher so (Phase1 wird bei Klick auf Button ausgelöst, gesteuert durch einen TTimer):

Code: Alles auswählen

procedure TForm1.Timer1Timer(Sender: TObject); // Timer Phase 1
begin
  Phase1;
end;
 
procedure TForm1.Phase1; // Phase 1
begin
  Inc(x);
 
  if x=1 then
  begin
    Timer1.Interval:=1000;
    Image1.Visible:=False;
    Image2.Visible:=False;
    Inc(y);
  end;
 
  if x=2 then
  begin
    Timer1.Interval:=100;
    Image1.Visible:=True;
    Image2.Visible:=False;
  end;
 
  if x=3 then
  begin
    Timer1.Interval:=100;
    Image1.Visible:=False;
    Image2.Visible:=False;
  end;
 
  if x=4 then
  begin
    Timer1.Interval:=200;
    Image1.Visible:=False;
    stim[i]:=stimlist[3];
    Image2.Picture.LoadFromFile(stim[i]+'.bmp');
    Image2.Visible:=True;
    t1:=timeGetTime;
  end;
 
  if x>4 then
  begin
    x:=0;
  end;
 
  if y>MAXTRIAL_1 then
  begin
    Inc(z);
    Form1.Caption:='Pause.';
    GroupBox2.Visible:=True;
    Timer1.Enabled:=False;
  end;
 
  if z=MAXBLOCK_1 then
  begin
    Label1.Caption:='Weiter zu Teil 2?';
    Button2.Caption:='OK';
  end;
 
end;


Wäre toll, wenn mir jemand helfen könnte!

1000 Dank und liebe Grüße,
Eva

Benutzeravatar
theo
Beiträge: 8452
Registriert: Mo 11. Sep 2006, 19:01

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von theo »

Willst du nicht lieber mit sleep arbeiten? Es passiert ja nichts, in den Pausen, oder?

http://www.freepascal.org/docs-html/rtl ... sleep.html

Application.Processmessages braucht's vorher vllt.

Eva
Beiträge: 11
Registriert: Di 7. Aug 2012, 10:17

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von Eva »

Hallo!

Doch, es soll ja auf den Stimulus reagiert und dann die Zeit gemessen werden. Sleep geht leider nicht. Außerdem brauche ich eine *sehr* exakte Zeitmessung, da die Effekte (Unterschiede zwischen Versuchspersonen) sich im Bereich von ca. max. 20 ms bewegen - da ist zu viel Varianz in der Messung schlecht.

Der EpikTimer scheint mir da schon der Richtige zu sein, nur weiß ich nicht, wie der funktioniert ...

Danke nochmal,
LG, Eva

mschnell
Beiträge: 3418
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von mschnell »

Das wird alles nicht zuverlässig funktionieren !

In einem nicht-Realtime-Betriebssystem (Windows und "normales" Linux) kann ein User-Programm durch irgendwelche Betriebssystem-interne Vorgänge beliebig lange aufgehalten werden. Messen Zeiten messen mit vorgegebener Genauigkeit geht nicht.

Für Linux könntest Du einen Device-Treiber (in C) schreiben. und mit dem User-Pascal-Programm steuern. Der ist da besser, aber immer noch nicht zuverlässig.

Wenn Du das wirklich brauchst, musst Du einen Realtime-Zusatz zu Linux installieren, oder (besser) irgendwelche Hardware an den PC koppeln und die Realtime-Bearbeitung da machen. Ich würde einen PIC24 nehmen und ihn per USB koppeln, da braucht man außer dem Chip fast nichts an Hardware. Aber das ist Geschmackssache.

-Michael

Benutzeravatar
theo
Beiträge: 8452
Registriert: Mo 11. Sep 2006, 19:01

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von theo »

Eva hat geschrieben:Außerdem brauche ich eine *sehr* exakte Zeitmessung, da die Effekte (Unterschiede zwischen Versuchspersonen) sich im Bereich von ca. max. 20 ms bewegen - da ist zu viel Varianz in der Messung schlecht.


Das wird so nicht sehr zuverlässig sein. Da hat mschnell schon recht (Stichwort Realtime)
Der Tastendruck wird vom normalen Betriebssystem "bei Gelegenheit" bearbeitet.

Scotty
Beiträge: 770
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von Scotty »

Mit sleep wird auch nur eine Genauigkeit von maximal 10-50ms erreicht (je nach OS), die zudem auch noch unvorhersagbar abweichen kann (Multiprocessing). (Ganz davon abgesehen, dass die Eingaben noch weniger genau erfasst werden können.) Unter Psychologen ist es üblich, dass fertige Tools genutzt werden, z.B. Presentation für Neurowissenschaften (1,2), und man dann einfach darauf vertraut, dass dort alles richtig gemacht wird :?
Wenn du die hohe Genauigkeit nicht brauchst, dann langt ein sleep, wie theo vorgeschlagen hat. Ansonsten kannst du gettickcount nutzen und das noch in einen Thread packen, was der EpikTimer IMHO so macht (den ich allerdings nicht kenne). Fpc hat solch einen Zeitmesser auch dabei: fpTimer (3). Der hat die Eigenschaft Intervall (in ms) und liefert ein OnTimer-Event. Frag nach, wenn du ins Detail gehen willst.

[1] http://www.neurobs.com/menu_presentatio ... s_overview
[2] http://en.wikipedia.org/wiki/Comparison ... t_software
[3] http://www.freepascal.org/docs-html/fcl ... index.html

Eva
Beiträge: 11
Registriert: Di 7. Aug 2012, 10:17

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von Eva »

Im schlechtesten Fall ist das wohl so, dass alles nichts taugt. Ich würd mir die Sache mit dem EpikTimer allerdings trotzdem gern mal anschauen ...

Angeblich ist es ja so:
Für eine nanosekundengenaue Zeitmessung wird eine Intel-Pentium-kompatible CPU mit einem "Timestamp Counter" benötigt.
Eine mikrosekundengenaue Zeitmessung wird auf allen Systemen unterstützt.
http://wiki.freepascal.org/EpikTimer/de

Hmmm.

u-boot
Beiträge: 300
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von u-boot »

Keine Ahnung wie der EpikTimer funktioniert. Aber vor dem Einsatz muss man sich Gedanken machen, welche Zeit er erfassen wird.
Wenn also der tastendruck halt irgendwo mal irgendwann nach dem auslösen der Taste abgearbeitet wird... dann wird epiktimer halt die zeit bis zur Abarbeitung messen und nicht wie von dir gewünscht bis zum Tastendruck.

Inwiefern die Geschwindigkeit der Ausgabe deiner Bilder da noch eine Rolle spielt weiss ich nicht.... aber in deine Überlegung sollte es sicher mit rein.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Benutzeravatar
theo
Beiträge: 8452
Registriert: Mo 11. Sep 2006, 19:01

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von theo »

Das ist vllt. auch noch interessant:
http://psytoolkit.leeds.ac.uk/time.html

corpsman
Beiträge: 1122
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus SVN Trunk, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von corpsman »

Zum anzeigen der Bilder würde ich OpenGL nehmen, dann hast du die Graphiken bereits auf der Grake und kannst sie schneller "an" und wieder "aus" machen. Prinzipiell bleibt aber das Problem, dass dein Betriebsystem deine Anwendung beliebig lang nicht bearbeitet und damit deine Zeitmessung "verschleift". Eine Lösung könnte da ein µ-Controller sein, denn du dann extern betreibst mit einem geeeigneten Display. Leider ist das dann aber nicht mehr mit Lazarus machbar ( zumindest soweit mir bekannt ist ).
--
Just try it

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von Bora4d »

.
Zuletzt geändert von Bora4d am Do 16. Aug 2012, 15:36, insgesamt 1-mal geändert.

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von Bora4d »

.
Zuletzt geändert von Bora4d am Do 16. Aug 2012, 15:36, insgesamt 1-mal geändert.

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von Bora4d »

.
Zuletzt geändert von Bora4d am Do 16. Aug 2012, 15:37, insgesamt 1-mal geändert.

mschnell
Beiträge: 3418
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von mschnell »

Bora4d hat geschrieben:Solange du Marsrover nicht steuerst,

Das kannst Du nicht beurteilen. Es hängt von der Anwendung ab und ist sehr schwer abzuschätzen.

Wie gesagt: Das Timing in einem User-Programm ist bei Windows und Desktop-Linux beliebig ungenau. Groß´e Fehler treten aber relativ selten auf. Es hängt also von der Aufgabenstellung ab, ob man damit arbeiten kann. Jede einigermaßen professionelle Mess-Aufgabe ist damit unmöglich.

Eva hat explizit gesagt, dass sie sehr genau messen will !

-Michael

mschnell
Beiträge: 3418
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: TTimer zu ungenau - wie funktioniert der EpikTimer?

Beitrag von mschnell »

Bora4d hat geschrieben:dann hast du kein Probleme mehr mit Zeitmessung und TTimer.


Völliger Unsinn !!!!

Das Betriebssystem kann aus internen Gründen jedes Programm jeder Zeit beliebig lange aufhalten.

-Michael

Antworten