A griff szárnyalni kezd...
Zsigó Zsolt
2003/05/07 14:05
489 megtekintés
A cikk már legalább egy éve nem frissült, az akkor még aktuális információk lehet, hogy mára elavultak.
A GRIFF-1 készülék ionizáló radioaktív sugárzások érzékelésére (detektálására) használható. Alkalmas a bejövő ionizáló részecskék önálló megszámlálására is. Érzékelni képes mind az alfa-, mind a béta- mind pedig a gamma-sugárzást.

Mint azt az előző írásban már érintettük, egy beérkező ionizáló részecske egy impulzust kelt a GM cső munkaellenállásán és ez a jel formálás után kicsatolható a készülékből. Elegendő tehát ezeket a szépen formált impulzusokat megszámlálás céljából elvezetni a számítógépünkhöz, és megfelelő programmal kijelezni a megszámolt értékeket.

Csatlakozókábel a számítógéphez

A csatlakozókábel kb. 1-2 m hosszú kéteres hajlékony vezeték, amelynek egyik vége a a GRIFF készülék nyomtatott áramkörének megfelelő pontjához van forrasztva, a másik végére pedig egy - az IBM számítógépek game portjához illeszkedő - 15 pólusú csatlakozót szerelünk. A csatlakozón belül a vezetéket a 3, 4 lábra forrasztjuk. A GRIFF-1 GM-csöves készülék, mint azt korábban már ismertettem, elektromos feszültség-impulzusokat szolgáltat, amelyeket a számítógépnek fel kell dolgoznia.

Itt említem meg, hogy e programom ötlete nem teljesen új, hisz egy 1998-ban készült tanulmányban Dr. Sükösd Csaba ismertetett egy elegáns nyomtatóporton keresztül kommunikáló megoldást. A DOS rendszer lassú kihalása miatt, azonban ma már egyre nehezebb olyan számítógépet találni, amelyen valóban DOS fut. A jelenlegi védett módú WINDOS-ok alatt döcögő emulált DOS-ok az interrupt használatának tiltása miatt használhatatlanná teszik ezt az egyébként kiváló megoldást napjaink gépein.

Ezt a programot hivatott pótolni az alábbiakban általam javasolt WINDOWS alatt is vidáman ketyegő megoldás.

Megint a game port!

Ebben a megoldásban a GRIFF-1 jeleit a számítógépünknek egy korábbi írásomban részletesen ismertetett perifériájához a gameport-hoz csatlakoztatjuk. A gameport használata különösen szerencsés erre a célra, mivel a a port bemenetei egy kondenzátoron csücsülnek, és ha egyszer már kaptak egy kis töltést az GRIFF-1 ből érkező impulzusból, akkor egy jó ideig töltött állapotban is maradhatnak. Így legalább attól nem kell tartanunk a mérések során, hogy egy impulzus túl rövid élettartama miatt megszámlálatlan marad az operációs rendszer időosztásos működéséből adódó lustasága miatt. Programozástechnikai szempontból a mérés időzítését egy 20 ms -ra felprogramozott Timer vezérli.

Elég szapora-e ez a mintavétel?

Lehet, hogy valaki túl hosszúnak gondolja a 20 ms-onkénti mintavételt, de ha jól utánaszámol, egy ilyen felbontás még 5% -nál is kisebb számlálási hiányt valószínűsít, a háttérsugárzásnál 10 -szer nagyobb beütésszámok esetén. Alapvetően demonstrációs eszközről lévén szó, a méréseinkhez nem illik a olyan sugárzó mintákat használni, melyeknek sugárzása a háttérsugárzás szintjét több nagyságrenddel meghaladná. Ilyen célokra pedig ez a fent említett felbontás bőven megfelelő.

Amennyiben valaki mégis szeretne gyorsabb mintavételt, az nézzen utána az Interneten található Fast_Timer-eknek.

A Timer működése

Mondatszerűen leírva: Egy Timer (Timer1) minden kettyenésekor rákérdez a gameport megfelelő című bemenetének állapotára, és ha töltetlen állapotban találja a kondenzátort, akkor békén hagyja, egyébként pedig amikor töltött állapotot érzékel, kisüti a kondenzátort, hogy az ismét fogadhassa a következő impulzust, majd megnöveli eggyel egy számláló gyűjtőregszter értékét, és vár a következő kettyenésig.

Egy másik Timer (Timer2), amelyik mondjuk 60 másodpercenként indul be, egy olyan eljárást aktivizál, amely kiolvassa és kijelzi beütés/percben az aktivitást, majd nullázza a fent említett gyűjtőregiszter tartalmát, és a folyamat kezdődik elölről. Így percenként friss beütési adatokat kaphatunk. A második Timer (én javasolnám helyette a ketyegő elnevezést ) időzítése határozza tehát meg, hogy mekkora időintervallumra jelezzük ki a beütésszámot, ezért ezt programból is változtathatóvá kell tenni.
Az alábbi ábra egy időszeletet mutat be a program működéséről.

Kommunikáció a Windows-zal

Kommunikáció a GRIFF-1 GM-csöves készülék és a WINDOWS operációs rendszer alatt futó VISUAL BASIC-ban és DELPHIBEN megírt számláló program között. A programot Visual Basic programnyelven írjuk. Visual Basicből nem adható ki olyan utasítás, amely képes közvetlenül portokra írni, ezért a Delphi 3 program segítségével írunk két Dll be exportálható függvényt, amelynek segítségével ez a művelet már elvégezhető. Ezt az Inpout névre hallgató Dll-t kell beilleszteni a Visual Basic programba és ekkor már VB-ben is rendelkezésünkre áll két olyan függvény, amelynek segítségével már írhatunk OUT32(Cím,Érték), ill. olvashatunk INP32(Cím) egy adott című portról A Dll nek abban a könyvtárban kell lennie, ahol a program fut. Az inpout32dll letöltése

A program modul része..

Public Declare Function Inp Lib "inpout32.dll" _Alias "Inp32" (ByVal PortAddress As Integer) As Integer
Public Declare Sub Out Lib "inpout32.dll" _Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)
Global Const PortAddress = &H201
Public ICount, SCount As Long


Kipróbáltam elég sok programozási változatot tekintettel arra, hogy a Windows nem igazán szereti a direkt portra írást és olvasást. E változatok közül végül is itt annak a ciklusnak a kódja látható az alábbiakban, amelyik a legstabilabban működött. A kezdeti instabilitás oka az volt, hogy a kondenzátor kisütése is igényel néhány mikrosecundum időt és nagyon gyors gépek esetén biztosítani kell a kisütést időtartamát is, nehogy kétszer is beolvassa az impulzust kisülés közben. Emiatt a fenti, főleg didaktikai célú magyarázathoz képest a program a következőképen módosult.

A Ttimer1 egy helyett folyamatosan olvasunk be (Fast_Timer). Emiatt egy DoEvents utasítással engedélyezzük az operációs rendszernek, hogy időnként egy kicsit magával is foglalkozzon. A garantált kisütést a TimerK végzi.

Out PortAddress, 1
ICount = 0

Do While En = True

Jbe = Inp(PortAddress)

If Jbe = 254 Then

TimerK.Enabled = True

End If

DoEvents

Loop

Private Sub TimerK_Timer()
Out PortAddress, 1
TimerK.Enabled = False
ICount = ICount + 1
Pcount.Caption = Str(ICount)
End Sub

Private Sub Timer2_Timer()
SCount=SCount+ICount
ICount =0
Ncount.Caption = Str(SCount)
End Sub

Tekintettel arra, hogy ebben a rovatban fizikáról beszélgetünk a programot nem részletezem tovább. Aki tud valamelyik Windows alapú fejlesztőrendszerben programozni, annak ennyi segítség bőven elég, aki pedig nem érti a fenti kódot az inkább töltse le a lefordított változatot

A program

A program futási képe a fenti ábrán látható.

A futtatható változat letöltéséhez kattintson ide.


Dr. Piláth Károly

Csatlakozz hozzánk!

Ajánljuk

European Schoolnet Academy Ingyenes online tanfolyamok tanároknak
School Education Gateway Ingyenes tanfolyamok és sok más tanárok számára
ENABLE pilot Program iskoláknak a bullying ellen
eBiztonság Minősítés Minősítési rendszer oktatási intézményeknek