ELEKTRONİK ALET-EDEVAT BASİT BİR JOYSTICK
Bilgisayarınızı belirli komutlar çerçevesinde kendi kendine çalışan bir araç olarak görüyorsanız yanılıyorsunuz. Fabrikadan çıktığı haliyle masanıza yerleştirdiğiniz bilgisayar, software ile işlenecek bir hammaddedir aslında. Eğer “aletinizi” gerçekten seviyorsanız, size daha yakın olmasını, günlük hayatla daha anlamlı bir ilişkiye geçmesini, söz yerindeyse “sosyalleşmesini” istiyorsanız, bir yandan software ile işlerken, diğer yandan hardware ile “cilasını çekeceksiniz”. Hardware derken, sizden ilk aşamada yeni ve karmaşık tasarımlar beklendiğini zannetmeyin. Çok basit bağlantılarla bilgisayarınızın kullanım alanını genişletebilirsiniz. Bu yazıda sözünü edeceğimiz bağlantı sistemi de “basit ve kullanışlı” devrelere bir örnek. Üstelik deneysel amaçlı bir “analog joystick”in üretimini evinizde gerçekleştirebilmenize de yardımcı olacak nitelikte. Ancak bu konuya girmeden önce, bilgisayarın temel işleyiş ilkelerine kısa bir biçimde değinmekte yarar var. Bilgisayarlar belleklerine ikili (binary) sayı sistemine göre yazılmış olan sayılarla mantıksal işlemler yaparak çalışırlar. Bütün sayılar ikili sistemde gösterilebilir. Bilgisayarın içindeki sinyaller ya 5 Volt civarında, ya da 0 Volt civarındadır. 5 Volt “1”i (mantıksal doğru), 0 Volt ise “0”ı (mantıksal yanlış) temsil eder. Sinyallerin çeşitli kombinezonları aracılığıyla bütün sayıların gösterilmesi, bilgisayarın elektronik devrelere dayanan çalışma sisteminin temelini oluşturur. İkili sistemde yazılan sayıların her bir basamağına bit denir. Bir bayt ise sekiz bitten oluşur. Öyleyse bir baytla 0'dan 255'e (2^8—1) kadar her sayı gösterilebilir. İki bayt bir araya getirilerek 0'dan 65.535'e kadar veya işaretli kodlama kullanılarak —32.768'den 32.767'ye kadar sayılar gösterilebilir. Bu nedenle BASIC'teki tamsayı değişkenler —32.768 ile 32.767 arasındaki değerleri alabilirler. Gerçek dünyadaki veriler ise sadece doğru ve yanlıştan oluşmazlar. Klavyedeki tuşların basılmış hali 1 ile basılmamış hali 0 ile gösterilerek bilgisayarın anlayacağı hale getirilebilir. Ama robot kollarının pozisyonları, motorların hızları, ayar voltajları sürekli değişerek pek çok değer alabilir. Bu noktada analog ve dijital sinyaller arasındaki farkın ne olduğunu tanımlayalım. Dijital sinyaller adım adım değişir (tıpkı, tamsayılarla sayı saymak gibi). Bu değişme özellikle bilgi işlemeye çok uygundur. Analog sinyallerse sonsuz küçük adımlarla değişir. Öyleyse, bilgisayarların gerçek dünyayla haberleşebilmeleri ve veri toplayabilmeleri için analog sinyallerin bir şekilde dijital sinyallere dönüştürülmesi gerekir.
INTERFACE
Bu yazıda, ilk olarak, Commodore 64'ün içinde bulunan ve bilgisayarınıza dört taneye kadar analog sinyali bağlayabilmenizi sağlayan bir “arabirim”e (interface) değineceğiz. Sinyal girişleri değişken dirençlerden alınacak şekilde tasarlanmıştır, ama voltajların ölçülmesini sağlamak da göründüğü kadar zor değildir. Bu arabirimi deneysel amaçlarla kullanabilmek için kablo, konnektör ve klemenslerden oluşan basit bir bağlantı aracı yapabilirsiniz. Sonuçta, bilgisayarınıza bir joystick, bir ışık kalemi (light pen) ve kendi tasarlayacağınız diğer gereçleri bağlayabilirsiniz. Commodore 64'te joystickler ve oyun düğmeleri ile kullanılmak üzere yapılmış iki konnektör vardır. Her “port” mantık sinyallerini okuyabildiği gibi, analog bir joystickle kullanılmak üzere iki tane de analog girişe sahiptir. Basit bir komutuyla girişteki devreleri bir konnektörden diğerine anahtarlamak mümkündür. Konnektörlerden birinde ayrıca bir de ışık kalemi (light pen) bağlantısı vardır. Evde yapılan bir joystick, bilgisayarın bağlantı devreleriyle ilgili bilginizi sınamanızı sağlayabilir. Üstelik bu joystick ilerde, analog girişleri (port) denemek amacıyla da kullanılabilir. Bu kadar basit bir projeyi kurarken bile, tasarlanan aletin çalışmaması söz konusu olabilir. Bunu engellemek için yapılacak en önemli şey, adım adım ilerlemek ve varılan her aşamada yapılan işin doğruluğundan emin olmaktır. Önce oyun soketlerinden biri (Control Port 1) için bir konnektör yapılmalıdır. Bu noktada, malzeme olarak 9'lu D tipi erkek konnektör, dokuzlu sıra klemens ve bu ikisini birbirine bağlamaya yetecek kadar kablo yeterlidir. Kabloyu 30 cm'lik bitişik kablo veya 30'ar cm uzunluğunda çok renkli kablo türleri arasından siz seçeceksiniz. Bu düzenek, kullanışlı bir bağlantı noktasını (yani sıra klemens) klavyenin yakınına getireceğinden, hardware ve software'in aynı zamanda denenebilmesini ve geliştirilmesini sağlar. Kabloları klemense düzgün bir şekilde ve anlamlı bir sırayla bağlamak ileride işleri çok kolaylaştıracaktır. Biz, bağlantıların aşağıdaki tabloya göre yapılmasını öneriyoruz:
RLY
Soy3 Zoy2 | Yoyo
wv TPty Ov
590
Ve gr Düğ
Seyl 530y3
Resim 1: Bağlantılar
Sıra Klemens: —— Fiş (9'lu D tipi) İğne No:
Bütün bağlantıları yaptıktan sonra fişi takın ve kontrol edin. Başarılı bir elektronik devre yapımının sırrı, hiçbir şeye güvenmeyip, işlerin yolunda olup olmadığını kontrol etmektir. Örneğin, bir kablonun ucunda bir sinyalin olduğunu düşünüyorsanız, diğer ucunu mutlaka kontrol edin. Yaptığınız lehime çok güvenip kontrol etmezseniz çalışmayan devredeki hatayı bulmak için saatler harcayabilirsiniz. Her yaptığınızdan emin olarak ilerlemeniz zaman açısından ekonomik değilmiş gibi görünse de, ortaya çıkacak ilk çalışmayan devreyi çalıştırmak için harcayacağınız zaman, bunun böyle olmadığına sizi inandıracaktır. Yaptığınız işleri kontrol için 6 Volt DC'ye ayarlanmış bir multimetre (avometre) kullanılabilir. Multimetrenin eksi ucu 0 Volt'a bağlanmalıdır. Doğru bağlanmış bir konnektörle bulunacak voltajlar aşağıdadır:
Resim 2: Potansiyometrelerin bağlanması.
0.5 Volt 4-5 Volt arası 4-5 Volt arası 4-5 Volt arası 4-5 Volt arası
Bu voltajlar elde edilmişse altı bağlantı doğru yapılmış demektir. Analog girişleri (PotX, PotY) kontrol etmek için aşağıdaki program kullanılabilir:
10 PRINT PEEK(54297),PEEK(54298)
20 GOTO 10
Bu program RUN edildiğinde, ekran iki kolon halinde yazılmış “255”'lerle dolmalıdır. Bu sonucu aldıktan sonra, analog girişleri 100 ohm'luk direnç üstünden, bir kablo ile sırayla 5 Volt'a değdirilir. Her bir girişe karşılık gelen sütundaki sayıların, telin değmesine bağlı olarak, sıfıra yakın değerler aldığını ekranda görmemiz gerekir. Bu denemeyi de başarıyla tamamladıktan sonra, son olarak anahtar tipi joystickler için yapılmış olan ve düğme/ışık kalemi girişlerini denemek üzere aşağıdaki programı kullanmakta yarar var:
10 PRİNT PEEK(56321)AND 31
20 GOTO 10
Programı RUN ettikten sonra, 5 Volt'a bağlamış olduğunuz direnç ve kabloyu söküp, 0 Volt'a bir kablo bağlayın. (Bu kez direnç kullanmadan.) Kablonun diğer ucunu teker teker ve düğme/ışık kalemi girişlerine değdirin. Ekranda görülen değerler 31'den sırasıyla 30, 29, 27, 23, 15'e değişecektir. Yani, her bir girişe karşılık gelen bitler 0 Volt'a bağlanmadıkları sürece 1 (doğru) olarak kalacaklardır.
ANALOG GİRİŞ: NASIL ÇALIŞIR?
Burada bütün işi Commodore 64'ün içindeki “SID” ses entegresi yapmaktadır. SID'ın analog girişleri okumak için iki girişi vardır. 64'ün içinde, bunları iki ayrı kanala bağlayan özel bir anahtar bulunmaktadır. Her bir giriş kanalı şu şekilde çalışır: Giriş biti ilk önce entegre tarafından topraklanır ve böylece bir kondansatör bo-
Daha sonra bu kondansatör analog girişe bağlanmış olan değişken direnç üstünden şarj edilir. Bu şarj sırasında entegre kondansatör, voltajının tetikleme düzeyine gelmesine kadar geçen zamanı kaydeder. Sonuçta elde edilen değer entegrenin içindeki başka bir “register”e transfer edilir. Bu değer, register'den basit bir PEEK komutuyla okunabilir. Bilgisayar ilk açıldığında 1 numaralı port otomatik olarak seçilir. Bundan emin olmak için:
POKE 56322,PEEK(56322) OR 192
girerek veri yönü register'ini kullanabilirsiniz. Sonra:
POKE 56320,64
girerek Port Vi,
POKE 56320,128
girerek Port 2'yi seçebilirsiniz. Ne var ki bu işlem göründüğü kadar basit değildir. SID, girişleri milisaniyede birkaç kez test eder. Buna rağmen, program içinde yapılacak olan port seçimi ile bir değerin okunması arasında kısa bir gecikme olacaktır
SIRA 1
JOYSTICK'TE
Bu iş için iki tane potansiyometre gerekmektedir. 500 kilo-ohm'luk potansiyometreler bulunamazsa, herhangi bir potansiyometre de işinizi görür. Direnç değeri işleyiş açısından çok belirleyici değildir. Düşük değerler ortaya çıkacak sayıların sınırlarının küçük olmasına, büyük değerler ise kullanılabilir değerlerin, dönüşün bir yerinde toplanmasına yol açar. Potansiyometreler mekanik yapı bakımından genelde ikiye ayrılır: Sürgülü potansiyometreler ve normal yuvarlak potansiyometreler. Biz ikinci tipi seçeceğiz. Potansiyometre direnç özelliğine sahip bir yol ve bu yol üzerindeki bir silgeçten oluşur. Yolun iki ucu, iki lehim terminaline bağlıdır. Silgecin ucu da dışarıda, ilk iki terminalin ortasındaki terminale bağlanmıştır. Bizim kullanacağımız potansiyometrede yol daire şeklindedir ve silgeç döndürülen bir mile bağlanmıştır. Silgeç yolun üstünde dolaştıkça, orta terminal ile diğer iki terminal arasındaki direnç değişir. Bu şekilde milin dönme miktarı ve pozisyonu bir direnç değeri şekline dönüştürülmüş olur. Potansiyometre ile bilgisayar arasındaki bağlantıyı sağlamak için, kenardaki uçlardan birini bir kablo aracılığıyla 5 Volt'a, orta ucu Pot X'e bağlayıp, şu programı RUN edin:
10 PRİNT PEEK(54297),PEEK(54298)
20 GOTO 10
Eğer potansiyometrenin mili ile oynarsanız, ilk kolondaki sayıların sıfıra yakın bir değerle arasında değiştiğini göreceksiniz.
Olmadı mı? O halde potansiyometrenin orta ucu ile 0 Volt arasındaki voltajı multimetre ile ölçmek gerekiyor. Orada voltaj yoksa, potansiyometrenizi sökün ve kontrol edin. Kenarlardaki uçlar arasındaki direnci ve orta uçla her bir kenar uç arasındaki direnci multimetreyle ölçün. Potansiyometre mili sabit kalmışsa, ilk ölçümde okunan direnç son iki ölçümde okunan dirençlerin toplamına eşit olmalıdır. Şimdi potansiyometreyi yeniden deneyebilirsiniz. Volt bağlantısının voltajını ölçün. Sonucun 5 Volt civarında çıkması gerekir. Tüm yolları deneyip, hâlâ sonuç alamadığınızı düşünüyorsanız, çalışmalarınıza bir süre ara verin ve bağlantıları salim kafayla bir kez daha gözden geçirin. İlk potansiyometreyi çalıştırdıktan sonra, ikinci potansiyometrenin orta ucunu Pot Y'ye, diğer uçlarından herhangi birini de 5 Volt'a bağlayın. İlk program (test programı) tekrar RUN edildiğinde, her iki sütundaki sayıları da potansiyometrelerle oynayarak değiştirebilmelisiniz. Her şey tamamsa, işin elektronik tarafını başardınız demektir. Şimdi iş bu iki potansiyometreyi joystick işlevinde kullanmanızı sağlayacak basit bir mekanik düzen kurmakta.
Not: Kullanılan tüm devreler denenmiştir; Ancak, montaj, bağlantı ve işletim hatalarından meydana gelebilecek maddi zararlardan sorumluluk kabul edilmez.
(1) 9'lu D'tipi erkek fişi İstanbul'daki Karaköy Pasajı'nda bulabilirsiniz. (2) Sıra klemensini İstanbul Bankalar Caddesi'nden temin edebilirsiniz. (3) Multimetrenizde 6 Volt DC ölçme konumu yoksa 5 Volt'tan büyük herhangi bir konuma ayarlayabilirsiniz. (4) İbreli bir multimetre değişken sinyallerin ölçülmesinde daha yararlı olur. Yavaş değişen sinyalleri dijital bir multimetre ile izlemek zor olabilir. Alacaen ucuz ve en basit multimetre bile bu iş için yeterlidir.
Basic Bilenler İçin
MAKİNE DİLİ dilinin komut kodlarına biraz daha anlaşılır birer isim vermekten ibaret. Ör: A0, LDY demek-yani Load Y. B9, LDA, yani Load A demenin bir çeşidi. 20, JSR, yani Jump to SubRoutine demek. (Increment Y): C0-CPY (Compare Y); (Branch if Not Equal); 60-RTS (Return from Subroutine). Yani program, Assembly'de şöyle yazılabilir. —,
Kulüp üyeleri, Baytan Bitirmez'i Commodore Haberler Bülteni'ndeki Makine Dili yazılarından tanıyacaklar. Başladığı makaleleri pehlivan tefrikası gibi uzatıp hiçbiri bitirmemekle meşhur olan Baytan Bitirmez, aylardır sürdürdüğü sonuca varacakmış gibi gözüken yazılarını baştan almakla alanında yeni bir rekor kırmış oluyor. Dergi için yazı istemeye gittiğimizde, Baytan Bitirmez'in bilgisayar alanında inceleme ve denetlemelerde bulunmak üzere birkaç aylığına Isparta'ya gittiğini söylediler. Bizim tahminimiz, eski
Herhalde bülten okurlarından gelebilecek tepkileri düşünüp her ihtimale karşı bir süre ortadan kaybolmak istediği... JSR 0 İNY 32 So Hexadecimal (onaltılı) sayı sistemi- Makina dili-denilen gayriinsani dil. — BNE ni birkaç sefer anlattım. Aslında çok — PRINT, GET filan gibi yarı-ingilizce terimler basit. Decimal (onlu) sistemi biliyoruz. Bir sayı görünce otomatikman, sağdan sola ilk haneyi 1'le, ikinciyi 10'la, üçüncüyü 100'le, dördüncüyü 1000'le çarpıyoruz. Onaltılıda ilk hane * 1, ikinci hane * 16, üçüncü hane * 16*16 filan. Tabii 0'dan 9'a on rakam yerine, 0'dan 15'e 16 rakama ihtiyacımız var. diye gidiyor.
dec 1 10 15 16(1*16+0)
100=256 (1*16*16+0*16+0) Peki ya FFFF ne ediyor?
Bir de ikili (binary) sistem var. Bunun da numarası, yine sağdan sola, ilk hane*1, ikinci*2, üçüncü*4, dördüncü*8, beşinci*16, vb. Yalnız iki rakam var: 1 ve 0
Mesela: 000004100 4 01000100 68 401040410 — 170 41444414 — 255
Bunların hex karşılığı ise, sırasıyla; 01, 44, AA, FF. Dikkat edilsin; ikiliyi hex'e çevirmek, onluya çevirmekten daha kolay. Örneğin 8 haneli bir binary sayının sol yarısı, iki haneli hex sayının ilk (sol) hanesine, sağ yarısı ise ikinci (sağ) haneye karşılık düşüyor. 0100 = hex 4, 01000100 = hex 4d. 8 haneli binary ile ifade edebilecek en büyük rakam 11111111 = 2 haneli hex ile ifade edilebilecek en büyük rakam FF. Commodore'un kafası, bir defasında sadece 8 tane on-off (1-0) işaretini anlamaya yetenekli olduğundan, hex sisteminin neden kullanıldığını anlamak kolay. BASIC'in PEEK-POKE komutlarında niye hep 0 ile 255 arası sayıların kullanıldığı da böylece anlaşılıyor.
rimlerden değil, sıra sıra hex rakam-
lardan oluşuyor. Buyurun bir örnek:
A0 00 B9 DE CO 20 D2 FF
COO8: C8 CO 07 DO F5 60 4D 45
C010: 52 48 41 4241---
Bunun BASIC'teki karşılığı: PRİNT Denemesi bedava. Programcılığımızı CO00, yani 49152 adresinden başlatıp C014 (49172) adresinde bitecek şekilde düşündük Şimdi yukardaki 21 tane rakamın desimal — karşılığını hesaplayıp, 49152'den başlayarak sırayla POKE edin. (POKE POKE 49153,0: POKE Sonra SYS 49152 deyin. Ve seyredin. Birinci ilkemizi tahmin ettiniz de: Makine dili programlar, birer byfe'lik rakamlardan oluşuyor ve bellekte, bizim seçeceğimiz belli bir adresten başlayarak, her adrese bir byte olarak duruyor. BASIC'ten makine dili bir programı işletmek için, programın başladığı adrese SYS veriliyor. Bu rakamlar ne demek oluyor? Ramalların bazısı makine dilindeki komutların rakamsal kodları, bazısı ise komutu izleyen değerler. Her komutun, arkasında kaç sayı değer alacağı. komuta göre değişiyor ve sabit. Programcığımızın ilk rakamı olan A0, bir komut kodu. Makine buradan işlemeye başlıyor. A0 kodu, ardından bir rakam değer (parametre) alan bir kod. O halde 00 bir değer. Dolayısıyla, onu izleyen B9'un da kod olması şart (yoksa makine sapıtır). B9, 2 byte parametre alan bir komut. Programımızda bu değerler DE, CO. Sonra gelen 20 gene bir komut. 2 byte porametre (D2, FF) alıyor. C8 gene komut. Pararnetre yok. CO komut, 07 parametre. DO komut, F5 parametre. 60 komut: "İş bitti, geri dön” demek. 4D 45 52 48 44 42 41 ise merhaba demek. İnanmazsanız, üşenmeden bunları desimale çevirip, tablosundaki karşılıklarına bakın. Bu rakamlarla program yazmaya sadece deliler kalkışacağından, makine dilinin yarı insani bir dille tercümesi olan Assembly diye birdil daha icat edilmiştir. Assembly dili, makine
$'lar ve başka hususların ne olduğunu sırayla anlatacağız. Yalnız $ işaretinin hex demek olduğunu söylemek şimdilik yetsin. Yani bir yerde $10 gibi bir ifade görürsek, bunun, bizim bildiğimiz on değil, hex 10 olduğunu anlıyoruz. Bu dolar işaretinin BASIC'teki dizi anlamına gelen $ ile ilgisi yok.
Makine diliyle iştigal etmenin bir numaralı koşulu, bir adet Makine Dili Monitörüne sahip olmak. Televizyona benzeyen monitörlerle bir ilgisi olmayan bu monitör, kaset veya diskette bulunan bir program. Makine dili programları ve basit çevirileri yazmayı, okumayı, değiştirmeyi, işletmeyi vb. sağlıyor. Yazının devamını beklerken, yoksa, eşten dosttan bir tane monitör sağlamaya bakın; veya 41500 liraya kıyıp Teleteknik'ten istetin. Gelecek sayıda bir monitör programı dökümü vereceğim ama, ikibinbeşyüz küsur DATA'yı hatasız girmeye çalıştıktan sonra hâlâ bu diziyi izlemeye devam edeceğinize pek ihtimal vermiyorum. Bir de küçük yarışma: Elinize kâğıt kalem alın ve, 1) $A9$A6$1F$C0'nun desimal karşılığını, 2) “Merhaba” diyen makine dili programcığımızı bilgisayar belleğine POKE edecek BASIC programı yazıverin.
(ipucu: 10 FOR X— O TO 20
20 READ A
Elimize ilk geçecek doğru çözümün sahibine bir adet monitör kasedi acele postayla gönderilecektir. O