HSG |
|
Erstes kleines Testprogramm: ft3.py
Die Fischertechnik- Dokumentation müsste geändert werden, denn sie suggeriert, dass der 'Ruhezustand' von loadout=1 sei. Das ist aber nicht so, der Ruhezustand ist loadout=0. Einzig nach dem Einlesen der 8 Ausgangsbits ist ein kurzer loadout- bzw. Strobe-Impuls nötig.
Die folgende Ansteuerung funktioniert unter Windows und unter Linux. Unter Linux muss man darauf achten, dass die Module parport, partport-pc und ppdev (eventuell mit 'modprobe ppdev' laden) geladen sind. Um den Parallelport nutzen zu können, muss man in der Gruppe lp sein. Mit 'lsof|grep /dev/parport0' kann man schauen, welche Prozesse auf den Parallelport zugreifen und sie gegebenenfalls killen.
from parallel import * from time import * p = Parallel() def wait(dt): t1 = clock() t2 = t1 while t2-t1 < dt: sleep(0.0005) t2 = clock() # sleep allein ist sehr ungenau def watchdog(): """ triggert den watchdog-Timer indem clock auf 0 geht bit0 LOAD-OUT 1 0 -------------------------------- bit1 LOAD-IN 1 0 -------------------------------- bit2 DATA-OUT 1 0 -------------------------------- bit3 CLOCK 1 --+ +--------------------------- 0 +-+ bit4 TRIGGER-X 1 -------------------------------- 0 bit5 TRIGGER-Y 1 -------------------------------- 0 """ p.setData(0x30) #wait(0.001) p.setData(0x38) def DEingabe(): """ liest die digitalen Eingaben des Interface ein bit0 LOAD-OUT 1 1 0 -------------------------------- bit1 LOAD-IN 1 +---+ 2 4014: PE 0 -+ +-------------------------- bit2 DATA-OUT 1 4 0 -------------------------------- bit3 CLOCK 1 +--+ +-+ 8 4014: CP 0 --+ +--- .. -+ +- *8 .. bit4 TRIGGER-X 1 -------------------------------- 16 0 bit5 TRIGGER-Y 1 -------------------------------- 32 0 BUSY 1 +++ *8 0 +++ """ b = 0 w = 128 p.setData(0x32) # 4014: PE=1, CP=0 p.setData(0x3A) # 4014: PE=1, CP=1 (steigende Flanke an CP) p.setData(0x30) # 4014: PE=0, CP=0 for i in range(8): if not p.getInBusy(): b = b+w p.setData(0x38) # 4014: PE=0, CP=1, steigende Flanke an CP w = w/2 p.setData(0x30) # 4014: PE=0, CP=0 return b def Ausgabe(b): """ gibt das Byte b an die Motorausgaenge aus bit0 LOAD-OUT 1 +-+ 1 4094: Strobe 0 ---------------------------+ +-- bit1 LOAD-IN 1 2 0 -------------------------------- bit2 DATA-OUT 1 +++++ *8 4 4094: Data 0 -+++++-- bit3 CLOCK 1 --+ +- *8 8 4094: 0 +-+ bit4 TRIGGER-X 1 -------------------------------- 16 0 bit5 TRIGGER-Y 1 -------------------------------- 32 0 """ for i in range(8): if b >= 128: p.setData(0x34) # 4094: Strobe=0, Data=1, CL=0 p.setData(0x3C) # 4094: Strobe=0, Data=1, CL=1 else: p.setData(0x30) # 4094: Strobe=0, Data=0, CL=0 p.setData(0x38) # 4094: Strobe=0, Data=0, CL=1 p.setData(0x30) # 4094: Strobe=0, Data=0, CL=0 b = (b*2)%255 p.setData(0x31) # 4094: Strobe=1 p.setData(0x30) # 4094: Strobe=0 def AEingabe(k): """ liest die analogen Eingaben/Zeiten des Interface ein (0=x,1=y) bit0 LOAD-OUT 1 1 0 -------------------------------- bit1 LOAD-IN 1 2 0 -------------------------------- bit2 DATA-OUT 1 4 0 -------------------------------- bit3 CLOCK 1 -------------------------------- 8 0 bit4 TRIGGER-X 1 -+ +--------------------------- 16 k=0 0 +--+ bit5 TRIGGER-Y 1 -------------------------------- 32 k=1 0 BUSY 1 -+ <-------- dt ---------> +---- 0 +-------------------------+ """ t1 = clock() if k==0: p.setData(0x20) # TriggerX=0, clock=0 else: p.setData(0x10) # TriggerY=0, clock=0 p.setData(0x38) # TriggerX=TriggerY=1, clock=1 t2 = clock() while p.getInBusy()==0: sleep(0.0005) t2 = clock() return t2-t1 t1 = clock() ein = DEingabe() #watchdog() Ausgabe(0x69) #t=AEingabe(0) t2 = clock() for i in range(1000): wait(0.01) watchdog() print t2-t1,ein