Hallo LV-Gemeinde!
Ich sitze leider immer noch an meinem kleinen Projekt, die NI-7811R für eine Experimentsteuerung zu programmieren. Das Grundgerüst steht und funktioniert auch ganz gut. Leider hab ich ein Problem, an dem ich nicht weiterkomme und hoffe, dass mir hier vielleicht jemand weiterhelfen kann.
Zunächst aber erst einmal die Grundidee:
Wie ich schon angedeutet habe, möchten wir die FPGA-Karte für das Timing unseres Experimentes nutzen. Von den 160 digitalen Ausgängen sollen 64 für die Pulserzeugung verwendet werden, die dann quasi Trigger für externe Geräte darstellen. Desweiteren sind seitens mir 8 Kanäle als Triggereingänge vorgesehen. Das bedeutet, die Pulsabfolge kann durch eine Warte-Funktion unterbrochen werden, die nur dann die Abarbeitung weiterlaufen lässt, wenn ein bestimmter Triggerzustand anliegt.
Eine dritte Funktion soll das Abarbeiten intern von Schleifen sein, um einzelne Sequenzen wiederholt laufen zu lassen. Das wäre dann lediglich eine interne Verarbeitung.
Soweit so gut und ich hoffe ihr konntet bis dahin folgen.
Die bisherige Umsetzung (ich werde das eine oder andere Bild am Ende noch mit ranhängen):
Ich sagte ja bereits, dass die Karte intern mit 4 Befehlen umgehen muss:
Stop - beendet die Ausführung der Karte
Jump - springt intern zu einem Befehl vor oder zurück
Wait - wartet auf einen definierten Zustand an den 8 Triggereingängen
Time - setzte die digitalen Ausgänge wie gewünscht und wartet eine bestimmte Zeit
Hier ein einfaches Beispiel für eine Befehlsabfolge:
0) Time 10us DO 1 = low, DO 2 = high,...
1) Time 05us DO 1 = high, DO 2 =low,...
2) Time 50us DO 1 = low, DO 2 = low,...
3) Jump zu Befehlsdefinition 0, mache das 2x und mache dann weiter
4) Time 01us DO 1 = high, DO 2 = high,...
5) Time 25us DO 1 = high, DO2 = low,...
6) Wait DI 1 = low, DI = low, DI =high, ....
6) Time 30us DO 1 = low, DO 2 = low,....
7) Stop
Ok, alle Informationen die für die Auswertung benötigt werden verstecke ich in 4 verschiedene vorzeichenlose 32-bit Zahlen (eine Control Information, eine für den Zustand von 4 Ports auf einem Connector, das gleiche nochmal für einen 2 Connector...). Weiterhin enthalten bestimmte Bits einer Zahl dann bestimmte Informationen. Beispielweise b[01:00] bestimmt welche Funktion ausgeführt werden soll usw.
Prinzipiell funktioniert auch alles recht super, bis auf eine Kleinigkeit mit grosser Bedeutung. Und zwar die Zeitauflösung. Gewünscht ist, dass die kleinste Zeiteinheit und somit der kleinste Puls 1us ist. Kleiner wollen wir gar nicht haben, allerdings scheiter ich da dran. Egal wie ich es drehe, wenn ich ein Puls von 1us erzeugen will ist dieser stets um die 300 bis 500ns länger. So wie ich das sehen konnte und zwar konstant bei allen Zeitdefinitionen.
Ich habe auch nun schon eine 2 Variante der Umsetzung des Konzepts versucht, wo ich dachte, dass könnte vielleicht bisschen was rausholen. Aber auch das war ohne Erfolg. Deshalb werde ich diese erst einmal zurückhalten und meine erste Version nur vorstellen.
Ich würde mich freuen, wenn mir jemand vielleicht den einen oder anderen Tipp geben könnte, wo der Haken liegt oder was ich prinzipiell falsch gemacht habe. Freue mich auf eine rege Diskussion.
Schöne Grüße
Falk
PS: Ich hab mal das gesamte Projekt mit drangehangen. Ich denke das macht die ganze Sache sicherlich einfacher.
001FPGA_v1.zip (Größe: 890,72 KB / Downloads: 469)