Yazar arşivleri: selimpehlivan

selimpehlivan hakkında

Sen anladın onu...

Vertical Counter’lar Kullanarak Digital Giriş Filtreleme

Klasik Yönteme Bir Örnek

Girişlerin kontak durumlarını ya da butonları okumamız gereken durumlarda sık sık giriş düzeylerini filtrelememiz gerekir. Buna iyi bir örnek, push-buttonlara tepki veren programların tuş kontaklarının yarattığı sıçramalar yüzünden yanlış sayıda basmalar algılamasıdır. Bu sorun özellikle butonun anlık durumunun program içinde çeşitli yerlerde doğrudan sorgulandığı küçük uygulamalarda oldukça can sıkıcı olabilir.

Bu yazıda ilk olarak bir projemizde kullandığım basit bir tuş okuma arayüzünü anlatacağım. Sonra da tuş sayısının arttığı durumlar için etkin bir çözüm olarak kullanılabilecek vertical counter uygulamasının kodunu paylaşacağım.
İlerleyen zamanda, kendi tasarımım olan bir klavyenin girişlerini nasıl okuduğum bilgisini de bu yazıya ekleyeceğim.

Projemizde üretimi pek de başarılı olmayan, ayrı bir tuş takımı levhası var. Bunun üzerindeki 10 adet buton işlemcimizin üstünde olduğu kontrol board’una giriyor. Programın çalışması sırasında belli anlarda belli butonlar okunmalı. Butonlardan bazıları basılı tutulduklarında düz basma işevinden başka işlevler yerine getiriyorlar.

Buton tarama işlerini farklı buton grupları için benzer işler yapan 4 farklı fonksiyon olarak yazdım. Bu uygulamada iki farklı buton grubu sanki birbirinden bağımsız iki arayüzmüş gibi çalışıyor.

Fonksiyonlardan her biri sorumlu olduğu butonlar için kabaca yukarıda gösterdiğim basit algoritmayı çalıştırıyor. Aşağıda bir buton okuması için çalışan lojiği (ve aynı zamanda kullanılan yerel değişkenleri) görüyorsunuz:

    // A1: basma durumu sorgulama
    if ( button_mask & 0x0001 )
    {
        if ( button_pressed.A1 == 0 )
        {
            if ( pcnt_A1 > BTN_PRESSCNT ) 
            {
              // TODO: burada birden çok seferde sıfırlanma  eklentisi olabilir.
                if ( btn_A1 ) pcnt_A1 = 0;      
            }
            else 
            {   
                if ( btn_A1 ) pcnt_A1 = 0;
                else
                {
                    ++pcnt_A1;
                    if ( pcnt_A1 > BTN_PRESSCNT ) button_pressed.A1 = 1;
                }
            }
        }
        /*
         * kullanıcı programının pressed flag'i sıfırlaması sonrası butonu bırakmadan
         * işlemin tekrarlanmasını istiyorsak burada
         * if ( btn_A1 ) pcnt_A1 = 0; sıfırlamasını ekleyebiliriz.
         */
    }

Burada tüm butonların taramasının tek bir fonksiyon içinde değil her grup için iki fonksiyonda yapıyorum. Çünkü benim uygulamada tuş takımındaki butonlardan ikisinin basılı tutma için ayrı işlevler yaptırması gerekiyor (button hold fonksiyonu). Buna konu butonların tarama işlerini ayrı bir fonksiyonda yazdım.
Ayrıca, basılı tutma okuma mantığı yukarıdaki mantıktan biraz farklı:

Yukarıdaki algoritmanın yürütülmesi şu şekilde oluyor:

    if ( button_mask & 0x0008 )
    {
        if ( btn_A4 )           // buton basılı değilse
        {
            if ( pcnt_A4 )  
            {
               if ( pcnt_A4 > BTN_PRESSCNT )   button_pressed.A4 = 1; 
               pcnt_A4 = 0;
            }   
        }
        else if ( button_hold.AM == 0 )
        {
            ++pcnt_AM;
            if ( pcnt_AM > BTN_HOLDCNT ) 
            {
                button_hold.AM = 1;
                pcnt_AM = 0;
            }
        }
    }   

Bu task fonksiyonlarını bir fonksiyon pointer dizisi olarak grupladım:

void (* ButtonRead_Task[] ) () = 
{
    Button_Idle,
    Button_Read_A,
    Button_Read_AM,
    Button_Read_B,
    Button_Read_BM
};

Ana programımda 5ms periyotlu bir sistem timer’ı var. Bu timer’ı taramaları zamanlamada kullanıyorum. Timer tick’i geldiğinde ana programdaki buton okuma indeks değişkenini 1 yapıyorum:
button_read_index = 1;

Bunun sıfırdan farklı bir değere ayarlamak ButtonRead_Task[ ] fonksiyon dizisinin ilgili elemanının işaretlediği task’in o taramada çağrılmasını sağlıyor. Bu sıralama son task (4 indeksli olan) çağrılana kadar arka arkaya her çevrimde yapılıyor ve sonra thread kapanıyor (one-shot operation).

    if ( button_read_index )
    {
        ButtonRead_Task[button_read_index]();
        ++button_read_index;
        // one-shot bir task sıralaması olduğu için tüm task'ler taranınca işlemler biter:
        if ( button_read_index > 4 )  button_read_index = 0;    
    }

Burada butonları sistem çevrimi içinde, programın en sonunda, başka her şeyden bağımsız olarak okuduğuma dikkat edin. Programım içinde herhangi bir yerde bana herhangi bir butonun basma durumu gerekirse artık butonun bağlı olduğu portun lojik değerine değil yukarıda gördüğünüz task’in çıktısına bakacağım. Ki bu da, programım dahilindeki tüm modüllerin erişimine açık olan;
BUTTON_FLAGS button_pressed;
değişkenidir.
Buradaki BUTTON_FLAGS tip bildirimi, uygulamamızda butonlara verdiğimiz isimlerin tanımlandığı bir struct veri tipidir.
Son bir not da buton okumasının yetkilendirilmesi ya da devre dışına alınması mekanizması hakkında yazayım:
extern void Enable_Button( unsigned int button_index );
extern void Disable_Button( unsigned int button_index );
isminde iki fonksiyon tanımladım. Bunlar, macro olarak tanımladığım buton isimlerini parametre olarak alıp, o butonu taramaya açıyor ya da devre dışına alıyorlar. Bir butonu taramaya almak yukarıda lojiğini verdiğim koddaki ilgili button_mask bitini 1 ya da 0 yapmaktan ibaret. Ben bu değişkeni kendi ünitesi içinde static olarak saklıyorum. Ek olarak, o kanal devreye alınırken dahili sayacı ve durum flag’lerini de sıfırlıyorum.

CoViD-19 Notları

Sanki 10 sene önceymiş gibi geliyor ancak bu koronavirüs de neymiş diye kendi aramızda konuşmaya, dünyaya yayılan bir salgına dönüşür mü diye senaryolar üretmeye kabaca Şubat 2020 başlarında başladık.

Depremi, Kızılay’ı, İdlib’i falan konuşup dururken Şubat sonu gibi İran sınırının kapatılmasından söz etmeye başladık. Oradaki salgının bize sıçraması söz konusuydu. Bu sırada salgının merkezi Çin hakkında inanılması güç şeyler duyuyorduk. Ama sanki Çin bize çok uzaktı. Hatta onlar kapalı bir ülkeydiler ve zaten çok da kalabalıktılar. Çin’deki durumun özellikle ilgimi çektiğini söyleyemem. Hatırladığım kadarıyla, bu işin çok tehlikeli bir salgın olduğunu çoktan anladığımız bir zamanda henüz uçak seferleri bile durdurulmamıştı.

Mart başında İran ve İtalya gündem olmaya başladı. Ancak gündemi özenle takip eden insanlar dışında kimsenin salgının bize sıçrayabileceği gibi bir düşüncesi yoktu. Bizim kendimize has gündemimiz bizi meşgul etmeye yetiyordu. 5 Mart’ta Erdoğan ve beraberindeki bir sürü bakanın kendi ısrarlarıyla gittikleri Rusya ziyareti, orada açık bir biçimde aşağılanmaları, İdlib’de sayısını bile tam bilmediğimiz şehitlerimizin katili Rusya önündeki onursuz duruşumuz virüs salgınından çok daha öncelikli konulardı.

10 Mart 2020 Salı

Bu korona virüs güncesinde somut tarihler vermeye başlamak için 10 Mart tarihini seçtim. 10 Mart’ta artık Avrupa’da salgın çok ciddiye alınmaya başlanmıştı. Bu tarihte Erdoğan Brüksel’e AB ile mülteci konusunu konuşmaya (para pazarlığı yapmaya) gitmişti. Erdoğan, görüşmenin yapılacağı binanın önünde kendisini bekleyen hayranlarına kısa bir konuşma yaptı. Elinde bir mikrofon, yüz-iki yüz kişilik bir gruba konuştu. Grup ile Erdoğan arasında basit bir polis bariyeri vardı. Erdoğan burada korona virüse dikkat edin dedi.
Aynı gün Sağlık Bakanı Fahrettin Koca, virüsün şu anda ülkemizde olması çok büyük bir ihtimal dedi.
Son birkaç gündür sosyal medyada burada not almayacağım birkaç virüs vakası tevatürü dönmekteydi.
Akşam üzeri, yakın bir tanıdığım mesaj yazdı ve “Kapalıçarşı’dan bir esnafta korona virüsü çıkmış, ilk ağızdan aktarıyorum” dedi. Tanıdığım bu haberi dün akşam (09 Mart) aldığını söyledi. Samimiyetimize binaen kendisiyle biraz dalga geçtim.
Aynı gece, Bakan’ın gece yarısı bir toplantı yapacağı duyuruldu. Ve Bakan, Türkiye’de ilk korona virüs vakasını duyurdu.

11 Mart 2020 Çarşamba

Yaşadığımız küçük kasabada bile akşam saatlerinde marketlerde yoğunluk oluşmaya başladı. İş dönüşü girdiğim hiçbir markette kolonya bulamadım.
Bu arada dünyanın dört bir yanından stok yapma ve market boşaltma haberleri gelmeye başladı. Ayrıca borsalarda tarihi değer kayıpları ve petrol fiyatlarında tarihi düşüşler görüldü.
Türkiye’nin resmen açıkladığı korona virüs bulaşmış hasta sayısı 1
Erdoğan günler sonra gözüktü. Korona önlem paketi diye madde madde bir şeyler anlattı. Konut alımında peşinat oranı düştü, uçak biletinin kdv’sini indi, yeni konan konaklama vergisi sonbahara kadar ertelendi vs.. Ayrıca 65 yaş üstüne de kolonya ikram edecekmiş. İnsan Fransa ve Almanya’nın açıkladığı salgın önlemlerini gördükten sonra (ki Erdoğan’ın kitlesi elbette görmemiştir) bunların muhalifler tarafından uydurulmuş kara propoganda yalanları olduğunu düşünüyor. Ama yarın yavşak medyada müjde diye anlatacaklar.

12 Mart 2020 Perşembe

Uçuşların devam etmesi, dışarıdan gelenlere önlem alınmaması gibi uyuşuklukların aksine, radikal bir karar alındı ve okullar Cuma gününden itibaren tatile sokuldu. Uzmanlar bunun çok yerinde bir karar olduğunu söylediler.
Öte yandan Cuma namazı için bir şey söylenmedi. Eğer artık içimizde virüslü insanlar dolaşıyorlarsa önlem amaçlı olarak cuma namazının iptal edilmesi gerektiğini düşünmek için uzman olmaya gerek yok. Ama nedense böyle bir şey yapmadılar.
Bu arada biz kendi çapımızda ufak ufak stok yapmaya başladık. Ofise gidip gitmeme konusunda kararsızdım ancak müşteri geleceği için mecburen gittim.

13 Mart 2020 Cuma

Bir çok Avrupa ülkesine uçuşların durdurulacağı duyuruldu. Uzmanlar bunun geç kalınmış bir hamle olduğunu söylediler.
İşe gitmedim. Cuma namazı cemaatle kılındı. Hutbede “kalabalık yerlerden uzak durun” demişler. Büyükbabamı aradım ve Cuma’ya gitmemesi için dil döktüm. Bir şey yok ki dedi. Ama yine de “belki gitmem” dedi. Sonradan gittiğini öğrendim.
Bu arada yazışmalarıma bakınca hayret ederek görüyorum ki, hâla virüsü o kadar da ciddiye almıyormuşuz. Epey bir dalga geçen, abartılıyor diyen, bir şey çıkmayacak diyen arkadaş varmış. Konuşmalardan birinde bir arkadaşa bugün İtalya’da 250 kişi ölmüş yazmışım.
Bu arada dünyadaki ekonomik çalkantı ve bizdeki dolar kuru yükselişi devam etti.
Bakan yine gece çıktı ve vaka sayısını 5 olarak açıkladı.

14 Mart 2020 Cumartesi

Amerika’da durumun kötüye gittiği ve devletin olayı pek ciddiye almadığı ortaya çıktı. Avrupa’da ise salgın giderek yaygınlaşıyor. Merkel bugün ya da daha önce “Alman halkının %70’i virüse yakalanacak” dedi ve bu nedense bize çok şok edici geldi.
Francois Balloux diye birinin yazılarını okudum. Adam bulaşıcı hastalıklar üstüne çalışan bir hesaplamalı sistem biyoloğu. Koronavirüs hakkında yazdığı öngörüler benim için şok ediciydi. Sanırım bu işin ne kadar ciddi olduğunu ilk bugün anladım.
Ayrıca bugün semt pazarına çıktım. Hayat normal gibiydi. İnsanların çoğu için koronavirüs maç muhabbeti gibi bir espri konusuydu.
Bu arada, sosyal medyaya umreden dönenlerle ilgili bazı iddialar düştü. Ankara-Samsun uçağındaki bir yolcunun anlattıkları inanılmaz. Umreden dönen kafileler yurda yayılıyorlar ve hasta oldukları iddia ediliyor.
Bakan bu geceki toplantısında vaka sayısını 6 olarak duyurdu.

15 Mart 2020 Pazar

Herkes Arabistan’dan gelen umrecileri konuşmaya başladı. Son gelen umre kafilesi karantinaya alındı.
Müsiad Kocaeli şubesi umreden dönenlerle hoşgeldin toplantısı yapmış ve bunu twitter hesaplarından paylaşıyorlar. Bir iki gün sonra paylaşımı kaldırdılar.
Birkaç AKP’li milletvekilinin ve önde geleninin umreye gittik geldik paylaşımları yaptıkları ortaya çıktı. Hepsi aynı anda paylaşımlarını kaldırdılar. Karantina olayının tıraş olduğunu düşünüyorum.
İtalya’da bugün 368 kişi ölmüş. Bizim onlar gibi olacağımızı söylüyorlar.
Migros’tan sağlam bir alışveriş yaptım. Marketler yoğun ancak genel olarak aradığını bulabiliyorsun. İnsanlar alışveriş yapsalar da raflar yenileniyor.
Bu iş hep böyle mi olacak? Bakan gece yarısı çıkıp önden biraz geyik yapıp arada da vaka sayısı mı açıklayacak? Yine gece çıktı ve vaka sayısı 18 oldu dedi.

16 Mart 2020 Pazartesi

Bu sabah işe gitmek için gemiye bindim ve içerisi kalabalık olduğu için üst katta açıkta oturdum. Hava çok soğuktu. Zaten biraz hasta gibiydim ve ofise gittiğimde epey kötü oldum. Akşamı zor edip döndüm. Artık işe gitmenin tehlikeli olduğunu düşünüyorum. Zaten herkes karantinayı konuşuyor. Öğrenci yurtlarının gece yarısı verilen bir emirle boşaltılıp apar topar umreden gelenlerin yurtlara yerleştirildiklerini görüyoruz.
Öte yandan, yurtlardan kaçan ya da kaçmaya çalışan umreci görüntüleri de gelmeye devam ediyor.
“Tiyatro, sinema, gösteri merkezi, konser salonu, nişan/düğün salonu, çalgılı/müzikli lokanta/kafe, gazino, birahane, taverna, kahvehane, kıraathane, kafeterya, kır bahçesi, nargile salonu, nargile kafe, internet salonu, internet kafe, her türlü oyun salonları, her türlü kapalı çocuk oyun alanları (AVM ve lokanta içindekiler dahil), çay bahçesi, dernek lokalleri, lunapark, yüzme havuzu, hamam, sauna, kaplıca, masaj salonu, SPA ve spor merkezlerinin faaliyetleri geçici bir süreliğine bugün saat 24:00 itibariyle durdurulacak.”
Ancak, AVM’ler hâla açık ve futbol müsabakaları iptal edilmedi.
Tayvan sağlık bakanı 4-13 Mart tarihleri arasında Türkiye’de olan 15 kişilik Tayvanlı turist grubunun 9 tanesinde korona virüsünün çıktığını söylüyor.
Artık ülkenin dört bir yanında virüsün kol gezdiğini tahmin etmek zor değil. Enfekte insan sayısının çok olduğu ama test yapılmadığı konuşuluyor.
Bu arada bana ilk vakanın haberini veren tanıdık ilk ölümün gerçekleştiğini de söyledi. Ancak bu bugün teyit edilmedi.
Diyanet cemaatle namaza ara vermiş fakat camiler açık olacakmış, isteyen gidip namaz kılabilecek.
Bakan vaka sayısının 47 olduğunu söyledi.

17 Mart 2020 Salı

Evden hiç çıkmadım. Karım, yakındaki semt pazarına gitti. Son kez pazar alışverişi yaptık. Ayrıca marketten de bir şeyler aldı. Marketlerde hâlâ hemen hemen herşey bulunuyor. Ancak oldukça yoğun bir ortam var. Artık girip çıkmayı bırakmamız lazım.
Umrecilerin KYK yurtları için “burası ahır gibi” diye isyan etmelerinin videoları çıktı. Arabın havlu sarılmış taşının etrafında dönmek için para saçan şerefsizlerin gariban öğrencilerin kaldıkları yurtları beğenmemesi tarihe düşülecek bir not.
Ayrıca, karantinadan çıkacağız diye eylem yapan hacılardan polisin yüzüne tükürenler olduğu da iddia edildi (ben hastaysam sen de hasta ol).
Benim açımdan önemli bir olay da, ilk vakayı haber veren tanıdığın söz ettiği Kapalıçarşı detayı gün yüzüne çıktı. Tam korumalı kıyafetlerle çarşıyı dolaşan görevliler esnafa ateşiniz var mı diye anket yapıp almaları gereken tedbirleri anlatırken “biliyorsunuz ilk vaka buradan çıktı” diyorlar. Esnaf da her zamanki puşt bakışlarıyla görevliyi kesiyor. Açıkçası ben bugün, çok yakında artık gizlenemeyecek bir vaka patlaması olacağını düşünmeye başladım.
Bugün Eski Kara Kuvvetleri Komutanı Aytaç Yalman Paşa’nın koronavirüs sebebiyle öldüğü haberini okudum. Bununla ilgili resmi bir ayrıntı yok. Hatta henüz ölüm ilanı bile yapılmadı.
Bakan geceki toplantısında vaka sayısını 98 olarak açıkladı ve ilk kaybımızı verdik dedi.

18 Mart 2020 Çarşamba

Arabayla ofise gittim, almam gereken son bir iki şeyi aldım. Oradan köye gittim ve biraz erzak aldım. Anneme de bir şeyler götürdüm. Eve bile girmedim. Annemle bahçede iki metre mesafeden ayak üstü konuştuk.
Arabanın deposunu doldurdum. Benzincide Rebul kolonyası bulmam güzel bir sürpriz oldu. Herkes normal hayatını sürdürüyor, yalnızca dışarısı birazcık daha sakin, hepsi bu. Akşam hava bozdu.
Bu arada ölüm haberine dair anlamadığım şeyler var. Biz birkaç gün önce duymuştuk fakat Bakan’ın bahsettiği vaka başka biriymiş. Kısa sürede bu kişinin Beyoğlu’nda eczanesi olan biri olduğu, adamın doktor olan oğlunun yurt dışından getirttiği tahlil kiti ile corona tanısını kendilerinin koyduğunu öğrendik.
Artık birilerinin yumuşak üslubunu beğendiği Sağlık Bakanı’nın hiç de şeffaf olmadığını kesin biçimde anlamış olduk.
Ankara Üniversitesine görevli bir kadın doktorun sağlık görevlilerine verdiği bir kişisel korunma brifinginin gizli çekim görüntüleri yayıldı. Videoda doktor hanım, “başta iyi gidiyorduk ama bu umre işi yüzünden iş çığrından çıktı, artık binli sayılardan söz ediyoruz” diyor.
Bakan bu geceki toplantısında vaka sayısının 191 olduğunu söyledi ve ölü sayısının 2 olduğunu açıkladı.

19 Mart 2020 Perşembe

Artık tam karantina durumundayız. Bugün eve damacana ve pet şişe su söyledim. Damacanayı içeri almadan önce izopropil alkol ile güzelce sildim. Pet şişelerin de poşetlerini bıçakla kesip şişeleri öyle içeri aldım. Bir süreliğine, dışarıdan son aldığımız şey bu olabilir.
Dün konuşması sızdırılan kadın doktorun adı sanı belli oldu. Ankara Üniversitesi kadının savunmasını almış ve bunu basın açıklaması diye duyurmuş. Kadının söylediklerinden hiçbirinin yalanlanmadığını ama açıklamaların halkı korkutması dolayısı ile bir savunma alındığı anlaşılıyor. Durum bence doktorun söz ettiğinden bile beter.
Son iki-üç gündür “Singapur ya da Güney Kore gibi ilerleyişi baskılayamayacağımızı anladık, bari İtalya gibi olmayalım” düşüncesi hakimdi. Ancak şu ana kadarki gidişat İtalya’nın benzer dönemine göre daha kötü gözüküyor.
Bugün gün içinde Aytaç Yalman’ın vefatının koronavirüs sebebiyle olduğu resmen duyuruldu. Bakan gece vaka sayısını 359 ve ölü sayısını 4 olarak açıkladı.

20 Mart 2020 Cuma

Bugün sabah hava kapalıydı, hatta yağmur çiseledi. Sonra öğleden sonra hava tamamen açtı ve güneş tüm gücüyle parladı. Ve herhangi bir cuma öğleden sonrasında sahile çıkabilecek kadar insan çıktı yine dışarı. Evin dışarı bakan penceresi olmayan tek odası benim çalışma odam. Oradan çıkıp akşam güneşinin vurduğu, sahile bakan salona çıkınca “lan acaba bu karantina işinde yanlış yapan biz miyiz yoksa” diye düşünmeden edemedim. Güneşi gören sahile akın etmiş. Akşam üzeri araba trafiği de epey arttı. İnsanlar bu işi kesinlikle ciddiye almıyorlar.
Gece de asker uğurlama konvoyları geçti evin önünden. İnternette, Ankara, İstanbul ve Konya otogarlarından inanılmaz asker uğurlama görüntüleri gördüm. Böyle toplu “gösteriler” sonrası bu salakların askere gitmesi iki hafta sonra bir ulusal güvenlik sorununa dönüşebilir mi? Hiç ihtimali yok diyebilecek var mı?
Gece bir haber çıktı: Devlet belli özellikleri karşılayan özel hastanelerin yönetimini devralıyormuş. Ayrıca acil servisler için de hazırlıklar yapılacakmış.
Taksiciler İstanbul’da eylem yapmışlar. Müşterimiz azaldı diye. Sarı teröristler yine şaşırtmadılar anlayacağın.

Akşam İtalya’daki günlük bilanço açıklandı. 627 kişi ölmüş. Boğazım düğümlendi görünce. Bu gerçekten inanması güç bir sayı.
Sonra, âdet olduğu üzere gece yarısı bizdeki sayılar açıklandı. Vaka sayısı 670 ve ölü sayısı da 9 olmuş.

21 Mart 2020 Cumartesi

Sabah kahvaltıdan sonra dışarı çıktık. Umay scooter’ıyla hız denemeleri yaptı biz de annesiyle yanında koştuk. Etrafta pek insan yoktu. Hava güneşli ama soğuk. Denk geldiğimiz bir kaç kişi buralarda oturan her zamanki tipler.
Öğleden sonra herhangi bir güneşli cumartesi gününde göreceğimiz şeyleri görmeye devam ettik. İstanbul’da mesire alanlarının girişlerinde araç kuyrukları, sahillerde o bildik kalabalıklar.. “Güneşli havayı fırsat bilen vatandaşlar sahillere akın etti” yani.
Diğer taraftan yolu hastaneye düşmüş herkes hastanelerin ya kapatıldığını, ya ağzına kadar korona şüphelisi dolu olduğunu ya da kaos olduğunu anlatıyor.


Akşam, 65 yaş üzerine sokağa çıkma yasağı getirildiğini duyurdular. Bunun için şu güneşli cumartesi hatta cuma gününün geçmesini beklemek aptallıkla açıklanabilecek bir şey değil. TV ve sosyal medyaya bakınca bu iş sanki 65 yaş üstünün sorunuymuş gibi bir kamuoyu yönlendirmesine girişildiğini görebiliyorum. Belediyeler bankları söküyor, yaşlı ihbar hatları açılıyor, indirimli yolculuklar iptal ediliyor vs. 65+ insanlar sokağa çıkmazsa salgının kontrol altına alınacağı gibi bir kamuoyu oluşturmaya çalışıyorlar. Oysa bizden 2 hafta kadar ileride olan ülkeler artık tamamen sokağa çıkma ve alan tecriti aşamasına geçmiş haldeler. “Şimdilik” 65 yaş üstüyle uğraşarak önlem alıyor gözükmek sadece aptallıktan yapılan bir şey değil: Herkesi eve kapatırlarsa, bunu yapan diğer ülkelerdeki gibi, fatura ödemelerine ve maaş katkılarına mecbur kalacaklar. Böyle tedbirlere ayrılacak bir kaynağımız var mı bilmiyorum ancak olsa bile bizim bunu tercih etmeyeceğimizden eminim. Dünyanın en kapitalist ülkelerinden biri Türkiye. Günlük çalışıp yiyen insanların ekonomik kırılganlığına sahibiz. Günlük vergi toplamamız lazım. Bu yüzden, toplu taşımayı durdurmuyoruz, sokağa çıkma yasağı getirmiyoruz, son ana kadar hava taşımacılığını durdurmuyoruz, Avrupa’da futbolu en son iptal eden biziz, AVM’leri bile kapatmıyoruz. Çünkü insanlar dışarı çıkıp vergi ödemezlerse devasa kutsal devletimiz aç kalır.

22 Mart 2020 – Pazar

Dünün aynısı bir gün. Biz evden dışarı adımımızı bile atmadık ama evimizin önünden yine yüzlerce insan geçti durdu. Yalandan bir 65 yaş üstüne dışarı çıkma yasağı muhabbeti var yalnızca. Bugün dışarıyı seyretmek için pencerenin önünde durduğum her seferde birden çok ihtiyar gördüm, evin önünden geçen.
Dünyanın dört bir yanından sokağa çıkma yasağı haberleri geliyor. Normal dünya bu işi kesinlikle ciddiye alıyor. Bizde ise, çıkmasanız daha iyi olur gibi bir durum var. Bu akılsızlığın nedeni ne diye düşününce aklıma gelen en iyi senaryo (ki iyimser olmak adına yalnızca onu not edeceğim) şu: Kısa bir süre sonra işler çok çirkinleştiğinde suçlu bugün söz dinlemeyen insanlar olacak. Çünkü ülkemizi bir milyon yıldır tek başına yöneten iktidarın, daha doğrusu tek bir kişinin asla hiçbir konuda hatası olmuş olamaz. Bizim devlet denen şeyin tek derdi bu. Daha doğrusu, başkanlık sistemi denen şeyin olayı buymuş. Daha önce çok güzel örneklerini görmüştük ama korona günlüklerinde bunu en başında not etmeden geçemem.

İnsanlar, özellikle de yaşlılar bir şekilde, daha önce görmedikleri şeylere karşı tepki üretemiyorlar. Bu günlerde yaşadığımız örnekte bu, dışarı çıkmadan duramama şeklinde tezahür ediyor. Ancak bu iş bir hafta-on gün sonra sağlık sisteminin çökmesi şeklinde bize dönecekse yapılacak olan şey devletin gücünü kullanıp buna bir şekilde engel olmak değil midir? Yemekhane ücretine gelen zammı protesto eden öğrencilere ya da dünya kadınlar günü için toplanan göstericilere karşı gösterilen kesin kararlılık niçin böyle yaşamsal bir konuda gösterilmiyor? Bu yazıyı okuyup buna alternatif yanıtı olan arkadaşların söyleyeceklerini merakla bekliyorum.

Benim yanıtım, hayatın bana öğrettiği yoldan geliyor: En makul/muhtemel yanıt en basit olandır. Kısa bir süre sonra işler kontrolden çıkacak ve şimdi yandaş/yalakaların medyalarında sürekli gösterdikleri söz dinlemeyen insanlar (yaşlılar) simgesi, yarınki felaketin sorumlusu olacak. Günlerdir niçin yaşlıları konuşuyoruz, ne zaman bu formatı yedik, bilemiyorum. Bu virüsten en büyük hasarı yaşlılar alıyor ancak virüsü her yaştan insan taşıyor. Eğer derdimiz bunun yayılımını zamana yaymak ve sağlık sistemimizin çökmesini engellemek olsaydı toplu taşımayı hemen durdurmuş olmamız gerekirdi. Ayrıca kesin bir biçimde sokağa çıkma yasağı ilan etmemiz gerekirdi. Ama dün de yazmıştım, biz insanların sokağa çıkmalarına, olan ve daha da iyisi olmayan paralarını harcamalarına göre dönen bir dünya kurmuşuz. Bundan çok kısa süreliğine bile feragat edemeyecek kadar kritik bir durumdayız. Sağa sola nizam verme, halifelik etme gibi bir iddiamız var ama belli işlerde çalışan insanlara “evinizde kalın faturanızı ödeyelim, asgari ücreti biz verelim” diyecek kadar gücümüz yok. Çünkü devlet olmanın sıfırıncı gereği olan, “zor zamanda maddi yükü karşılamak” koşulunu yerine getirmek için gerekli her şeyi tasarruf etmememiz gereken itibarımıza harcamışız. Belli bir zeka seviyesini ikna etmeye odaklı bir propoganda için kamunun parasını saçmışız. Memleketin ahalisinden topladığımız vergileri, yıllar içinde kurulmuş ve büyütülmüş varlıklar, burada yazarsam başıma yok yere iş alacağım bir kriminal zenginleşme çetesine mama etmişiz. Yetmemiş, geleceğe borçlanmışız, haraç taahhüdüne girmişiz. Millete evden çıkmayın diye samimiyetsiz mesajlar verenler geçiş garantili köprüler, yolcu garantili havayolları “yaptırmış”. Bunlara uçurulacak garanti paralar, hastanelerde hayatını tehlikeye atan çalışanların ekipmanlarından kısılacak. Bugün Cerrahpaşa Tıp Fakültesi’nin ihtiyaç listesi ve bunların alımı için açılan yardım hesabının IBAN numaraları yayınlandı.

Yarım ağızla evden çıkmayın diyen yüzsüzlerin, evde durun, faturanızı biz vereceğiz, işinizi kaybetmeyeceksiniz, priminizi/maaşınızı biz ödeyeceğiz diyememesi, bu yüzden de yarın işini kaybetmemek için evden çıkması gereken milyonlarca insanın vebali kimin boynunda? Her söylenene inanan aptallların, soysuzların, yavşakların ihanetinin bedelini hep birlikte ödeyeceğiz.

Dünyanın büyük küçük bir sürü devleti yardım paketleri, radikal önlemler vs. açıklarken biz bugün koruma altındaki arazilerin madencilik turizm vs. için imara açılması üzerine bir kanunun yürürlüğe girdiği haberini aldık. Ben buna yorum yapmıyorum. Buraya kadar okuyabildiyseniz yorumu kendiniz yaparsınız. Sizden iyi anlatacak değilim.

Benim bugünkü korona notlarım bunlar. Ha, sırf kaydetmek için bugünkü vaka sayılarını da vereyim: Vaka sayısı 1236 ölüm de 30 insan olarak açıklanmış. Bugün 2950 test yapılmış. Yapılan test sayısı günden güne azalıyor. Bunun mantığını anlayabilmiş, hatta bir yorum bile yapabilmiş değilim. En son baktığımda bugün Amerika’da 14000 kadar yeni tanı konmuştu. Bir günde kaç test yapıldığını siz düşünün. Bugün daha fazla yorum yapmak istemiyorum. Merkel’in kendisine aşı yapan doktorun pozitif çıkması üzerine kendini karantinaya alması da son notum olsun.

23 Mart 2020 – Pazartesi

Günler birbirinin aynısı olmaya başlıyor. Evde olmak zorunlu olunca sıkıcı olabiliyor. Evden çalışmaya oldukça alışık biri olmama rağmen ilk günler pek işe odaklanamıyordum. Son iki gündür verimli çalışabilmeye başladım. İlginci, yavaş yavaş müşteriler de artık eve kapanmanın ve evden bir şeylere devam etmeye çalışmanın istisnai bir durum olmadığını anlamaya başladılar.

Her ezan okunduktan sonra müezzin “evlerinizde kalın, bu çok önemli” gibisinden şeyler söylüyor. Ancak sayısı az olsa da bizim sahilde her daim insan ve araba var. Bugün havanın bozması ortalığı biraz daha tenhalaştırdı ama yine de epey insan dışarıda dolaşıyor.

Dün yazdığım şeyi bugün de tekrar edebilirim: Salgının yayılmasını sanki yaşlılar sokağa çıkmazlarsa engelleyebilecekmişiz gibi aptalca bir fikre kapılmışa benziyoruz. Sokakta yaşlı gördüğünde taciz edenlere, yaşlılarla ilgili düşük zeka ürünü esprilere rastlayıp duruyorum. İnsanların çoğu neler olup bittiğinin zerrece farkında olmayan ama ilgi çekmek için sürekli kendisine sunulan tasarlanmış bilgiler üzerinden espriler yapıp gündem belirlemeye çalışan budala ergenler gibi davranıyor. Bu, manipüle edilmesi oldukça zahmetsiz bir kamuoyu.

Bugün bilim kurulu toplandı. Akşam üstü bir-iki arkadaştan sokağa çıkma yasağı çıkacağına dair fısıltılar duydum. Çok kesin konuşan arkadaşlar vardı. Kendilerine anlık olarak, bizimkilerin böyle bir şey yapmalarını beklemediğimi söyleyerek onlarla bir nevi “iddiaya girdim”.

Akşam sağlık bakanı televizyona çıkıp uzunca bir giriş edebiyatından sonra işi önlem alalım, dışarı çıkmayalım vs. nasihatlere getirince iddiayı kazanmış oldum. Sokağa çıkma yasağı getirilmemiş olmasını aslında fena bir şey değil: Birincisi, açıklanan vaka sayılarını falan bir kenara bırakırsak, gerçek durumun kontrolden çıkmadığını gösteriyor. Ben artık böyle olduğundan eminim. İkincisi, ben zaten dışarı çıkmıyorum. Birilerinin dışarıda olabilmesi hayatın normal devam etmesi sonuçta kötü bir şey değil. Üçüncüsü, bir gün dışarı çıkacaksak, bu salgının çok uzun bir zamana yayılmadan ama sağlık sistemini de çökertecek kadar kısa bir sürede de patlamadan olabilecek herkese bulaşması kendini iyi koruyabilenler için bir avantaj.

İtalya’da dün ölüm sayısı biraz azalmıştı. Bugün yine 600’ü geçmiş. Orada artık salgının zirveye ulaşması ve azalması bekleniyor. Bir yandan, benzer ülkelerdeki iki hafta sonraki gidişatı da izliyor olduğumuz için durum daha da üzücü. Çin’in onlara yaptığı tıbbi malzeme yardımını, nakliyatı sırasında Polonya ve Çekya çalmış. Avrupa ideali dedikleri şey güçlü bir Almanya’dan başka bir şey değil.

Bugün biraz yabancı haber kanallarını izledik. Epeydir haber kanalı izlemediğimi fark edip biraz hüzünlendim. Gördüğüm kadarıyla Amerika’da durum hızla kötüleşiyor. Adamların vaka sayısında resmen patlama oldu. İspanya Fransa Belçika ve Yunanistan’da sokağa çıkma yasağı var. Almanya’da kısmen var. Merkel kendini karantinaya almış (doktorunda korona çıkmış). Bu işin getireceği ekonomik yıkım nasıl olacak, neleri değiştirecek göreceğiz.

Bugün 293 yeni tanı konduğu ve 7 kişinin öldüğü açıklandı. Son iki gündür yapılan test sayısı azalıyordu. Bugün 3672 testle neredeyse dünün iki katı kadar test yapılmış. 80 milyonluk ülkede yalnızca bu kadar şüpheli varsa durum aslında bizim düşündüğümüz kadar kötü değil demektir ve böyle olmasını umarım. Bakan Çin’den hızlı test kitleri geldiğini, sayının belirtilmeyen bir tarihte bir milyona çıkacağını anlattı. Ayrıca Çin’de denenen bazı ilaçları da getirdiklerini ve durumu ağır seyreden vakalarda deneneceğini anlattı. Yerli ve milli solunum cihazımızı yapıyormuşuz. Yerli uçak, araba vs. saçmalıklarından sonra böyle mantıklı bir yerli üretim çabası görmek de güzel. En hoşuma giden de, aşı için çalışmalar yaptıklarını ve üniversite ve enstitülerin aşı çalışmalarını desteklediklerini anlattı. Bunlar güzel gelişmeler. Zaman geçtikçe insanların makul önlemleri bulacaklarına inanıyorum. Fakat işte o zaman yeterli mi onu göreceğiz. Hastalığın ilerleme süresi hakkında öğrendiklerimize bakarak bu hafta içi yayılımla ilgili bir fikrimiz olur diyordum. Şu anki durum çok kötü durmuyor. Umarım ki bu derdi başından aşkın ülke bu belayı çok yara almadan atlatır.

24 Mart 2020 – Salı

Bugün camiden ezan saati dışında da “dışarı çıkmamanız sağlığınız için iyidir” türü bir uyarı yapıldı. Komik olan, uyarının yapıldığı caminin dibinde semt pazarı kurulmuş olması ve bu pazara bir sürü insanın gelmiş olması. Bizimkilerin ısrarla “evden çıkmasanız daha iyi” derken normal hayatın akışına bir müdahalede bulunmamaları gerçekten de ilginç.

Tekrar yazmam gerek, sanki 65 yaş üstü insanlar eve kapatılırsa bu iş çözülecekmiş gibi bir hava yaratıldı. Sokaklarda yaşlılara saldıran, taciz eden insanlar türedi. Bu insanlar kendilerine “dayatılan” gündeme niye bu kadar çılgınca atlıyorlar anlamıyorum.

Bir diğer mesele de “maske” meselesi. Koskoca Türkiye’de koruyucu tıbbi maske ve dezenfektan sıvı üretme işi meslek liselerine kalmış. Üstelik yandaş yalaka basın bunu müthiş bir başarı hikayesi gibi her haber bülteninde köpürte köpürte anlatıyor. Oysa ki okullar kapalı ve bu bildiğim kadarıyla meslek liselerini de kapsıyor.

Bugünkü bilanço açıklamasında (ki bakan geceleri tweet atıyor, öyle öğreniyoruz) bu iş resmen başladığından beriki en büyük hasta sayısı artışı duyuruldu. 343 yeni hasta var ve 7 kişi de ölmüş. Böylece resmi hasta sayımız 1872 olmuş oldu. Dünyada şu an gündem olan ülkelerdeki sayılara göre bizdeki sayılar çok büyük değil.

Bu arada, bilgiye ulaşmak söz konusu olduğunda her ayrıntıda Ortadoğu’da yaşadığımızı hissediyoruz. Amerika şu an çok hızlı bir vaka artışı ile karşı karşıya. Basit bir google araması ile şehir şehir istatistiklerin verildiği çok ayrıntılı tablolara ulaşılabiliyor. Hatta, yurt dışında bu virüs yüzünden ölen Türklerle ilgili bile çok net bilgilere hemen ulaşılabiliyor. İşin en aptalca kısmı, bizim onursuz medya dış ülkelerle ilgili çok ayrıntılı bilgiler de paylaşıyor. Bizde sorun, kendi ülkemiz hakkında bilgi almak. Televizyonda gördüğüm pek çok dünya haberini izlerken “ulan bu iş bizde olsa böyle verirler miydi” diye sormadan edemiyorum. Cevabı çok net belli bir soru bu.

25 Mart 2020 – Çarşamba

Birbirinin aynısı günlerdeyiz. “Sakın dışarı çıkmayın ama işe gitmeniz konusuna biz karışmayız” tıraşı devam ediyor. Koskoca devlet, herkesin kişisel ekonomisinin en büyük ortağı devlet, ücretli kesimi patronunun insafıyla başbaşa bırakıyor. Bir de “kendi OHAL’ini ilan et” gibi saçma sapan bir laf uydurmuşlar, söyleyip duruyorlar. Erdoğan’dan Bakanlara kadar, TV’ye çıkan herkes de evde kal Türkiye diyor. Sanırım devletimiz bize genel bir grev çağrısı yapıyor. 🙂

İki-üç aydır inşaat şantiyelerinde çalışan işçilerin insanlık dışı görüntülerini görüyorum. Vatandaşını, asgari ücretinden bile vergi kestiği kölesini düşünen bir devlet yemekhanede yemek yemek tehlikeli diye ekmek arası ıspanak veren mütteahite bir ne yapıyorsun derdi, değil mi?

Bugün ay başında kesilmiş trafik cezalarının ve Turkcell’in icra takiplerinin tam gaz müşterilere ulaştırılmaya devam edilmesi haberleri okudum. Buz gibi bir Mart ayı geçiriyoruz ve evde kalan insanlar dünya piyasasının üç katı fiyatına yaktıkları gazın parasını da bir şekilde ödemeliler ki dükkan dönsün, değil mi? Bir de, bankalar kredi borçlularının borçlarını sağlam faizlerle “öteliyor”larmış. Kapitalizmin en saf halini yaşıyoruz. Teşebbüs hürriyeti diye ben buna derim işte. Devlet gölge etmiyor, ondan başka ihsan da beklemiyoruz. Fakat kolonyaya zam yapan esnafa fırsatçı denmesini ya da patates soğan fiyatı yükselince deposu olan adamları terörist ilan etmelerini bu ultra neoliberal kapital felsefeye yakıştıramıyorum. Bakan maske üreticilerinin yurt dışına satmak için devlete maske vermediklerini anlatıyor iki seferdir. Bu olay üstüne kitap yazılır aslında da biz bakıp geçiyoruz. Devlet, kimse benden daha kapitalist olmayacak mı diyor nedir?

Bu akşam Eğitim Bakanı ve Sağlık Bakanı birlikte basın toplantısı yaptılar. Şiir okuma faslında “büyüklerimizi, arkadaşlarımızı telefonla arayıp hatır soralım, telefon sohbetlerin uzatalım” lafları sarf edildi. Vodafone bana sms atıyor ve kontörlü hat sahibi yakınlarıma kolayca kredi kartı ile kontör alabileceğimi müjdeliyor. Hafızam beni yanılmıyorsa ben bu müjdelenen sihiri 15 sene önce falan yapıyordum.

Yaşlılar, yaşlılara kötü davranan bir elemana huzurevine gitme cezası verilmesi, meslek liselerinde maske üretilmesi, Avrupa ve Amerika’nın süreci kötü yönetiyor olmaları bizim şerefsiz medyanın gündemiydi bugün de. Uzun uzun kobilere maaş ödemeleri kadar kredi vereceklerini, asgari ücret yardımı yapacaklarını, kamuya sağlık personeli alacaklarını (ne alakası varsa) anlatıp duruyorlar. O kadar uzun anlatıyorlar ki insan şüpheleniyor.

26 Mart 2020 Perşembe

Bugün bir haftadan sonra dışarı çıktım. Yollar pek tenha sayılmaz. Marketler de öyle. Virüsün çok ciddi bir şey olmadığını düşünen pek çok insan olduğunu görüyorum. Dışarıya çıkmak tek başına en tehlikeli şey olmayabilir ancak markete gitmek kesinlikle öyle bence. Gerçi şu sıralar en tehlikeli şey bir sağlık kurumuna gitmektir diye düşünüyorum.

Kişisel olarak artık sosyal medyayı daha az takip etmeye ve daha çok uyumaya karar verdim. Bu virüsten kendimizi korumamız uzun vadede imkansız. Bari geldiğinde onu hak ettiği şekilde karşılayacak güçte olalım. Dün dışarı çıkarken kafamda bira almak vardı ama bu düşüncelerle bundan vazgeçtim.

Bugün, diğer günlerden çok da farklı değil. Ama not edilmeye değer bir şey var. Birincisi; Kanal İstanbul projesinin ilk ihalesinin BUGÜN yapılmış olması. Bu günlerden geriye kalacak şeylerden biri kesinlikle 26 Mart 2020 günü çekilmiş şu fotoğraf olacak:

Kasabın et derdinde olması durumunun en uç örneklerinden biri olarak şu foto gelecekte bu günlerden söz edilirken hatırlanmalı bence.

Kasabın et derdinde olmasına başka bir örnek daha verelim. Bildiğim kadarıyla inşaat şantiyelerinde ve tersanelerde işçiler aynı pis düzenle çalışmaya devam ediyorlar. Bununla ilgili, normal zamanda bile kabul edilmeyecek görüntüler görmeye devam ediyoruz. Üç kuruşa can güvencesi olmadan çalışan İstanbul’da bir şantiyede, yemekhanenin pisliği pisliği çok kişinin gündemine düşünce ekmek arası vermeye başlamışlar. Namussuz herifler, ekmeğin arasına ıspanak koyup işçilere vermişler:

Resim

İşçiler solcuları sevmiyor, sermayedarlar da liberalleri. Boş kalan meydanda da, dinci popülistler ülkeyi hiç bir zorlukla karşılaşmadan iliklerine kadar sömürüyor işte. Kendi OHAL’ini ilan edemeyen işçi kardeşlerim de ekmek arası ıspanak yiyor.

Bugün resmi olarak tespit edilen yeni hasta sayısı 1196 olmuş. Son üç gündür her gün bir öncekinden daha fazla yeni tanı sayısı açıklanıyor. Benim İtalya’daki gidişata bakarak tahmin ettiğim zamanda, tahmin ettiğim şekilde “vaka patlaması” aşamasına gelmişiz gibi gözüküyor. Şu anda 3629 “resmi” koronavirüs hastamız var.

27 Mart 2020 – Cuma

Bugün, bana ilginç gelen bir şey ile başlayayım:
Bir takım insanın Beştepe dediği ancak normal vatandaşlar tarafından Saray olarak bilinen yerdeki büyük ve lüks camide, Cuma namazı kılınmış. Namazı Diyanet İşleri Başkanı kıldırmış. Cemaat, davet usulüyle toplanmış. Çoğu din adamıymış.

Resim

Spot ışıkları, uçan kameralı çekimler (jimmy jip), ses düzeni vs. ile epey ciddi bir prodüksiyon yapmışlar. Etrafta dolaşan haberlere göre ülkede cuma namazının bir yerde bile olsa kılınmasının zorunlu olduğuna dair bir dini görüş varmış. Bunu İskenderpaşa diye bilinen bir cemaatin adını şu an hatırlamadığım hocalarından biri söylemiş. Sonra da işte yukarıdaki gibi bir dini tören düzenlemişler.

İnsan on yıllar boyunca gözleri ve yorum yeteneği açık bir şekilde müslüman bir ülkede yaşayınca “İslam’da ruhban sınıfı yok, kul ayrımı yok” laflarının fazlasıyla çocukça iddialar olduğunu biliyor elbette. Açıkçası ben uzunca bir süredir kimin ne tür dini törenlere katıldığıyla da pek ilgilenmiyorum. Ama toplumun tamamının sağlığını ilgilendiren bir tehdidin ortasındayız. Almanya’da ikiden fazla insanın bir araya gelmesi yasaklanmış. Kimsenin şüphesi yoktur ki, bunlar cuma namazı kılınabilir dese, yüzbinlerce insan düşünmeksizin camileri de dolduracak. Böylesine hassas bir durumda, şu şovu yapmanın gereği ne idi, keşke İskenderpaşa’dan tanıdık falan olsa da sorabilsem. Vergilerimizle büyüttüğümüz deve soracak sorum zaten yok.

Din nedir, pek çok insan ondan neden uzak duruyor, onun neden bireysel alanda kalmasını istiyor, bunu bu örnek üzerinden bir kez daha yazayım: Din popülizmdir. Konunun sümerlerin antik hikayeleriyle ya da Arap mitolojisiyle falan inanın çok az ilişkisi var. Yani, dine mesafeli olan insanların çoğu dindarların sandığı gibi, onların kutsal sembollerine düşman falan değil. Gücü elinde tutanlar, neredeyse maçları bile iptal etmeyeceklerdi ama futbol kurumsallaşmış dinden daha yeni bir zımbırtı olduğu için onun ikna ediciliği daha çabuk tükendi.

Bu akşam, bilim kurulu toplantısı sonrasında Sağlık Bakanı bir basın toplantısı daha yaptı. Anlattıklarını tek tek yazmak yerine anladığımı not edeyim: Bilim kurulu (ve galiba Sağlık Bakanı da) toplu taşımanın iptal edilmesini ve zorunlu karantinaya geçilmesini istiyor. Ancak bu konuda karar verme yetkileri yok. Sağlık Bakanı ısrarlı sorulara cevaben gerekli açıklamayı Cumhurbaşkanı yapacak deyip lafı kesti.

Sonra akşam Erdoğan çıktı. “Gönüllü karantina” diye bir şey uydurmuşlar, ondan dem vuran bir yazı okudu. Kendi OHAL’ini ilan etme saçmalığından biraz daha mantıklı olsa da pazartesi işine gitmeye mecbur olan insanlara başınızın çaresine bakın demeye devam ediyor devletimiz işte. Şehirlerarası otobüs yolculuklarının izne tabi olacağını, piknik yerlerine ve sahile çıkmanın haftasonları yasak olacağını söyledi. Bunlar güzel, hiç yoktan iyi ama bence yumuşak önlemler. Sayılara bakınca biz kötü bir yere doğru gidiyoruz gibime geliyor.

Bu arada karantinaya alınan bölgelerin haberleri gelmeye başladı. Bildiğimiz yerler Rize, Adıyaman ve Van’dan belde ve köyler..

29 Mart 2020 Pazar

Memleketin başka yerlerinden de karantina haberleri gelmeye devam ediyor. TV’yi açtığımda Yozgat’ın kırsalında bir köyün girişini tutmuş jandarmaları gösteriyorlardı. Haberini yapmalarına izin verilmesi de bize bir şeyler anlatıyor. Bunlar bence olumlu tepkiler.

Camilerden, her ezan sonrası dışarı çıkmayın diye anons yapıyorlardı ya. Buna şimdi akşamları bir de dua okuma eklendi. Yatsı ezanı sonrasında hoparlörden bağırarak dualar okuyorlar. Arada salavatlar falan da getiriyorlar. Ne dendiğini elbette anlamıyorum ama gerçekten moral bozucu hatta ürkütücü bir şey bu. Türkiye’de tahmin edemeyeceğiniz kadar çok köy ve mahalleye hoparlörlü satıcı araba girmesi yasaktır. Ama cami hoparlörleri dört bir yandadır. Çoğu zaman aynı anda birden çoğunun sesini duyarsınız, yayın merkezi sistemden yapıldığı için ve ses hızı 340m/s gibi bir değer olduğu için ve birkaç on milisaniyelik farkla aynı sesi duymak oldukça rahatsız edici olduğu için, bu ses karmaşası bazen işkence gibi olabilir. İşin bu yanını bir kenara koysak bile, koskoca devletin hoparlörden dua okutması insanda çaresiz kalındığı hissi uyandırıyor. Bizde “işi duaya kalmak” diye çok çok güzel bir deyim vardır. Akla bu geliyor.

Diyanet işleri, üstüne sanki dalga geçer gibi, “daha çok hafız almalıyız, alacağız” diye açıklama yapmış. Alacağız dediği adamların maliyetini biz karşılayacak olduğumuz için bu soruyu sormak zorundayım: Daha çok adam bilmediğimiz bir dilde tekerlemeler bağırırsa daha mı iyi olacağız?

Kısaca, korona ile mücadelemizin bir ayağı bu. Mücadelemizin ilaç ve aşı geliştirme ayağı da var ve bu şekilde olumlu sonuçlar alındığına dair örneklerin haberleri geliyor. Sosyal medyada bir akademisyenin ekibimi tebrik ediyorum diye yaptığı bir paylaşımı gördüm. Buradan eninde sonunda bir sonuç çıkacağını düşünüyorum. Yurt dışından da, ümit vaadeden ilaç geliştirme çalışmaları yapıldığı haber ediliyor.

30 Mart 2020 Pazartesi

Cumartesi akşam üzeri başlayan yağmur gece ve tüm pazar günü boyunca hemen hemen aralıksız sürdü. Arabayla tek tük geçenler oluyor ama sahilde pek insan görmüyorum artık. Bu arada, ülkemizdeki hasta sayısı hızla yükseliyor. Geçen hafta ortası için tahmin ettiğim şey hafta sonu görülmeye başlandı: 100 hastanın görülmeye başlamasından sonra geçen 10 günde dünyanın en yüksek vaka sayılarını açıklıyoruz.

Bu kesin bir felakete gidiş midir bilmiyorum. İlerleme şekli bir sürü sebebe bağlı. Bizde umre kaynaklı, çok noktadan yurda girişler yüzünden vaka sayısı başta hızlı yükseldiyse, kontrol altına almamız belki daha kolay da olabilir. Üstelik bizim sağlık personeli sayımız da az değil. Bence artık bu işi ciddiye de alıyoruz. Bu hafta ümit ediyorum ki olumlu sonuçlar almaya başlayacağız.

Bugünkü yeni hasta sayısı, son 5 günün en düşük değeri. Bence bu çok güzel bir işaret:

Bu, İtalya’daki gibi bir kontrolden çıkma düzeyine ulaşmadan işi ciddiye aldığımızı ve artış hızının azalacağını gösteriyor olabilir. Üstelik son 8 gündür yaptığımız test sayısı her gün bir öncekinden fazla olduğu halde artış hızımız artmıyor. Testlerin sonucu üç gün içinde belli oluyor olsa bile biz test sayısını arttırdığımız halde vaka sayısının şiddetle artmadığını kabul edebiliriz. Bu arada, günde 11 binden fazla test yapmaya başlamamız da çok güzel bir şey. Emeği geçenlere helal olsun diyorum.

Yeni hasta sayıları bu şekilde devam ederse bir hafta ya da 10 gün kadar sonra gidişat hakkında bir fikrimiz olur diye tahmin ediyorum. Tabi burada hiç söz etmediğim bir şey, ölü sayısı ki her gün 1600-1800 kişinin eklendiği bu havuzdan kaçınılmaz biçimde bir miktar insan kaybedilecek ki bunlar kümülatif olarak gelecek maalesef. Ama şu anda acil yardım kapasitemizin sınırında değiliz ve artış hızı son 4 günkü trendi sürdürürse zaman da kazanmış oluyoruz sanırım.

Bıçak sırtındayız ve sinirimi bozan bir şey, bu işin iyiye gitmesi için gerekli parametrelerin tamamına hakim olmayışımız. Keşke şehir içi ulaşımını iptal edebilsek, keşke geçen hafta hiç kimse hiçbir şekilde dışarı çıkmamış olabilseydi. Eminim bu hafta daha da iyimser grafikler görecektik.

Bu arada, bu akşam Erdoğan çıkıp bir yardım seferberliği ilan etmiş. Ben çalışıyordum. Az önce internette şöyle bir gezinince herkesin bundan söz ettiğini gördüm. Erdoğan bir şey söylediğinde bunun hemen gündem olması, ondan körü körüne nefret eden tiplerin bile hemen onun ortaya attığı şeyin peşine düşüvermeleri, eleştirme, alaya alma yarışına girerken zeka seviyelerini belli etmeleri gerçekten canımı sıkıyor. Erdoğan’ın ise, şu siyaset işinde maddi kazançları hariç en hoşuna giden şeyin bu olduğundan eminim. Kendisinden ölümüne nefret edenleri bile resmen oynatıyor.

Yardım kampanyası hakkında ise söylenecek çok söz yok: Kasada para yoksa, ülke için böylesi kritik bir zamanda paramız nereye gitti diye tantana yapmak iş değil. Para lazımsa ahaliden istenecek, bunda yanlış bir şey yok. Kampanya, doğru organize edilebilirse iyi bir şey. Vermek istemeyen zaten vermez. 4 bira aldığında ya da arabanın deposunu doldurduğunda zaten kaç yardım sms’i atmış oluyorsun, hesap etmesini bilmiyorsan bu işlere kafa yormana da gerek yok.

31 Mart 2020 – Salı

Bugün, sabah kalkar kalkmaz akşam erken paydos etmiş olmanın vicdan azabıyla işe giriştim. Uzunca bir programda, kahvaltıdan önce yazılmış fonksiyonların yeri başkadır. Neyse işte.. Kahvaltıdan sonra, yazdıklarımı test ederken can sıkıntısıyla sosyal medyaya bir göz atayım dedim (artık daha az bakıyorum ya). Bir de ne göreyim. Bizim ahalinin derdi akşam Erdoğan’ın açıkladığı bağış hesapları olmuş. Herkes IBAN kısaltmasını cümle içinde kullanıp bir espri yapmak için bedava dağıtılan baklavaya saldırır gibi sosyal medyaya üşüşmüş.

Arada mantıklı şeyler de görmedim değil. Mesela, bağış toplamanın devletin değil, devlet dışındaki organizasyonların işi olduğunu söyleyenler haksız değiller. Devlet zaten vergi topluyor, kanun koyuyor, gerektiğinde bir şeyi zorla yaptırabiliyor. En ilginç süper gücü ise şüphesiz, o toplanan parayı zaten istediği zaman kendisinin basabiliyor olması. Devletler para basma ya da hayal ürünü değerli kağıtlar yaratma konusunda bizim bir datasheet’in çıktısını almamız ya da gereksiz test rutinleri yazmamızdan çok daha üretkenler.

Benim dün bu bağış seferberliği lakırdısını ilk duyduğumda verdiğim tepki pragmatistti: Memleket zor günler geçiriyor, üstelik bu kez bu geyik değil. Hayat eve sığar diye boş atmak ya da evde kal Türkiye diye sallamak kolay. Tüm bu kaşar reklamcı ağzıyla üretilmiş sloganlar hayatını devam ettirmek için evinden çıkmak zorunda olan insanlara hakaret etmekten farksız.

Örneğin, dün çekilmiş şu fotoğrafa bir bakalım:

Bu minibüsün içine doluşmuş ve koronavirüs vakalarının patlama yaptığı bir ilimizden patlama yapmış olduğu bir başka ilimize (ifadeler bilim kurulunun bir üyesine ait) yolculuk eden bu insanların arasında sırf gezmek olsun diye evinden çıkmış ve en güzel yıllarda, en mutlu zamanlarda bile sevimsiz olan şu hatta yolculuğa koyulmuş bir kişi bile var mıdır?

İşte bu yüzden, bu ülkenin acil durumlar için köşede hiç mi parası yoktu, böyle zamanlar için sigorta parası olarak kesilen paralar nereye gitti, hani büyük ülkeydik gibi sorgulamaları şimdilik bir kenara bırakıp organize olmaya çalışmamız gerekir diye düşünmüştüm. Çünkü önümüzde bir İtalya, bir İspanya ve belki bir ABD örneği var ve doğal afetler bizim ortadoğu usûlü siyasetimizi pek umursamaz diye düşünüyorum.

Bugün, kendine muhalif diyen ve tek bildikleri birbirlerinden gördükleri düşük zeka ürünü esprilerin kopyalarını üretmek olan anti-trollerin iban esprilerini görünce “lan bugünkü günde derdimiz bu mu” diyerek öfkelendim.

Fakat sonra, çok zaman geçmeden bir başka haber gördüm ve ağzım açık kaldı: İçişleri bakanlığı Ankara ve İstanbul belediyelerinin bağış kampanyalarını yasadışı ilan etmiş ve sıkı durun, bağış hesaplarına bloke koymuş.

Ben temelde siyasete karşı biriyim. İnsan topluluklarını yönetmenin en efektif yolu siyaset değildir. Pratikte, en azından günümüzde bunun uygulanabilirliğinin olmadığının farkındayım. O yüzden fikrimi genelde şöyle yumuşatırım: Siyasetten başka bir şey bilmeyenlerin siyaset yapmalarına karşıyım. Bugün, bunu tekrar söylemek için güzel bir gün sanırım. Tam bir sene önce “kaybedilen” belediyelerin bir gün bir şekilde yeniden “kazanılması” ümidi hepten sönmesin diye (ki bence imkansız gibi bir şey artık) onların vatandaşın yararına bir şey yapmamaları için çabalıyorlar. Ki bunu, belki de yakın tarihimizin en büyük insan kaybını yaşayacağımız bir aya girerken yapmaktan çekinmiyorlar.

EFM8BB3 Sıcaklık Sensörü

Sıcaklık ölçümü ile ilgili hikayelerimizde sıra hiçbir sensör kullanmadan sıcaklık ölçmeye kadar geldi.

İşlemcilerin üzerinde bir sıcaklık sensörü olması alışıldık bir durumdur. Silabs EFM8 serisinde de analog modülde, giriş multiplexer’ını ayarlayarak ADC bağlantısını yapabildiğimiz bir sıcaklık sensörü var.

Bu sensörü ortam sıcaklığı ölçmede kullanmayı düşünüyorsanız bunun çoğu durumda pek iyi bir fikir olmayacağını baştan söylemem gerek. Daha önce anlattığım kendi kendini ısıtma etkisi, tahmin edeceğiniz gibi işlemci üstündeki sensör için ziyadesiyle geçerli olacaktır. Elbette koskoca işlemciyi yalnızca sıcaklık ölçmek için kullanmayacağınızı varsayıyorum.

İşlemci üstünde sıcaklık ölçmenin bize donanımsal bir maliyeti yok. Sıcaklık ölçmek için ADC’nin herhangi bir dış bağlantısına ihtiyaç duymuyoruz. Yazılımsal olarak da büyük bir maliyet yok. Birkaç satırlık kod ve birkaç ms içinde işimiz halloluyor. Herkes adına ve her durumu açıklamak için konuşamam ancak ben daha önce onboard sensörü iki sebeple kullandım:

Birincisi board’umun sağlıklı çalışacağı bir sıcaklıkta olup olmadığını kontrol etmek için. Zamanında tasarladığım bir DC sürücü oldukça küçük bir board üstünde çıkış katı işlemci regülatör vs. bir aradaydı. İşlemcinin sıcaklığının 60 küsur dereceyi geçmesi durumunda önce çıkış gücünü sınırlamak sonra da aleti tamamen kapatmak gibi bir iş için onboard sensörü kullanmıştım.

İkinci kullanımda da aslında başka bir şeyi ölçmek için bir donanım kurmuşuzdur ama ölçeceğimiz şey sıcaklığa bağlıdır. Bu durumda sıcaklığa göre düzeltme yapmak için eğer uygunsa board sıcaklığını referans alabiliriz.

Vereceğim örnek kod ADC’yi hali hazırda kullanıyor olup olmamamızdan bağımsızdır çünkü ADC’nin güç bağlantılarının belli bir durumda olmasını gerektirir:

ADC0CF2 = 0x70;	 // Vref= internal ref. (1,65V) gnd= GND
ADC0MX = AMUX_TSENS;
ADC0CN0_TEMPE = 1;  // onboard temp. sensor enabled
Delay(96);  // 1ms bekle
ADC0CN0_ADBUSY = 1;

Onboard sıcaklık sensörünün çalışması için TEMPE kontrol bitini 1 yapmak lazım. Fakat öncesinde, ADC referansını 1,65V dahili referansa, eksi bağlantıyı da çip GND’ına bağlıyorum.
ADC giriş multiplexer’ına 0x14 (AMUX_TSENS) yazınca girişi de bağlamış oluyoruz.
Sıcaklık sensörünün açılma süresine bakarsanız 1,8us gibi bir süre görüyorsunuz ancak buna referansın açılmasını ve SAR girişinin settle olmasını da eklemek gerek.
Ben çeşitli donanımsal sebelerle ADC’nin kendi power-up delay zamanlamasını kullanmıyorum. O yüzden sıcaklık sensörünü açtıktan sonra, alışkanlıktan, 1ms bekliyor ve ADC dönüştürme işlemini sonra başlatıyorum.

ADC sequencer’ı, çözünürlüğü, örnekleme hızı vs. mevcut ayarlarımızda olabilir. Onları burada yeniden yazmadım. Sonuçta onboard sıcaklık sensörünün parametreleri gerilim cinsinden tanımlanmışlardır:

Sensörün V / *C kazancının offset hatasına oranına bakarsanız, çipten çipe 6 *C’lik bir 0 *C noktası farkı olduğunu göreceksiniz ki bunun kullanacağınız 100 çipten 68’i için garanti edildiğini de göz önüne almalısınız. Uzun lafın kısası, eğer mutlak değer doğruluğu sizin için önemliyse her bir board için 0*C offset’ini ölçüp flash’ta saklamanız gerekir. (Bununla kim uğraşır bilemiyorum)

Bir termostat uygulaması için sıcaklık okuması yapıyorsak *C skalası çalışma esnasında bizim için gerekli değil. Ancak yaptığımız ölçümün *C karşılığını bilmek istersek, yaptığımız ADC ölçümünden, 757mV ‘a karşılık gelen ADC okuma sayısını çıkarıp sonucu da 2,85 mV’a karşılık gelen ADC sayısına bölerek bir *C sonucuna “yaklaşabiliriz.

Sıfır noktası konusundaki belirsizliğe karşılık mV / *C doğruluğu oldukça belirlidir. Bunun sizin için anlamı şu: Bir noktada, bilinen bir değere ölçekleme yapmanız doğruluk açısından yeterli olacaktır.

Onboard sensörü kullanmanın en güzel yanı, self heating’in ne kadar dramatik bir etki olduğunu gözlerinizle görmenizi sağlayacak olması. Bunu olumsuz bir şey olarak düşünmüyorum. İşlemcinin kendi sıcaklığını görmesi sistemin toplam güvenliği için her zaman çok iyi bir şeydir. Bu arada, buzlu suyla 0 noktasını ayarlarsanız bu sensörün oldukça iyi bir doğruluğu olduğunu keşfedeceksiniz. Teşekkürler Silabs..

SendMessage() ile Uygulamalar Arası Veri Paylaşımı

Bazen, iki uygulama arasında veri alış verişi yapmam gerekiyor. Örneğin zamanında bir donanımla haberleşen bir program yazmışız ama sonra aynı donanımdan alınan veriyle başka bir şey yapan uygulamaya ihtiyacımız oluyor. Veya bir cihazdan gelen verileri kaydeden bir uygulamada radikal bir değişiklik isteniyor ve söz gelimi önceden binary dosyaya yaptığımız kaydı artık bir veritabanına yapmamız gerekiyor gibi.
Burada da belki örneğini vereceğim bir başka örnek durumda da, bazen bir programı denemek için normalde gerçek dünyadan gelecek olan verileri bilgisayarda simüle eden bir şeyler yazıyorum.

Uygulama hali hazırda dışarıdan aldığı verileri TCP ya da UDP üzerinden alıyorsa yerel sunucu/istemci üzerinden yine TCP/UDP haberleşmesi yapmak en basit yöntem. Ama daha genel bir uygulamalar arası veri iletişimi çözümü olarak Windows’un mesajlaşma mekanizmasını kullanmayı tercih ediyorum.

Windows’ta süreçlerin birbirleriyle asenkron olarak haberleşmesi için bir mesajlaşma yapısı var. Çeşitli olayları yanıtlayan nesneler yazarken bunları zaten kullanıyoruz. Ben özellikle TThread sınıfından türettiğim bazı veri işleme nesnelerinde mesajları veri giriş çıkışı için kullanıyorum. Bu mesajlaşma mekanizması aynı zamada uygulamalar arasında da veri iletişimi için kullanılabilir. Bunun için ben WM_COPYDATA mesajını gönderiyor/alıyorum:

WM_COPYDATA mesajının msg alanında TCopyDataStruct diye bir veri türü var. Mesaj içeriğinin aktarımını temelde bu record ayarlıyor.
Gönderici kısımda bu veri türünden bir değişkeni doldurup SENDMESSAGE( ) ile yayınlıyorum.

copyData: TCopyDataStruct;
// dataexchange ünitesindeki copyData değişkenini dolduruyorum:
dataexchange.copyData.dwData:= $0325;   // packet type identifier
dataexchange.copyData.cbData:= event_exchange.Size;
dataexchange.copyData.lpData:= event_exchange.Memory;

Windows.pas içinde tanımlı TCopyDataStruct diye bir tip var. Bu tipten bir değişken tanımlamam gerekiyor: copyData
Bunun dwData alanında mesajla iletilen veri tipini belirtiyorum.
cbData alanında da verilen pointer’ın işaretlediği verinin boyunu belirtiyorum.
lpData alanında da payload işaretçisini paylaşıyorum.
Bu arada, uygulama tarafındaki event_exchange nesnesi de bir TMemoryStream. Yollamak istediğim veriyi buraya yüklüyorum. Genel bir tanımlama olması için bir stream üzerinde çalışmayı uygun buldum. Yerel bir değişken tipi de tanımlayabilirdik.

SendMessage( ) ‘ı kullanmadan önce, hedeflediğimiz alıcı pencerenin o anda canlı olup olmadığına bakabiliriz. Bunun için bir başka windows api’si var:
FINDWINDOW( )
Bu fonksiyonun parametrelerinden söz etmem gerek: Harici bir uygulamanın penceresine erişmek için (buna Delphi’de form diyoruz) bize iki parametre gerekiyor. Biri hedef formun sınıf türü, diğeri de pencere (form) adı. FindWindow() api’si bu iki parametreyi istiyor ve bize dönüş olarak handle sayısını döndürüyor. Alıcı uygulama hangi platformda hazırlanmışsa, o platformun win api tanımını bilip bu iki değeri PChar olarak verebiliyor olmamız gerekir.

SendMessage( ) fonksiyonunun parametrelerinden biri FindWindow ile bulunan receiver_handle. sender_handle büyük ihtimalle gönderici ana formunun handle’ı olur. Daha sonra veri göndermek tek bir fonksiyon çağrısına kalır:

res := SENDMESSAGE(receiverHandle, WM_COPYDATA, Integer(Handle), Integer(@copyData));

Alıcı tarafta yapılması gereken, gönderici tarafta “alıcı form” olarak işaretlenen formun üstünde tanımlanmış bir mesaj yakalama procedure’ü tanımlamaktır:

 procedure WMCopyData(var Msg : TWMCopyData) ; message WM_COPYDATA;

WM_COPYDATA mesajını yakalaması için yazdığımız fonksiyona bir değişken parametre aktarmalıyız ki bu, Msg diye tanımladığım bir TWMCopyData tipinde bir kayıttır. Bu kayıt tipinin .copyDataStruct alanı göndericinin oluşturduğu copyData değişkeninin ta kendisidir!

  // gönderici handle numarası:
  sender:= Msg.From;
  // mesajın data içeriğinin dwData alanını mesaj tipini belirtmede kullanıyorum:
  packet_type:= Msg.CopyDataStruct.dwData;
  packet_size:= Msg.CopyDataStruct.cbData;
  if packet_type = MSG_EVENT_BUFFER then
  begin
   // paket işaretçisini cardinal tipli bir pointer'a eşliyorum:
    pc:= Msg.CopyDataStruct.lpData;  
    inc(pc);
    // ardından "asıl" payload geliyor (burada packet_size'a bakmak gerekebilir)
    pEvent:= PEventRec(pc);
    Process_Event_Data( pEvent , packet_size );
  end;

Yukarıdaki koddan anlayabileceğiniz gibi, gönderici uygulamanın bize gönderdiği payload’u pEvent diye bir işaretçiyle alıyor ve onu işleyen procedure’e veriyorum. En başta cardinal tipli bir sayaç verisi var, onu burada alıyorum. Payload birden çok Event datası içerebilir, o yüzden packet_size değerini de procedure’e veriyorum.

Bir arayüz simülasyonunda bu çalışmanın hayata geçmiş halini şuradan görebilirsiniz. Event receiver ve Event Simulator birbirinden bağımsız iki uygulama. Simulator ile geliştirmekte olduğum kullanıcı arayüzü ve kontrol birimini istediğim türde veriler ile besleyebiliyorum.

LMT01 ile Sıcaklık Probu

LMT01 sıcaklık probu / temperature probe
LMT01 Temperature Probe

LMT01 TI’nin yüksek doğruluklu dijital sıcaklık algılayıcı çipidir. Benim bir sıcaklık ölçüm probu yapma işine soyunduğumda bu malzemeyi seçmiş olmamın ana sebebi, bunun doğruluğunun yüksek olması. İkinci seçim sebebim, bunun dijital çıkışının pulse-count olması. Bu sayede probu ilave bir önlem almaksızın uzatabilirim. Bir üçüncü sebep de, bu sensörün fiziksel yapısı ve malzemesi sayesinde ısıl eylemsizliğinin düşük olması, yani tepki süresinin hızlı olması. Kullanım alanına göre, bu çok önem kazanabilir (ileride anlatacağım). Belki bir seçim sebebi sayılmaz ama TO92 kılıfta geliyor olması da mekanik işleri kolaylaştırıyor.

Pulse count interface, sıcaklık ölçüm sonucunu pulse sayısı olarak çıkış vermek demek. Ayrıca, çipin kendisi de bu arayüzden besleniyor. Pulse çıkışı akım değişimi olarak oluşturuluyor. Bir ölçüm + veri yollama periyodu 104ms sürüyor. Kullanmadığımız zaman çipin enerjisini kesebiliyoruz. Enerjiyi vermeye devam ettiğimiz müddetçe çevrim 104ms’de bir tekrarlanıyor (yani örnekleme frekansı 9,6Hz olarak sabit).

LMT01 bir pulse yollamak için 125uA, boşta durum için 34uA akım çıkışı yapar. Bu akımları gerilime dönüştürmenin en basit yolu bir direnç üzerinden çıkışı toprağa bağlamaktır. Direnç uçlarındaki gerilim sensörün çıkış dalga şekli olacaktır. Bu direnci seçerken LMT01’in uçları arasında 2,15V’luk bir potansiyel farkının korunmasına dikkat etmek gerek. POWER (Vp) ucuna 3V vereceğimizi düşünürsek ölçüm direncimizin uçlarında 125uA çıkış akımı için en fazla 850mV bir gerilim düşümüne hakkımız olduğunu görürüz.

Ben bu mevkide oynatmak için E96 serisinden 6k19 değerinde bir direnç seçtim. Bu direncin uçlarında 125uA pulse’ı yollanırken 774mV gerilim oluşacaktır. Ancak, fark ettiğiniz üzere bu voltaj, bir mikroişlemci girişi tarafından doğrudan lojik olarak okunmaya uygun bir seviye değildir, özellikle de bahsettiğimiz seviyelere bir gürültü marjının da eşlik edeceğini hesaba katarsak..

Gerilim değişimi doğrudan seviye okumaya uygun olmadığında MCU ‘nun comparator modülünü kullanmak uygundur. Ancak isminden de anlaşılacağı gibi, comparator modülünün diğer ucuna da bir referans gerilim bağlamamız gerekecek. Ben bu tarafı da programlanabilir yapmak için şöyle bir yol düşündüm:

LMT01’in çıkışına koyduğumuz direncin aynısından bir tane daha kullanıyoruz ve bunun üstünden de akım çıkışlı DAC ile ayarladığımız bir referans akımı geçiriyoruz. Dirençler aynı değerde oldukları için artık seçeceğimiz eşik değerini son derece güvenilir biçimde akım cinsinden belirleyebiliriz. Sıcaklıkla değişim gibi şeyleri de dert etmek zorunda kalmayız.

Referans akımı 34uA ile 125uA arasında bir yerlerde olmalı. Tam orta noktayı (80uA) seçmek mantıklı gibi gözüküyor.

EFM8SB1’deki DAC 1uA ya da 8uA (Hi current mode) çözünürlükle çalıştırılabiliyor.

EFM8SB1 IDAC module

EFM8SB1’deki akım referansı modülünü Hi-Current mode’da çalıştırıyorum. Bu durumda modül 8uA’lik adımlarla akım çıkışı üretiyor. Modülün akım ayarı 6 bit olarak tanımlanıyor. IREF0DAT = 10 (desimal) yazmakla 80uA çıkış elde ediyorum.

Güç tasarrufu sağlamak için, akım kaynağını yalnızca ölçüm yapacağım zaman açıyorum. Ek olarak, akım kaynağının sürdüğü direncin paralelinde bir kondansatör de olduğu için komparatör çıkışını saymaya başlamadan bir süre önce akım kaynağını açmış olmam gerek.

IREF0CN0 = 0x4A;    // 8*10=80uA akım referansı

Akım kaynağı modülünü 80uA ile çalıştırdığımda iki direncin uçlarındaki gerilim yukarıdaki gibi gözüküyor. Bu seviyenin şimdilik uygun olduğunu düşünüyorum. Şimdilik yazdım çünkü bu denemede LMT01’i 1m uzunluğunda bir kablonun ucuna taktım. Bir de, sensör çıkışındaki dirence paralel 100pF bir kondansatörüm var.

Referans seviyemizi de ayarladığımıza göre artık comparator module’e bakabiliriz:

EFM8SB1 Comparator module

Bizim uygulamada comparator’ün iki girişini de port pinlerine bağlıyorum. Çıkışın asenkron halini de aynı şekilde port pinlerinden birine alıyorum. Interrupt kullanmıyorum. Ama anlayacağınız gibi, eğer pin sayısını azaltma gibi bir gereksinim olsa idi, bu kesmelerden birini kullanarak, sayma işini interrupt handler’a yaptırabilir ve kullanılan modül sayısını azaltabilirdim.

Comparator async. output sinyalini de crossbar üzerinden portlardan birine çıkış veriyorum. Artık burada, komut cycle’ından bağımsız fazlı şekilde LMT01’in count pulse sinyalini görebilirim.

CMP0MD = 0x80;      // fastest response, edge interrupt'lar kullanilmiyor
CMP0MX = 0x44;      // P11 = CMXN, P10 = CMXP
CMP0CN0 = 0x81;		// bunu yapmak comp. modülünü açar ve 5mV negatif hystersiz verir

Comparator modülünü yalnızca sensörü okumak istediğim zaman açıyorum (enerji tasarrufu). 5mV negatif hysteresis (düşen kenar) eklemek, eşik değerini biraz daha yüksek seçsem bile darbe genişliğinin çok azalmamasını sağlıyor (aslında sayma hızım bu mertebelerin çok üstünde olsa da).

5mV’luk düşen kenar hystersis’inin dalga şeklinin duty cycle’ını neredeyse %50’ye getirdiğini görebilirsiniz. Düşen kenardaki overshoot’u benim comparator çıkış pini (CPO) üzerinden ölçüm almam yüzünden görüyorsunuz. CPO pinini T0 girişine 100 ohm gibi bir direnç üzerinden bağlamanın neden iyi olduğunu da açıklıyor (T0 yüksek giriş empedanslı bir sonlandırma ve pull down direnci de bulunmuyor). Elbette burada tüm bu bağlantılar birkaç mm içinde hallolduğu için hiçbir şeyi dert etmeniz gerekmez. Ben genel konuşuyorum, amacımız bu basit sensörü çalıştırmak değil, büyük resmi görün.

Sıcaklık sensöründen gelen pulse’ları lojik seviyeye çevirdikten sonra, şimdi onları saymamız gerekiyor. Karşılaştırıcının çıkışını bir pine alıp onu da işlemcinin sayıcı olarak ayarlayabildiğim bir girişine bağladığımda artık LMT01 pulse’larını kesme falan koşturmadan sayabilirim:

EFM8SB1 T0 Mode0/1

8051 ‘de T0 ve T1 modülleri harici sayaç ya da gated counter olarak ayarlanabiliyor. Bir pini, crossbar’da T0 counter girişine route edip T0’ın CT0 bitini 1 yapmak girişteki pulse’ları saymak için yeterli.

TMOD = 0x25;        // TMR1: mode 2, TMR0: 16 bit counter, TMR0 T0 pin counter mode
TH0 = 0;
TL0 = 0;
TCON_TF0 = 0;
TCON_TR0 = 1;   

Geriye tek bir şey kalıyor: MCU’nun pinlerinden birini, LMT01’i beslemek için çıkış yapmak. Bu pini 0 yaptığımda sensör devre dışı kalmış olacak.

Bu donanım düzenlemelerini yaptıktan sonra pulse count interface ile okuma yapmam için gereken firmware işlemleri şunlar:

1) Sensörü enerjilendir.
2) Akım kaynağını aç.
3) 20ms bekle.
4) Karşılaştırıcıyı aç.
5) Sayıcıyı devreye al.
6) Sayıcının, 180ms boyunca gelen pulse’ları saymasını bekle.
7) 180ms sonunda sayıcıyı kapat. Karşılaştırıcıyı kapat. Akım kaynağını kapat.
8) Gelen pulse sayısı iki ardışık ölçüm sonucunun toplamıdır.

Bir sıcaklık sensöründen sürekli arka arkaya ölçüm almak istemeyiz. Çünkü;
1) Bu zaten gereksizdir çünkü sıcaklık denen fiziksel nitelik genellikle çok hızlı değişen bir şey değildir. (Ortam sıcaklığı gibi şeyler ölçtüğümüzü varsaydığımızda)
2) Enerji bütçemiz kısıtlıdır. 2V – 34uA besleme ile çalışan bir sensör kullanıyorsam düşük güç tüketimi gerektiren bir uygulamam var demektir. Tasarım kriterini bu yönde olabildiğince ileride karşılamaya çalışırım.
3) Dijital bir sensörü sürekli çalıştırırsam onun kendi kendini ısıtmasına neden olurum. Doğruluğu bu mertebede olan bir çipte bu belirgin bir hata yaratacaktır.

Çipi sürekli enerjili tutarsak LMT01 yukarıda göreceğiniz hızla çalışıyor. Bu, olabilecek en yüksek ölçüm hızımızdır. Bir hatta akan suyun sıcaklığını ya da kimyasal bir tepkimenin sıcaklığını ölçmeniz gerekiyorsa 120ms’de bir ölçüm yapabileceğinizi bilmeniz gerek.

Bu sensörün ölçümlerini başka bir sensörle kıyaslayan basit bir uygulama hazırladım. Aşağıdaki trend grafiğinde gördüğünüz 32 *C’lik plato, LMT01’i parmaklarımın arasına alıp birkaç saniye tutmam sonucunda oluşan sıcaklık değişimi.

Bu çalışmayı aşağıdaki sensör board’u ile yaptım:

Kablolu ve kablosuz olarak bir host aygıta sıcaklık ve nem ölçümleri gönderen bir uygulamaya dair bilgileri burada paylaşacağım.

Ayrıca LMT01 kullanan hassas el termometresi tasarımına dair notlarımı da burada paylaşacağım.

Tchibo

Privat Kafe Guatemala Grande ve Brazil filtre kahvelerini ofiste uzun bir süredir yoğun biçimde içtiğimiz kahveci ve işportacı.

Web sayfalarından sipariş verdiğinizde son kullanım tarihi yaklaşmış ürünler satarlar ama gidip dükkandan alırsanız ürünleri genellikle çok tazedir.

Kahve dışında “birbirinden çeşitli” şeyler de satıyorlar. Çin’den gelen konteyner’ları bulk mode’da alıp içinden çıkanları dükkanlarında ve web sayfalarında sattıklarını düşünüyorum.

Genel bir kural olarak, tanımadığınız kişilere hitap ederken, eğer çocuk değillerse “siz” dersiniz. Bu kahveci/tuhafiyeci arkadaşlar yarım kilo çekirdek kahve almak için sitesine giren adama “hey dostum, aradığın şey burada” tarzı bir laubalilikle hitap etmeyi tercih etmişler. 2000’li yılların başında gençlere hitap eden banka/gsm operatörü vb. hizmetlerinde bu dil kullanılarak bir tür “samimiyet” yaratılacağı düşünülmüştü. Bu arkadaşlar burada kalmış olabilirler. Ancak yukarıda görselini eklediğim “birbirinden çeşitli ürünler” tanımlaması henüz dilimize sokuşturulabilmiş bir saçmalık bile değil. Biz çeşitli tabiri ile bir kümeyi, muhtemelen belirsiz elemanları olan bir topluluğu niteleriz tekil bir kavramı değil. Bu yüzden şeyler birbirileriyle çeşitlilik rekabetine giremezler.

Daha vahim olan, bunun bizim dilimize has bir kural değil bir mantıksal zorunluluk olması sanırım. Böyle mantık hataları “ayrıntı” değildir. Bunlar insanların düşünme şekillerinin maskelenmemiş dışa vurumlarıdır. O yüzden “ne demek istediğini anlıyorsam sorun yok” diye düşünmemelisiniz. Yoksa hepimiz forward-error correction yapabiliyoruz.

Pensan Büro 10mm

Bu kalem elime tesadüfen geçti. Teksir kağıdı ve düşük kalite kağıtlar üzerine yazma performansını görünce kendisini çok beğendim.

İnce notlar almak için uygun değil. Öte yandan yazarken bol mürekkep veriyor ve ince, yalın bir ucu var. Bu yönüyle benim çok hoşuma gitti. Fatura imzalamak, teksir kağıdı gibi yüzeylere not almak, karton kutuların üstüne bir şey yazmak için mükemmel bir kalem.

Badeci Şeyh

Bir arkadaşım “Badeci Şeyh’in Sır Odası” isminde bir kitap görmüş. Yazarı Timur Soykan. Kitabın kahramanı olan şeyh aileleri komple beceriyormuş. Bir süre sonra “livata” şikayetçileri yüzünden şeyhimiz müritleriyle mahkemelik olmuş.

Bu arada bade içki demek. Kadın erkek ayırmadan düdükleyen adama neden badeci dediklerini bilmiyorum. Sonuçta şeyhlerin müritlerini badelemesi ender rastlanan bir olay değil.

Bu arada, düdüklemek deyişi başta bana da biraz “şey” geldi, daha ciddi dursun diye onun yerine “ilişkiye giren” yazdım ama bakınca o hiç olmadı.. Önce dili doğru kullanmasını öğrenelim. Bu ilişkiye girme deyişini doğru kullanamıyoruz. Eşekle “ilişkiye giren” adam yazıyorlar mesela. Eşekle ne ilişkisine giriyorsun birader? Birbirinize mesaj mı gönderiyorsunuz akşamları? Konsere mi gideceksiniz? Bu şeyhle müritleri arasında da sapık-eşek “ilişkisi” (ilişki burada doğru yerinde kullanılıyor) var. Bunların yaptığı şeye ilişkiye girmek denmez. Şeyhin müridi becermesi/sikmesi/düdüklemesi falan denir. Ciddi yazacağım derken mantıksız yazmaktan size sığınırım.

Bu Badeci Şeyh kitabını görmüştüm ama hiç merak etmedim. Ben bu konularla ilgili en son, Barış Terkoğlu ve Barış Pehlivan’ın Metastaz kitabını okumuştum. Açıkçası bu seneliğine o kitap bana yetti. Böyle şeyleri okurken öfkeleniyorum. Ve ne yalan söyleyeyim, önümde okunacak onca şey varken kalkıp tarikat, şeyh, tekke hikayeleri okuyup canımı sıkmayı da hiç gerekli görmüyorum.

Arkadaş kitaptan bahsedince başka bir arkadaş şeyhe hayranlığını gizlemedi: “Bu düzeyde bir ikna yeteneği için 50 bin dolar verirdim” dedi. “Ben bir karıyı zor ikna ediyorum, adam tüm aileyi sıradan geçiriyor ve muhtemelen üste de para alıyor”.

Doğru.. Adam, LGBT’lerin yürüyüş yapmalarına izin verilmeyen bir memlekette (ki bunu hoş bir şey olarak görmüyorum ben de) aileleri komple becermeyi başarıyor. Ve üste büyük de bir hürmet görüyor. Tabi buna süper güç demek normal. Özellikle de sekse düşkünseniz..

Bunu söyleyen arkadaşım (ki kendisi zeka ve kültür anlamında ortalamanın epey üstünde biri) badeci şeyhle tanışsa, bırakın ondaki süper bir gücü keşfetmek, on dakika içinde ona, bir otopark değnekçisine, simitçiye ya da kapıcıya davrandığı gibi davranacağından kuşkum yok.

Peki bizim arkadaşın on dakika dinlemeye tahammül edemeyeceği adamda 50 bin dolar eder dediği süper güç nereden geliyor?

Bu güç dinden geliyor. İnançtan geliyor. Genel olarak “insanı düşünmekten korkutan” varsayımlara olan peşin kabulden geliyor. Varsayım ve peşin kabul laflarını arka arkaya, anlatım bozukluğu yapma riskini alarak kullanıyorum. Çünkü bunları çocuklukta öğreniyoruz. Badeci şeyh sokakta 3 liraya kitapçık satsa yanından suratına bakmadan geçersiniz. Ama çocuklukta kafanıza kazınan “dini” kabuller önünüze gelince hadi lan diyemiyorsunuz. Buna cesaret edemiyorsunuz. Ve ne yazık ki sonra olaylar gelişiyor.

Bence mutlu bireyler yetiştirmek için çocuklara “hayır” demekten çekinmemeyi öğretmek lazım. Onları sorgulamaya, yeri geldiğinde hiç düşünmeden hayır demeye alıştırmak lazım. Çocuklara din anlattığınızda onlara asla hayır diyemeyecekleri yüzlerce sistem açığı yüklemiş oluyorsunuz. İşte peşin kabuller bunlar.

Bu peşin kabulleri, seküler hayat yaşayan, bu şekilde kandırılması zor olan, dünyayı görmüş, mesleğinde yükselmiş olanlarımız bile çocuklarımıza “din eğitimi” adı altında yüklemeye çalışıyoruz hâlâ. Çünkü hâlâ pek çoğumuzun kafasında dinden bağımsız bir ahlak ve değerler eğitimi yok ne yazık ki. Ailelerimiz bizden daha dindar. Onlardan gördüklerimizin çoğunun düpedüz saçmalık olduğunu anlayabiliyoruz. Ama onların yerine ne koyacağımız konusunda kafamız karışık.

Kimin neye inandığı aslında beni hiç ilgilendirmiyor. Zaman içinde hepimiz bu konuda dersimizi yeterince aldık. İnançlar düşünceler gibi değil. Onlar hakkında tartışamıyorsunuz. Tartışmaya kalkarsanız da inananlar anında rencide oluyorlar. Adamlar inançları yüzünden bokun içinde yüzüyorlar, göremedikleri şey çok basit bir şey. Ama sen bundan söz ettiğin anda bok deryası yüzücüleri sana inanca saygı dersi vermeye başlıyorlar. Zaten bu yüzden dinin gündelik yaşamda, siyasette, ekonomide daha görünür olmasını istiyorlar birileri. Bu eleştirilmezlik zırhının altına ne çok şey atarlarsa sürüyü gütmek o kadar kolay olur çünkü.

Badeci şeyhe geri dönelim biz.. Böyle badeci şeyhlere aile boyu oyuncak olanları falan görünce hafiften hoşuma da gidiyor. Eee, inanca saygı göstermeliyiz. Adamların inancı da böyle. Gerçek İslam o değilmiş bu değilmiş, insanlar sevdikten ve mutlu olduktan sonra yorum yapmak bize düşmez.

Benim kaygım çocuklar için. Onlar pek çok açıdan yetişkinlerden daha sorgulayıcı ve açık fikirlidir. Ama onlara küçük yaşta din anlatırsanız, onların muhteşem zihinlerinde badeci şeyhinden siyasal İslamcısına kadar türlü tip dolandırıcının canı istediğinde girebileceği açık kapılar yaratmış olursunuz.

İşte yapmamanız gereken budur. Çünkü, bu sinir bozucu tiplerde hiçbir numara yok. Onlar güçlerini bizim küçük yaşta yüklendiğimiz saçmalıklardan alıyorlar.

Unutkanlıkta şifa vardır

Mutlu olmak unutmakla ve olaylar üstünde çok düşünmemekle mümkündür.

Eski bayramları, gönül işlerini, arkadaşlıkları falan kastetmiyorum.

Bu ülkede unutkanlık olmazsa olmazıdır aklını korumanın..

Kendi paranızı harcarken bile hatırmamanız gerekir neler olduğunu..

Parayı vermeden önce size söylenenleri hatırlayın istemezler.

O şeyi geçen sene kaça aldığınızı hatırlamanızı da istemezler.

O şeyin vergisiz fiyatı ne kadar bilin istemezler.

Hatta yüzde hesabı yapabilmenizi hiç istemezler.

Bunca çabaya, itinalı karartmaya rağmen bir yerlerden vergiler, devlet garantili yollar köprüler, hastaneler, santrallerle ilgili bir şeyler duymuşsanız bunları da “yeri geldiğinde” hatırlayın istemezler.

Söyledikleri şeylerin, kısa süre sonra tam aksini yaptıklarında, söyledikleri zamanı hatırlayın istemezler.

Köpeklerini beslemeleri sizin borçlanmanızla mümkündür, bunu etrafınıza baktığınızda görmemeniz imkansızdır ama ayağınızı yorganınıza göre uzatmanızı ve yarınınızı düşünmenizi istemezler.

Eh siz de artık sınıf atladım sanırsınız ve her gün size küfür edenleri beslemeye devam edersiniz.

Onları ilk tanıdığınız zamanki hallerini, varlıklarını, yaşantılarını hatırlayın istemezler. Neredeeeeen nereyeee gelen ülkenin zenginliğidir, onlarınki değil ne de olsa.

Şehrin yeşilliğini hatırlayın istemezler. Hayatın basitliğini, insanların içtenliğini hatırlayın istemezler.

Onlardan öncesine dair iyi olan hiçbir şey bilin istemezler.

Vaatlerini hatırlayın istemezler. Size düşen o vaatleri oy verir vermez unutmanızdır.

Başka yerlerde sizin durumunuzda olan insanlar nasıl yaşıyorlar, ne kadar çalışıyorlar, ne kazanıyorlar ve nasıl harcıyorlar bilin istemezler.

Milyonlarca insanın bu imkansız istekleri eksiksiz yerine getiriyor olmasından buldukları cüretle her gün daha ileri giderler.

Çünkü dünü hatırlamayan, istenmeyen hiçbir şeyi hatırlamayan, bir dakika ya, peki bu neden böyle diye durup kendi kendine sormak yerine önüne her konanı dişleyen aptal mahlukların ülkesini idare ettiklerinin bilincindedirler.

O yüzden…

Bir şeyleri hatırlamak hepten delirtir bu ülkede insanı.

Unutmak sağlıktır.

MODBUS

RS485 donanımı ucuz, uygulaması kolay bir haberleşme arayüzü olarak öncelikli tercihlerimizden biri olmayı sürdürmektedir. Endüstriyel otomasyon ve veri toplama gibi işlerde eskilerden beri kullanılagelen Modbus namlı bir protokol vardır. Bu protokol çok basit, çok minimalist bir kullanım ile RS485 üzerinden multi-drop, yani ikiden fazla cihazın müşterek kullandığı bir haberleşme ortamı kurmaya iyi bir örnektir.

Yakın zamanda benden Modbus üzerinden kumanda edilen bir takım giriş/çıkış modülleri tasarlamam istendi. Bu vesileyle de, uzun yıllardır pek çok farklı işte kullanmakta olduğum Modbus protokol yürütmesi hakkında birkaç not yazayım diye düşündüm.

Burada, Modbus protokolünün embedded tarafta, kaynakları sınırlı işlemciler üzerinde yürütülmesine dair yaptığım bazı şeyleri paylaşacağım. PC tarafında da kendi yazdığım modbus erişim programlarına örnekler vereceğim.

MODBUS RTU

Modbus protokolünün RS485 hattı üzerinde çalışan RTU yürütmesini kullanıyorum. Bu yürütmede paket byte’ları binary olarak anlamlanıyor. 

Protokol byte formatı olarak 8-E-1 kullanılır diyor. Ancak ben 8-N-1 kullanıyorum. (Hâlâ, donanımsal parite hesabı yapmayan işlemciler kullanan insanlar var çünkü) Aslında protokol, eğer parite kullanamıyorsan bari stop bitini 2 tane yap da diyor ama ben bunu da yapmadım.

Modbus’un standart protokol tanımlamalarına “olabildiğince” sadık kalmaya çalıştım. Aslında her ne kadar yalınlığına saygı duysam da, RS485 multi-drop pek çok uygulamada modbus en etkin yöntem olmuyor. Eğer sizin tasarladığınız cihazların dışında cihazlarla da haberleşecek bir ağ öngörüyorsanız o zaman işlerin bir standardı olmalı dediğiniz için modbus’ı ciddiye alırsınız. Belki bir gün RS485 üzerinde daha efektif veri haberleşmesi yapan kendi yöntemlerimi de burada paylaşmaya başlarım.

MODBUS ZAMANLAMALARI

RS485 asenkron bir seri haberleşme ortamıdır. Bu da demektir ki bu ortamda birbiriyle haberleşecek cihazlar yollanan verilerin içeriği kadar zamanlaması üzerinde de anlaşmış olmalıdırlar.

Modbus spesifikasyonu, iki byte arasında en fazla 1,5 byte süresi kadarlık bir boşluğa izin verildiğini belirtiyor. Bundan çıkaracağımız iki sonuç vardır:

  1. Paket byte’larını bekleme yapmadan art arda yollamamız gerekir.
  2. Bir veri alıyorken, 1,5 byte süresi kadar alma yapmazsak paket sonuna geldik diyebiliriz.

Bir alma işlemi esnasında paket boyunu saymak zorunda kalmadan paket almanın sonuna geldiğimize karar verebilmek işleri kolaylaştıran bir şeydir. Öyle olmasaydı, modbus paket boyları sabit uzunlukta olmadıkları için, bir veri gelmeye başladığında doğru anda paket boyunun ne olacağını hesaplamış olmamız gerekirdi. Ki bunun için de gelen verinin kaçıncı byte’ında olduğuna göre çalışan bir sorgumuz olması gerekirdi. Bir uart rx kesmesinin içine karmaşık sorgular yazmak akıllıca bir iş değildir, bana güvenin.

Yine modbus spesifikasyonu, iki paket arasında en az 3,5 karakter süresi kadar bir boşluk olması gerektiğini söyler. Bundan da bize iki hisse çıkıyor:

  1. Bir paket aldığımızda, cevap vermeden önce, master’ın son byte’ı yollamasından beri 3,5 karakter süresi geçtiğinden emin olmamız gerek.
  2. Bir modbus hattına ilk bağlandığımızda (fiziksel bağlanmayı kastetmiyorum) konuşmaları dinlemeye başlamadan önce en az 3,5 karakter süresi kadar bir sessizlik olmasını beklememiz gerek (paketlerle “senkronize olmak”).
modbus frame sync zamanlama tanımları

Aslında, üzerinde biraz düşünürseniz yukarıdaki iki maddenin birbirini gerektirmediklerini anlarsınız. Bir slave, master’ın sorgusuna 3,5 karakter süresini beklemeksizin yanıt verirse diğer slave’lerin bakış açısından tek bir paket gelmeye devam ediyor gibi olacaktır ve slave’ler sıralarını kollamaya başlamayacaklardır. Bu bir sorun yaratmaz çünkü o esnada konuşan slave zaten master’a cevap veriyordur.

Haberleşme protokolü dediğiniz şeyler bu şekilde paralel dallanan önermelerle doludur. Protokol yürütme denen şeyde aranan sonuç tamamen mantıksal tutarlılık ya da en sadelik değil, bir şeyi açık şekilde kabul etmek esasına dayanır. O yüzden, bu aşamada fazlasına kafa yormayıp TÜM paketlerin en az 3,5 byte süresi aralıkla hatta yüklenmesini gözeteceğim.

Yukarıda, sözünü ettiğim 3 zaman tanımının haberleşme çerçevesindeki yerlerini gösterdim. Slave taraf işlemcimiz DataProcessor( ) fonksiyonunu çalıştırırken bu süreleri gözetmek zorundadır.

Modbus protokolü süreleri karakter müddeti cinsinden tanımlamış. Yani, bu byte süresi dediğim ölçü birimi bir byte’taki bit sayısı bölü geçerli baudrate kadar olacak demektir. Ancak yine modbus protokolü, yüksek baud rate’ler için sürelerin çok küçük olmasının önüne geçmek için 19200bps üstü hızlar için bu sürenin sabit olabileceğini söylüyor.

Ben en başta bu süreleri tamamen baudrate’e bağlı yapmıştım. Ancak sonra, protokol dediğin şeyde önemli olanın mantıksal bütünlük değil, yaptığını açık şekilde ifade etmek esasına dayandığını hatırlayıp (yukarıda bunu anlattım) tüm zamanlamaları 9600bps’ye göre hesapladım ve sabit yaptım.

Bir byte’ı 10 bit kabul ederek zamanlama parametrelerini şu şekilde alıyorum:

t35 = 4,17ms

t20 = 2,6ms

t15 = 1,56ms

modbus data processor stack state diagram
modbus data processor stack state diagram

UART RX Kesmesi:

Haberleşme protokolü üç yazılım modülünden oluşur:

Veri alma kesmesi

Veri işlem

Veri yollama

Yukarıda çizdiğim durum makinesinin ilerlemesi iki dış etki ile olur: Sisteme veri gelmesi ya da bir zaman aşımı olması. Bunun haricindeki zamanlarda Data Processor dediğim durum makinesi ya hiçbir şey yapmaz ya da yeni girdiği durum için işletmesi gereken kodu çalıştırıp durağan bir adıma gider. Thread şeklinde algoritma gerçeklemenin benim uyguladığım yöntemi bu.

Bu uygulamada UART kesmesi dediğimizde yalnızca RX kesmesini düşünmemiz yeterli. TX kesme ile yönetilmek zorunda değil. Öyle olması gereken durumlar elbette vardır ama bunu ayrıca anlatırım. RX kesmesi öyle bir şey olmalı ki, içindeki kod DataProcessor( ) ‘ün o anki durumuna bağlı olmamalı. Böylece kesme kodumuzu (işin donanımın parmak soktuğu kısmı) olabildiğince yalın, asıl fonksiyonlarımızla az teması olan bir hale getirmemiz mümkün olur. Bu, embedded programlamada başarıyı çok etkileyen bir şeydir.

rx kesme fonksiyonu

Hep bahsettiğim gibi, bir kesme fonksiyonu olabildiğince basit olmalıdır, ama daha basit değil.. 🙂

Byte hatası yoksa gelen byte Xbuffer‘ın Xptr indeksli elemanına yazılır ve Xptr ilerler.

Son olarak da zaman aşımı denetimi için kullandığım timer’ı sıfırlıyorum. Byte geldiği müddetçe zaman aşımı olmamalıdır.

Kesme kodu bundan ibaret olacak. Elbette UART modülünün ürettiği donanım hatalarını da handle edip bir flag ile ana programa bildiriyorum. Ama bu işin ilginç kısımlarından biri değil.

Data Processor Durumları:

DataProcessor( ) bir thread fonksiyonu olarak kullanılır. Yani, ana sistem döngüsünde her geçişte koşulsuz olarak çağrılan bir fonksiyondur ve koşulsuz olarak da sistem kaynağı kullanır ( bir donanım timer’ı ve uart kesmesi). DataProcessor’ün timer overflow ya da uart rx kesmelerine vereceği tepkinin hızı ana sistem çevriminin periyoduna bağlı olacaktır.

DataProcessor( ) her çağrıldığında belli bir durumda olur. Durum geçişleri yalnızca fonksiyonun kendisi tarafından yapılır, yani hiçbir dış kod DataProcessor( ) state machine’in durumunu belirleyen commstat değişkenine erişemez.

DISABLED:
UART kapalı ve makine devre dışında. Yani modbus fonksiyonumuz kapalı.
Bu durumdan çıkış için kullanıcı kodun comm_cmd = CC_INIT yapması gerek.
Bu komut algılanınca Restart_RS485( ) fonksiyonu ile UART RX etkinleştirilir.

LISTENING:
UART veri alma etkin, yani makine Modbus hattını dinliyor ancak alınan byte’larla bir işlem yapılmıyor.
Bu durumdan çıkış için T35 süresi boyunca hiç RX olmaması gerekir. T35 süresi boyunca veri alınmaması Modbus hattının boşta durumda olduğu anlamına gelir. Makine artık paketleri dinleyip adresleri kontrol edeceği senrkonize duruma geçebilir.
Eğer bir byte hatası olursa makine SLEEP durumuna atlar.

SYNCD:
3,5 byte süresi boyunca hat sessiz kaldı. Demektir ki şu anda Modbus hattında iletilen bir paket yok. Artık makine senkronize durumda.
Bundan sonra gelen her byte’a bir paketin ilk byte’ı bu deyip adres byte’ı muamelesi yapacağız. Burada iki olasılık var: Paket bizi adresliyordur (ADDRESS_HIT) ya da adreslemiyordur (ADDRESS_MISS).
ADDRESS_MISS için SLEEP durumuna geçilir.
ADDRESS_HIT için de paketin devamını almak için PACKET_RX’e geçilir. Eğer bir byte hatası olursa makine SLEEP durumuna atlar.

PACKET_RX:
Veri alınıyor.
Bu durumda iken makine Xptr indeksini izler. Modbus fonksiyonu için ayrılmış buffer boyunun aşılması BUFFER OVERRUN hatası demek olur ve bu durumda paket alımı iptal edilip SLEEP adımına atlanır.
Bu durumdan çıkış paket sonu ile olacak. Paket sonunun algılanması T15 süresi boyunca bir byte alınmaması ile olur.
Eğer bir byte hatası olursa makine SLEEP durumuna atlar.

PARSE:
Paket sonu algılandığında, veri alma kapatılır.
Xptr sayacı alınan byte sayısını göstermektedir.
Geçerli bir Modbus master paketinde olması gereken genel koşulların sağlaması yapılır. Paket geçerli gözüküyor ise paket türüne bakılır ve ilgili komut işlemine atlanır
Paket hatalı gözüküyorsa SLEEP durumuna atlanır.

SLEEP:
Bir hata ya da ADDRESS_MISS durumunda ortalama bir paket boyu kadar bir süre boyunca makine kapalı durumda bekler. Bu süre baudrate’e göre belirlenir.
Bu sürenin geçmesi sonrasında makine Restart_RS485( ) seri haberleşme yeniden başlar. Makine LISTENING durumuna gider.

Bundan sonraki makine durumları alınan Modbus komutu ile ilgili işlemler ve verilecek yanıtlar ile ilgili kodlardır. Bunları ayrı ayrı anlatmak yerine desteklediğim Modbus komutlarından söz etmeyi uygun buluyorum:

DESTEKLENEN MODBUS KOMUTLARI

Modbus Fonksiyon Kodları
MODBUS fonksiyon kodları

Bu fonksiyon kodlarının kendi başlarına ne anlama geldiklerinin çok fazla konuşulmaya değer bir yanı yok. Önemli olan, üzerinde çalıştığımız cihazda bu kodlar ile neleri okuyup yazacağımızdır. İşin özeti şu: Elinizde bir cihaz vardır. Bu cihazın modbus üzerinden görünür bir bellek haritasını oluşturmuşsunuzdur. Yukarıdaki komutlar artık bu harita üzerinde bir anlam taşır. Bu konuda da olabildiğince özgürsünüz. Holding Register denen şeyle dijital giriş durumu da yollayabilirsiniz. Sonuçta bunu güzelce açıklamayı becerirseniz söz gelimi PLC ile cihazınıza okuma yapan adam holding register olarak okuduğu Word’leri bit olarak kullanabilir. Yani, Modbus’ın tanımındaki veri tiplerinin aslında pek bir bağlayıcılığı yoktur.

Şimdi benden istenen Modbus I/O modüllerinin bellek haritalarına bakalım. Okuyucuya genel bir bakış açısı kazandırmak için şöyle bir not ekleyeyim: Benim için modbus haberleşmeli bir uzak I/O modülü geliştirmek demek 3/4 oranında aşağıdaki tabloları hazırlamak demekti. Bundan sonrası zaten yokuş aşağıdır.

Komutlardan da anlayacağınız gibi Modbus, 4 bellek tipi üzerinde veri erişimi komutlarına sahiptir:

DISCRETE OUTPUTS (Y)
00001 adresinden başlayan dijital çıkış bitleridir.
Bu alan, 0x01 komutu ile okunur ve 0x05, 0x0F komutları ile de buraya yazılır.
Komut adresleri haberleşmede 0 -> 00001 olacak şekilde kullanılır.
DISCRETE INPUTS (X)
10001 adresinden başlayan dijital çıkış bitleridir.
Bu alan 0x02 komutu ile okunur.
Komut adresleri haberleşmede 0 -> 10001 olacak şekilde kullanılır.
ANALOG INPUTS (R)
30001 adresinden başlayan 16 bitlik sadece okunur register alanıdır.
Bu alan 0x04 komutu ile okunur.
HOLDING OUTPUTS (H)
40001 adresinden başlayan 16 bitlik okunabilen ve yazılabilen register alanıdır.
0x03 komutu ile okunur, 0x06 komutu ile yazılır.

X/Y Giriş Çıkışları:

Yaptığım cihazlarda değişik sayıda dijital girişler ve röle çıkışları var. Yani, bu ürünlerin işlevselliği büyük oranda dijital girişleri okumak ve röle çıkışlarını kumanda etmekten ibaret. O yüzden cihazların belirleyici özelliği aşağıda verdiğim X ve Y adres haritalarıdır.

Cihazların gerçek giriş çıkışlarını X ve Y haritalarında 1 adresinden başlayarak konumlandırdım:

MODISEL Cihazları Y Modbus Bellek Haritası

Görseli tam boyutlu görmek için TIKLAYIN.

MODISEL cihazları X Modbus Haritası

Görseli tam boyutlu görmek için TIKLAYIN

Input Register’ları:

Bu cihazlarda tam sayı olarak ifade edilebilecek bir giriş ya da çıkış bulunmuyor. Ancak, dijital giriş çıkışları birer bitmap olarak bu bellek haritasında okunabilir yapmak iyi bir fikir. Bu şekilde girişleri okumak için ayrı çıkışları okumak için ayrı bir komut kullanmak zorunda kalınmadan tek seferde her şey okunabilir.

Modisel Cihazları MODBUS Analog Input Register Map

Görselin tam boyutunu görmek için TIKLAYIN

Holding Register’lar:

Ben bu bellek alanını, yazılabilir olduğu için input register alanından ayrı tanımlıyorum. Buradaki “holding” sıfatına saygı olarak, cihazların silinmez belleğine yazılan parametreleri bu haritada tanımladım. Yine de bu haritanın bir kısmını son kullanıcı için sadece okunur yaptım (kullanıcının cihaz kimlik bilgilerini değiştirebilmesini istemem).

Input register alanında X ve Y vektörlerini bitmap olarak göstermeye benzer şekilde burada da Y vektörünü binary olarak yazma özelliği düşünülebilirdi ama zaten 0x0F komutu tam olarak bu işi yaptığı için böyle bir şeye gerek yok.

Modisel cihazları MODBUS Holding Register Map

Tablonun tam açıklamalarını görmek için TIKLAYIN

MODBUS Komutları:

MODBUS komutlarının benim uygulamalarımdaki yürütmesi belli kısıtlamalara tabi olabilir. Sonuçta protokolün kendisi çok genel olduğu için biz bazı yönleri bizdeki özelliklere ve kısıtlamalara göre basitleştirebiliriz.

Örneğin, discrete okuma komutlarında hedef adresinin 8’in katları şeklinde olmasını şart koşuyoruz. Benzer şekilde, 8’in katı olmayan vektör boylarını da kabul etmiyoruz. Bu işlevsel bir kısıtlama değil. Çünkü bu şart, genel modbus tanımlamasına bir istisna oluşturmuyor. Yalnızca onun bir alt kümesini geçerli kabul ediyor.

Ayrıca, 0x04: Read Input Register komutunda komutun serbestçe hazırlanmasına izin vermiyoruz. Bu komutu kullanacak kişi bir seferde cihazın 4 word’lük R bellek alanının tamamını okumak zorunda.

modbus fonksiyon kodu 01 Read Discrete Output
modbus fonksiyon kodu 01 Read Discrete Output
modbus fonksiyon kodu 02 Read Discrete Inputs
modbus 02 RDI komutu
modbus fonksiyon kodu 03 read holding registers
modbus fonksiyon kodu 03 read holding registers
modbus fonksiyon kodu 04 Read Input Registers
modbus fonksiyon kodu 04 Read Input Registers
modbus fonksiyon kodu 05 write discrete output
modbus fonksiyon kodu 05 Write Discrete Output
modbus fonksiyon kodu 06 Write Single Holding Register
modbus fonksiyon kodu 06 Write Single Holding Register
modbus fonksiyon kodu 0F Write Multiple Outputs
modbus fonksiyon kodu 0F Write Multiple Outputs

Son olarak, yukarıda anlattıklarımın kodda nasıl gözüktüğünü paylaşmak istiyorum.

Ana programda koşulsuz olarak çağrılan bir thread fonksiyonum var:

    RS485Thread[rs485_status] ();

Bu çağrı aslında bir fonksiyon pointer çağrısı. Dizinin elemanları şunlar:

static void (* RS485Thread[]) () = 
{   
    RS485_Disabled, 
    RS485_Listening, 
    RS485_Syncd,
    RS485_Receiving, 
    RS485_Parse,
    RS485_Handler_01, 
    RS485_Handler_02,
    RS485_Handler_04,
    RS485_Handler_05,
    RS485_Handler_0F,
    RS485_Response
};

Daha önce anlattığım dinleme, senkronize olma, veri alma ve alınan veriyi çözümleme işlemlerinin her biri bir fonksiyon adımı olarak işletiliyor. RS485 işlerini yürüttüğüm ana thread bu adımlar arasında dönüp duruyor.

/// RS485 durumları:
typedef enum
{
    DISABLED = 0,       // Transceiver devre dışı
    LISTENING,          // Senkronize olma süresi bekleme
    SYNCD,              // rs485 hattına senkronize olunup paket başı bekliyor olma
    RECEIVING,          // Cihaz adreslendi, veri alınıyor
    PARSE,              // veri paketi tamamlandı, içeriğe bakılıyor
    HANDLER_01,         // READ DISCRETE OUTPUTS komut handler'ı
    HANDLER_02,         // READ DISCRETE INPUTS komut handler'ı
    HANDLER_04,         // READ INPUT REGS komut handler'ı
    HANDLER_05,         // WRITE DISCRETE OUTPUT komut handler'ı
    HANDLER_0F,         // WRITE MULT.DISC. OUTPUT komut handler'ı
    RESPONSE            // yanıt paketini yollama adımı:
} RS485_STATUS;

static RS485_STATUS rs485_status;      // RS485 thread control 
unsigned char uart_tick;        // uart zamanlama sayacı

uart_tick, sistem tarafından işletilen birkaç ms periyotlu bir serbest timer. Thread’in zamanlaması için buna ihtiyacımız var. Ayrıca, bize veri geldiğinde tetiklenen bir de kesme lazım:

void interrupt HI_ISR(void) 
 {
     // UART RX kesmesi :
     if (PIR1bits.RC1IF == 1)     
     {   
         Xbuffer[Xptr] = RCREG1;
         ++Xptr;
         uart_tick = 0;
         PIR1bits.RC1IF = 0; 
     }      
 }

İronik bir şekilde bu yazıyı artık pek kullanmadığım PIC18 işlemcisi üstünde çalışan bir kod ile örneklendirdim. Bu işlemcide artık bana bile tuhaf gelen bir şekilde, kesmeler için müşterek bir vektör var. O yüzden kesme handler’ı içinde bir kez daha receive interrupt flag ‘i sorguluyoruz. Ayrıca burada uart hatası kesmesi diye bir şey yok ki bunu handle etmemek bana pek doğru gelmiyor. Neyse, bunların modbus’ın kendisi açısından pek bir önemi yok. Biz şimdi sözü state fonksiyonlarına bırakıp bu yazıyı noktalayalım:

////////////////////////////////////////////////////////////////////////////////
//// RS485 - Modbus State Functions:
////////////////////////////////////////////////////////////////////////////////

// seri port kapalı: bir timer olayı ile yeniden başlatılacaktır.
static void RS485_Disabled(void)
{
    // Bu durumda iken, tick gelmesini bekleriz: 
    if ( uart_tick > 1)                    // uart timer'ından kesme gelene kadar burada dur...
    {
        uart_tick = 0;
        // UART'ı yine aç:
        Xptr = 0;
        RS485_DIR = 0;          // alici modu
        RCSTA1bits.SPEN = 1; 
        RCSTA1bits.CREN = 1;
        PIE1bits.RC1IE = 1; 
        rs485_status = LISTENING;   // veri bekleme modunda bekleyeceğiz
    }    
}

// alıcı boşta: (yani master'dan komut bekleme adımı)
static void RS485_Listening(void)
{
    /// sync beklerken buffer overrrun olabilir:
    if ( Xptr > 19 )  Xptr = 0;
    
    /// senkronize duruma gelmek için T35 timeout'u bekiyoruz:
    if ( uart_tick > 1 )
    {
        uart_tick = 0;
        Xptr = 0;
        rs485_status = SYNCD;
    }
}

// alıcı dinleme moduna geçti: gelen byte paket başı olacak.
static void RS485_Syncd(void)
{
    if ( Xptr )  // başlık alındı mı?
    {
      // addr. hit =>
        if (( Xbuffer[0] == my_rs485_address)||( Xbuffer[0] == 255 ))
        {
            LED2 = 1;
            uart_tick = 0;
            rs485_status = RECEIVING;
        }
        else // addr. miss =>
        {
            Disable_RX();
            rs485_status = DISABLED;             
        }
    }      
}

// veri alınıyor: bizi adresleyen bir paket geliyor.
static void RS485_Receiving(void)
{
    // üzerinde çalışılabilecek max. rx paket boyu aşıldıysa yanıt verilmeyecek:
    if ( Xptr > 29 )
    {
        Disable_RX();
        rs485_status = DISABLED; 
    } 
    else if ( uart_tick > 1 )
    {
       Disable_RX();
       rs485_status = PARSE;
    } 
}


static void RS485_Parse(void)
{
    unsigned char c;
    
    ////////////////////////////////////////////////////////////////////////////
    // gelen paketin doğruluğunun kontrolü
    // komut byte'ı doğru mu:
    if ( ( Xbuffer[1] > 0x10 )||( Xbuffer[1] == 0 ) ) 
    {
        rs485_status = DISABLED;
    }
    // paket boyu beklenen en düşük değerin de altındaysa:
    else if ( Xptr < 8 )  
    {
        rs485_status = DISABLED;
    }
    // bu aşamada gelen verinin CRC'sini sorguluyoruz:
    else
    {
        myCRC.i = 0xFFFF;
        c = Xptr-2;         // crc hesabına girecek son byte indeksi
        // gelen paketin crc'sini hesapla: (0..n-2 byte'lar arası)
        for (Xptr=0; Xptr<c; Xptr++)
        {
            DoCRC(Xbuffer[Xptr]);
        }
        // TODO: crc doğru mu bakmak!
        // gelen crc hesapladığımızla aynı mı:
        /*
        if ( ( myCRC.b[0] == Xbuffer[c] ) && ( myCRC.b[1] == Xbuffer[c+1] ) )
        {
           if ( Xbuffer[1] == 0x01 )  rs485_status = HANDLER_01;
        }   
        else rs485_status = DISABLED;
         */
        if ( Xbuffer[1] == 0x01 ) rs485_status = HANDLER_01;
        else if ( Xbuffer[1] == 0x02 ) rs485_status = HANDLER_02;
        else if ( Xbuffer[1] == 0x04 ) rs485_status = HANDLER_04;
        else if ( Xbuffer[1] == 0x05 ) rs485_status = HANDLER_05;
        else if ( Xbuffer[1] == 0x0F ) rs485_status = HANDLER_0F;
        else rs485_status = DISABLED;
        
    }
       
}

/// Read Discrete Outputs
static void RS485_Handler_01(void)
{
   // genel çağrı adresi için bu komut yanıtlanmaz:
    if ( Xbuffer[0] == 255 )
    {
        uart_tick = 1;      
        rs485_status = DISABLED;
    }
    // vector start 0 olmalı:
    else if ( Xbuffer[2] & Xbuffer[3] )
    {
        uart_tick = 1;
        rs485_status = DISABLED;
    }
    // vector size = 32 olmalı 
    else if ( Xbuffer[4] != 32 )
    {
        uart_tick = 1;
        rs485_status = DISABLED;
    }
    // her şey doğru ise:
    else
    {
       // çıkışların geçerli durumunu oku:
       Read_Y();  
       // yanıt paketini hazırla:
       Xbuffer[0] = my_rs485_address;
       Xbuffer[1] = 1;
       Xbuffer[2] = 4;
       Xbuffer[3] = dY[0].b[0];
       Xbuffer[4] = dY[0].b[1];
       Xbuffer[5] = dY[1].b[0];
       Xbuffer[6] = dY[1].b[1];
       // yanıt paket boyu:
       response_size = 7;
       rs485_status = RESPONSE;
    }
}


/// Read Discrete Outputs
static void RS485_Handler_02(void)
{

   // genel çağrı adresi için bu komut yanıtlanmaz:
    if ( Xbuffer[0] == 255 )
    {
        uart_tick = 1;      
        rs485_status = DISABLED;
    }
    // vector start 0 olmalı:
    else if ( Xbuffer[2] & Xbuffer[3] )
    {
        uart_tick = 1;
        rs485_status = DISABLED;
    }
    // vector size = 48 olmalı 
    else if ( Xbuffer[4] != 48 )
    {
        uart_tick = 1;
        rs485_status = DISABLED;
    }
    // her şey doğru ise:
    else
    {
       // girişlerin geçerli durumunu oku:
       Read_X();  
       // yanıt paketini hazırla:
       Xbuffer[0] = my_rs485_address;
       Xbuffer[1] = 2;
       Xbuffer[2] = 6;
       Xbuffer[3] = dX[0].b[0];
       Xbuffer[4] = dX[0].b[1];
       Xbuffer[5] = dX[1].b[0];
       Xbuffer[6] = dX[1].b[1];
       Xbuffer[7] = dX[2].b[0];
       Xbuffer[8] = dX[2].b[1];
       // yanıt paket boyu:
       response_size = 9;
       rs485_status = RESPONSE;
    }
}


static void RS485_Handler_04(void)
{
    unsigned char a, b, i;
   // genel çağrı adresi için bu komut yanıtlanmaz:
    if ( Xbuffer[0] == 255 )
    {
        uart_tick = 1;      
        rs485_status = DISABLED;
    } 
    else if ( (Xbuffer[2] > 11) || (Xbuffer[4] > 12) )
    {
        uart_tick = 1;
        rs485_status = DISABLED;
    }
    else if ( (Xbuffer[2] + Xbuffer[4]) > 12 )
    {
        uart_tick = 1;
        rs485_status = DISABLED;        
    }
    else 
    {
        // dR alanında haritalanmış dX ve dY vektörlerini güncelle:
        Read_X();
        Read_Y();
        dR[2].i = dX[0].i;
        dR[3].i = dX[1].i;
        dR[4].i = dY[0].i;
        // yanıt paketini hazırla:
        a = Xbuffer[2];  // okuma vektörü başlangıç adresi
        b = Xbuffer[4];  // okuma vektörü eleman boyu
        // header:
        Xbuffer[0] = my_rs485_address;
        Xbuffer[1] = 4;
        Xbuffer[2] = 2*b;
        
        // dR okuma vektörünü kopyala:
        for ( i=0; i<(a+b); i++ )
        {
            Xbuffer[2*i+3] = dR[a+i].b[0];
            Xbuffer[2*i+4] = dR[a+i].b[1];
        }
       
       response_size = 2*b + 3;
       rs485_status = RESPONSE; 
       
    }
    
}


static void RS485_Handler_05(void)
{
    unsigned char bix;
    unsigned int mask;
    
   // operator word'ünün Hi byte'ı kesinlikle 0 olmalıdır:
   if ( Xbuffer[4] )
   {
        uart_tick = 1;      
        rs485_status = DISABLED;       
   }
   else if ( Xbuffer[2] > 31 ) 
   {
        uart_tick = 1;      
        rs485_status = DISABLED;        
   } 
   else
   {
       // adreslenen bit dY[1] üzerinde ise:
       if ( Xbuffer[2] > 15 )
       {
           bix = Xbuffer[2] - 16;
           mask = (unsigned int) ( 1 << bix );
           if (Xbuffer[5] == 0)     dY[1].i &= ~(mask);
           if (Xbuffer[5] == 0xFF)  dY[1].i |= mask;
           if (Xbuffer[5] == 0x11)  dY[1].i ^= mask;    
       }
       // adreslenen bit dY[0] üzerinde ise:
       else
       {
           bix = Xbuffer[2];
           mask = (unsigned int) ( 1 << bix );
           if (Xbuffer[5] == 0)     dY[0].i &= ~(mask);
           if (Xbuffer[5] == 0xFF)  dY[0].i |= mask;
           if (Xbuffer[5] == 0x11)  dY[0].i ^= mask;              
       }
       
       UpdateOutputs();
     // komuta verilecek yanıt, komutun aynısının tekrar edilmesidir:
     response_size = 6;
     rs485_status = RESPONSE;       
   }
    
     
}


/*
 * 
 *
 */
static void RS485_Handler_0F(void)
{
  // bit address = 0, bit count = 32 olmalı.. H byte'lar önemli değil..
   if ((Xbuffer[2]) || (Xbuffer[4] != 32))
   {
     uart_tick = 1;
     rs485_status = DISABLED;
   } 
   else if ( Xbuffer[6] != 4 )
   {
     uart_tick = 1;
     rs485_status = DISABLED;
   }
   else
   {
     // gelen güncellemeyi dY vektörüne al:
     dY[0].b[0] = Xbuffer[7]; 
     dY[0].b[1] = Xbuffer[8];
     dY[1].b[0] = Xbuffer[9];
     dY[1].b[1] = Xbuffer[10];
     // ve output vektör güncellemesini çıkışlara yansıt:
     UpdateOutputs();
     // yanıt paketi, gelen paketin ilk 6 byte'ı + CRC:
     response_size = 6;
     rs485_status = RESPONSE;       
   }
}


/*
 * Bu fonksiyon Xbuffer[ ] dizisindeki response_size adet payload'u seri porttan yollar
 * Ardına da yollama esnasında hesaplanan 2 byte CRC'yi ekler.
 */
static void RS485_Response(void)
{
    unsigned char i;
    // not: Response fonksiyonuna girilmeden önce uart kesmeleri kapatılmış olmalı!
    RS485_DIR = 1;              // transceiver'ı gönderme moduna sok..            
    RCSTA1bits.CREN = 0;        // uart alıcısını kapat..
    TXSTA1bits.TXEN = 1;        // uart göndermesini devreye al..
    myCRC.i = 0xFFFF;           // CRC hesaplama değişkenini başlat
                                // gönderilen her byte için crc hesabı yapılmalı  
    for (i=0; i<response_size; i++)
    {
        TXREG1 = Xbuffer[i];
        DoCRC(Xbuffer[i]);
        while (TXSTA1bits.TRMT == 0) ;
    }
    // payload gittikten sonra CRC'yi yolla:
    TXREG1 = myCRC.b[0];
    while ( TXSTA1bits.TRMT == 0 );
    TXREG1 = myCRC.b[1];
    while ( TXSTA1bits.TRMT == 0 );
    
    TXSTA1bits.TXEN = 0;
    uart_tick = 1;
    rs485_status = DISABLED;   
    
    RS485_DIR = 0;
}