C64/C128 Projects


LIGHTPEN - Kendi Işıklı Kalemini Kendin Yap

Ayhan KALAYLIOĞLU

Teleteknik, Commodore Aylık Bilgisayar Dergisi, Sayı 12, Şubat 1987, Sayfa: 27-30


Bu yazımızda CONTROL-PORT 1 ile ilgili bir uygulama yapacağız. Bu giriş yalnızca JOYSTICK kabul etmiyor. Yapılabilecek başka uygulamalara örnek olarak biz burada size kendinizin yapıp çalıştırabileceği bir LIGHTPEN'den bahsedeceğiz.

Commodore 64'ümüzün birinci CONTROL-PORT'unun pek çoğumuzun bilmediği bir fonksiyonu daha var. Gerçekten de pek fazla kullanım alanı bulamayan bu fonksiyon aslında oldukça ilginç özellikler taşıyor ve bilgisayar kullanımına yeni bir bakış açısı getirebilir.

Bahsettiğimiz fonksiyonu gerçekleştiren 6 numaralı pin'den başkası değil. Bu pin'in iki değişik fonksiyonu var. Birincisi JOYSTICK'in ateş etme tuşu ile ilgili bilgiyi taşımak. İkincisine ve daha ilginç olanına aşağıda değineceğiz.

Belki daha evvel duymuş veya görmüş olabileceğiniz bir uygulamadan söz edeceğiz. Bu uygulama bir YAZILIM + DONANIM ünitesi ve yaptığı iş ise monitör veya televizyon ekranını doğrudan bir bilgi giriş aracı olarak kullanabilmeyi mümkün kılmak. Bu uygulama yardımıyla ekranın üzerine kâğıda çizer gibi aynı rahatlıkla çizim yapmanızı veya ekrandan, doğrudan üzerine götürüp seçmek suretiyle bir programın menü veya değişik alt-fonksiyonlarının seçimini rahatça yapmanızı sağlıyor. Bu görevi gören aletlere LIGHTPEN denip aynı zamanda C-64 ve VIC 20'ye uygulanabilen modelleri de mevcut. Gerek donanım gerekse yazılım açısından incelendiğinde oldukça basit olduğu gözlenen bu uygulamayı kendimiz de yapabiliriz. Zaten yazımızın asıl konusu da bu.

LIGHTPEN'in donanım kısmının en önemli parçası fototransistör veya fotodiyot diye adlandırılan elektronik bir ünite. Fototransistör görev itibarıyla gelen ışığın şiddetine göre elektriksel sinyaller üretiyor. Fototransistör'ü uyaran ışık ise ekrandan gelen elektron ışınlarından başkası değil. Ekranın önünde duran fototransistör ise elektron ışını önünden geçerken oluşan kısa süreli ışık darbesini algılar ve diğer elektronik ünitelere işlenmek üzere elektriksel sinyaller olarak gönderir. LIGHTPEN'in çalışması için ekranın belli bir ölçünün üzerinde parlaklığa sahip olması gereği de bundandır. LIGHTPEN'den bilgisayara bir sinyal geldiğinde bilgisayar, elektron ışını hangi pozisyonda iken sinyalin gönderildiğini kaydeder. Böylece bilgisayar herhangi bir programın kullanabilmesi için LIGHTPEN'in ekran üzerindeki X- ve Y- koordinatlarını belirlemiş olur.

Herhangi bir program yazmaya kalkışmadan önce kendimize bir LIGHTPEN bulup bilgisayarımıza bağlamalıyız. Yukarıda da dediğimiz gibi öncelikle bir fototransistör'e ihtiyacımız olacak. Biz burada verdiğimiz devrede TIL78 model fototransistör'ü kullandık. Devremizde kullanılacak tüm parçalar şu anda piyasada elektronik malzeme satan mağazalardan rahatça temin edilebilecek biçimde seçilmiştir. Bu devrede fototransistör yerine LDR adlı elektronik malzeme tipini kullanmanızı önerenler olursa kesinlikle dinlemeyin. Her ne kadar bu iki tip elektronik elemanın görevleri ve fonksiyonları birbirine benzerse de karakteristikleri oldukça farklıdır. Şayet devremizde LDR kullanacak olursak bu parça oldukça yüksek hızda hareket eden elektron ışınını takip etmek için çok yavaş kalacak ve devremiz yüzde yüz çalışmayacaktır.

Şayet şans eseri daha evvelden beri bir LIGHTPEN'e sahipseniz; buradaki devreyi yapmanıza gerek kalmadan aynı üniteyi kullanıp burada anlatacağımız denemeleri yapabilirsiniz.

Şimdi fototransistör'ü nasıl kullanıp, nasıl bağlayacağınızı anlatalım. TIL78 model fototransistör'ün iki bacağı vardır. Bunlar "Kollektör" ve "Emiter" diye adlandırılır. Bu bacaklardan hangisi hangisidir ve ne işe yarar? Bunu öğrenmek için üç yol var. Bunlardan birincisi acemi bir elektronikçiyseniz sizin için en uygun olanı: Fototransistör'ü satın aldığınız dükkandaki kimselere sorup anlattıracaksınız. Geriye kaldı iki çözüm: Fototransistör'ün üst kılıfının kollektör tarafı biraz düzleşmiş bir şekle sahiptir. Bundan başka kollektör bacağı ötekine göre daha kısadır. Gelelim üçüncü yönteme: Bu yöntemi daha evvel de duymuş olmalısınız. Adı deneme yanılma yöntemi. Devrenin fototransistör dışında geri kalan kısmı monte edilir ve fototransistör iki ihtimale tâbi tutulur. Şayet herhangi bir kısa devreye sebep olmazsanız devrenin hiçbir bölgesi gerek doğru gerek yanlış bağlantıdan zarar görmeyecektir. Fakat bu yönteme çok zorda kalmadıkça başvurmamanızı öneririz.

Deneme ve gösteri amacıyla "LIGHTPEN DEMO" adlı bir program yazdım. Joystick Demo programlarına oldukça benzeyen bu program LIGHTPEN vasıtasıyla ekrana noktalar basmakta. LIGHTPEN'i ekranın neresine götürürseniz o koordinatta noktalar oluşmakta. Böylece doğrudan (dolaysız olarak) ekran sizin bilgi giriş aracı oluyor ve doğrudan o'nun üzerine çizim yapabiliyorsunuz.

Programı yazın, bir yerde saklayın (SAVE edin); daha sonra da çalıştırın. Program çalışır çalışmaz ilk olarak size basılan noktaların kalıcı olup olmaması gerektiğini soracaktır. Orada belirtilen harflerle cevabınızı bilgisayara bildirin. Birkaç saniye sonra ekran tümüyle silinip beyaza bürünecektir. Ekranın rastgele bir yerinde ise küçük bir dörtgen belirecektir. Fototransistör'ü elinize alıp ekrana değdirin. Küçük dörtgenimiz LIGHTPEN'imizi takip edecektir.

Dikkat edilmesi gereken bir husus da tuş takımı ve LIGHTPEN'in birbirlerini daimi rahatsız ettikleri (bunun nedeni joystick-port'un tuş takımı ile aynı chip'e bağlı olması). Rastgele birkaç tuşa dokunduğunuzda göreceksiniz ki küçük dörtgenimiz çılgın gibi oraya buraya zıplamakta. Benzer şekilde bilgisayar direkt mod'dayken LIGHTPEN'i takılı vaziyette ekran üzerinde gezdirirseniz ekrana bilumum saçma-sapan karakterler çıkacaktır. VIC 20 kullanıcıları bu sorunla karşılaşmayacaklardır. Çünkü VIC20'de tuş takımı ve Lightpen ayrı kanallarda çalışmaktadır.

Şayet ilk çıkan dörtgeni hareket ettiremiyorsanız bunun birçok nedeni olabilir: Programı doğru yazmış ve LIGHTPEN'i kusursuz monte etmiş olsanız bile ekrandan LIGHTPEN'imize yeterli ışık gelmiyor olabilir. Ekranınızın parlaklık ayarını arttırın; bunun LIGHTPEN'inizi çalıştırabilmesi gerekir.

Buna rağmen program çalışmıyorsa suçu devrede olabilecek küçük bir kısa devrede aramak gerekir. Şayet elektronikten pek anlamıyorsanız anlayan birine başvurmanız önerilir; bunun sizin probleminizin çözümünde faydalı olacağına inanıyorum. Parça listesinde tüm parçaların isimleri verilmiştir. Fakat bu yazı içindeki tüm açıklama ve anlatımlar öğreticilikten çok elektronikten anlayan kimseler seviyesindedir. Size tavsiyemiz şimdiden daha sorunlar çıkmadan böyle birini bulup yardım istemenizdir. Yoksa işi iyice çorba edip ortalığa zarar verir, geri dönülmeyecek yerlere gelebilirsiniz.

Gelelim devreye: NE555 tipinde bir IC (Integrated Circuit = Entegre devre) içermekte. NE555 devremizde monoflop görevi yapmakta. Monoflop'un 2 numaralı bacağına kısa bir negatif impuls geldiğinde, monoflop kısa bir süre çalışma durumunda kalır ve hemen peşinden (pasif) duruma geçer. 2 numaralı bacağa (trigger bacağına) gelecek darbeleri demin değindiğimiz fototransistör sağlar. Elektron ışını ekranda fototransistör'ün bulunduğu pozisyondan geçerken fototransistör kısa süreli bir negatif impuls gönderir, bu impuls monoflop tarafından bilgisayarın değerlendirebileceği sinyallere çevrilir, bu sinyal bir transistor tarafından kuvvetlendirilerek bilgisayara gönderilir.

c64 lightpen isikli kalem

En sonda bulunan kuvvetlendirici kat sayesinde LIGHTPEN'imizin karanlık ekranlarda da çalışabilmesi sağlanmıştır. Fakat gene de değişik karakteristikteki ortamlarda devremizin hâlâ çalışmasını sağlamak için bir de ayar (kalibrasyon) noktası koyduk. Bir megaohm'luk trimpot tipi direncin sağladığı bir ayarla oynayıp optimal sonucu elde etmeye çalışın. Ayar yapmak oldukça basit: Trimpot'unuzu LIGHTPEN'inizin düzenli çalıştığı bir noktaya kadar çevirin. Bir kiloohm'luk direnç, kuvvetlendirici transistörümüz için bir öndirençtir. Devrede geri kalan elemanların görevi ise monoflop'un çalışma seviyesinde kalıp geriye (pasif seviyeye) düşmesi arasında geçecek zamanı ayarlamaktır. Şimdi de programımızı daha yakından görelim. 390 ve 400'üncü satırlarda renk hafızası sıfırlarla doldurulup boş ekranın siyah renk alması sağlanıyor. LIGHTPEN'in pozisyonu bilgisayar tarafından gerek X- gerek Y-koordinatları olarak dokuz bit hassasiyetle algılanmakta. X- koordinatının üst sekiz biti 53267 adresli hafızada bulunmaktadır (VIC 20'de 36871). X-değerinin sıfır numaralı bit'ine ulaşamıyoruz. Bu yüzden LIGHTPEN'le yapılan çizimin hassasiyeti hiçbir zaman iki bitişik noktanın altına inemiyor. Fakat bu hassasiyet düşük çözünürlüklü grafik (bir karakter = bir nokta) için yetip de artıyor bile. 440'tan 470'inci satıra kadar olan bölümde X- ve Y- koordinatları beşer kere okunup aritmetik olarak toplanıyor ve 480'inci satırda bu toplamlar beşe bölünüyor. Yani kısacası beş noktalık örnek okunup bunların ortalaması alınıyor. Bu işlem okunan değerleri stabil hale getirmek için kullanılıyor, çünkü yapılan denemeler göstermiştir ki bilhassa X- değeri aşırı derecede oynamaktadır. Bunun yanında Y- koordinatı daha sakin bir davranış örneği göstermektedir.

510 ve 520'inci satırlarda okunan değerler ekran koordinatlarına çevriliyor. Şayet kendiniz başka bir program yazıp, o programı LIGHTPEN'inizle çalıştırmak istiyorsanız bilhassa bu programın bu kısımlarını değiştirip bazı denemeler yapmanız gerekmektedir. 540'ıncı satırda ise okunan değerler kontrol edilmekte. Bu kontrolün yapılması bilhassa aşırı derecede oynayan X- değeri yüzünden ayrı bir önem kazanıyor. Geri kalan satırlar ise oldukça tanıdık tipte olduğu için açıklamaya gerek duymuyorum.

İkinci programımız LIGHTPEN ile yapılan başka bir uygulamayı gösteriyor. Burada LIGHTPEN çizmek için değil de bir programın menülerini seçmekte kullanılıyor. Y- değerimiz daha bir güvenilir olduğundan burada yalnızca onu kullanacağız; yani bizim için önemli olan yalnızca vertikal pozisyon. Bu programın yaptığı iş ise C64/VIC 20'nin üç ses kanalından birini seçmenizi sağlıyor. Her kanal değişik frekansa ayarlanmış durumda olduğu için seçmenizi aynı zamanda kulağınızla da hissedebilirsiniz. İstediğiniz kanalı ekranda o kanala ait alam LIGHTPEN'inizle işaretleyip belirtebilirsiniz.

470'inci satırda LIGHTPEN'in Y-pozisyonu okunuyor. 490'ıncı satır ve devamında seçilen kanal ve ona ait frekans belirleniyor. Şayet aynı kanalı bir kere daha seçerseniz 550'inci satır sayesinde o kanalın bir kere daha çalışması engelleniyor. Böylece kanalın susup yeniden çalışmasından oluşabilecek gürültüler engelleniyor.

Şayet LIGHTPEN'inizi kendi yazdığınız programlarda da bol miktarda kullanmak istiyorsanız, fototransistör kısmını düzgün bir kılıf içine yerleştirmeniz gerekiyor. Bunun için eski bir tükenmezkalem veya dolmakalem kılıfını kullanmak en rahatı olacaktır. Kılıfın içini boşaltın (yani kalemi katledin), fototransistörünüzün bacaklarına uzatma amacıyla çift hatlı bir kabloya lehimleyin; lehimlenen uçları ve çevresini izole edin ki herhangi bir kısa devreye sebep vermesin. Kısa devre herhangi bir zarar vermeyecektir. Fakat böyle bir durum fototransistörü devre dışı bırakacağından devremiz çalışmayacaktır. Fototransistörü kılıfa sokun ve nazikçe arka tarafından itin. İtme işlemini fototransistör diğer uçtan görününceye kadar sürdürün. Bu arada fototransistorun ve bağlantılarının zarar görmemesine dikkat edin. Dikkat etmeniz gereken başka bir husus da fototransistörün "gören" yüzünün dışarı doğru dönük olmasıdır. Fototransistörü bu pozisyona getirdikten sonra sabitleyin (yapıştırmak veya sıkıştırmak vasıtasıyla). Gelelim kalemimizin ışık alacak ağzının büyüklüğüne: Bu delik ne kadar küçük olursa LIGHTPEN'imiz koordinatları o kadar doğru algılar. Fakat bu delik gene de LIGHTPEN'imize çalışması için gerekli ışığı geçirmelidir. Gerek bu deliği büyüterek gerek monitörümüzün veya televizyonumuzun parlaklık ayarıyla oynayıp uygun bir çalışma noktası bulun. Böylece gerçek bir LIGHTPEN'e sahip olunuz.


PROGRAM ADI: LIGHTPEN. PRG1

100 REM  ******************************
110 REM  *                            *
120 REM  *         LIGHTPEN           *
130 REM  *         --------           *
140 REM  *                            *
150 REM  *           DEMO             *
160 REM  *           ----             *
170 REM  *                            *
180 REM  *     AYHAN  KALAYLIOGLU     *
190 REM  *                            *
200 REM  *    26. 10. 1986   PAZAR    *
210 REM  *                            *
220 REM  *   COMMODORE DERGISI ICIN   *
230 REM  *                            *
240 REM  ******************************
250 :
260 REM  *********** BILGI ** *********
270 PRINT  "<CLR><4DOWN>CIZILEN NOKTALAR HER"
280 PRINT  "<DOWN>DEFASINDA SILINSIN MI?<DOWN>"
290 PRINT  "<RVSON>E<RVSOFF>VET ";
295 PRINT  "VEYA <RVSON>H<RVSOFF>AYIR"
300 GET A$: IF A$ = "" THEN 300
310 IF  A$ = "H" THEN  L = 1
320 :
330 REM  ********** HAZIRLIK **********
340 POKE  53280, 0: POKE  53281, 1
350 PRINT  "<CLR>": A = 1024: B = 40
360 C = 24: D = 53267
370 :
380 REM  ***** RENK BELLEGINI BOYA ****
390 FOR I = 55296  TO  56295
400 POKE I, 0: NEXT I
410 :
420 REM  ***** DEGERLERI OKUMA ********
430 REM  ******* VE SABITLEME *********
440 FOR I = 1 TO 5
450 X = X + PEEK (D)
460 Y = Y + PEEK (D+1)
470 NEXT I
480 X = INT (X/5): Y = INT (Y/5)
490 :
500 REM  *** KOORDINATLARA CEVIRME ***
510 KX = INT ((X-50)/180*(B-1))
520 KY = INT ((Y-45)/190*C)
530 :
540 REM  **** KOORDINATLARI DUZELT ****
550 IF  KX < 0  THEN  KX = 0
560 IF  KY < 0  THEN  KY = 0
570 IF  KX > B-1  THEN  KX = B-1
580 IF  KY > C  THEN  KY =C
590 :
600 REM  ******** NOKTA KOY/SIL ********
610 IF  L = 0  THEN  POKE  A+XA+YA*B, 32
620 POKE  A+KX+KY*B, 160
630 :
640 REM  **** YENI DEGER & DEVAM ****
650 XA = KX: YA = KY: X = 0: Y = 0
660 GOTO  420
670 :
680 :
690 :
700 REM  *****************************
710 REM  *** VIC20 ICIN DEGISIKLIK ***
720 REM  *****************************
730 REM
740 REM  BU SATIRLARI DEGISTIRIN
750 REM
760 REM  340 POKE 36879, 24
770 REM  350 PRINT "<CLR>": A=7680: B=22
780 REM  360 C=22: D=36870
790 REM  390 FOR I = 38400 TO 38905
800 REM  510 KX = INT ((X-55)/95*(B-1))
810 REM  520 KY = INT ((Y-38)/89*C)
820 REM
830 REM  BU PROGRAMI KAYDETMEZDEN
840 REM  ONCE 270-290 ARASI
850 REM  SATIRLARI DUZELTMELISINIZ



PROGRAM ADI: LIGHTPEN. PRG2

100 REM  ******************************
110 REM  *                            *
120 REM  *         LIGHTPEN           *
130 REM  *         --------           *
140 REM  *                            *
150 REM  *           SES              *
160 REM  *           ---              *
170 REM  *                            *
180 REM  *     AYHAN  KALAYLIOGLU     *
190 REM  *                            *
200 REM  *    26. 10. 1986   PAZAR    *
210 REM  *                            *
220 REM  *   COMMODORE DERGISI ICIN   *
230 REM  *                            *
240 REM  ******************************
250 :
260 REM  ******** EKRANI HAZIRLA*******
270 POKE  53281, 1: POKE  53280, 3
280 PRINT  "<CLR><DOWN><2SPACE>LUTFEN SECINIZ!"
290 PRINT  "<2SPACE>---------------<DOWN>"
300 FOR I = 1 TO 3
310 PRINT "<2SPACE>A*S"
320 PRINT "<2SPACE>B B SES KANALI #"; I
330 PRINT  "<2SPACE>Z*X<2DOWN>"
340 NEXT I
350 :
360 REM  **** SID YONGASINI HAZIRLA ****
370 T1 = 4: SI = 54272
380 FOR I = 1 TO 10
390 READ A, B
400 POKE SI+A, B
410 NEXT I
420 DATA  24, 15, 0, 207, 1, 50, 7, 207
430 DATA  8, 100, 14, 207, 15, 150, 6, 240
440 DATA  13, 240, 20, 240
450 :
460 REM  *** ISIK KALEMI KONUMU ***
470 Y = PEEK (53268)
480 :
490 REM  ****** KONUMU DENETLE *******
500 IF  Y >  79  AND  Y <  91  THEN  T2= 4
510 IF  Y > 119  AND  Y < 131  THEN  T2= 11
520 IF  Y > 159  AND  Y < 171  THEN  T2= 18
530 :
540 REM  ** SES KANALINI DEGISTIR **
550 IF  T2 = T1  THEN  460
560 POKE  SI+T1, 0
570 POKE  SI+T2, 17
580 :
590 REM  ** YENI DEGERLER & DEVAM **
600 T1 = T2
610 GOTO 460
620 :
630 :
640 :
650 REM  *****************************
660 REM  *** VIC20 ICIN DEGISIKLIK ***
670 REM  *****************************
680 REM
690 REM  370-440! ARASINI SILIN
700 REM
710 REM  SUNLARI GIRIN:
720 REM
730 REM  270 POKE 36879, 27
740 REM  370 T2 = 36874: POKE 36878, 15
750 REM  470 Y = PEEK (36871)
760 REM  500 IF Y < 63 THEN T2=36874: GOTO 540
770 REM  510 IF Y < 85 THEN T2=36875: GOTO 540
780 REM  526 IF Y < 103 THEN T2=36876: GOTO 540
790 REM  560 POKE T1, 0
800 REM  570 POKE T2, (T2-36871)*50


 

Teleteknik, Commodore Aylık Bilgisayar Dergisi, Sayı 12, Şubat 1987, Sayfa: 27-30'den 27 Temmuz 2005 tarihinde tarandı.
 
ilker Fıçıcılar


C64/C128 Projects  by  Quick Turkish   Changelog   Site Map   Index