STM32 projelerimde yıllardır SD kart kullanırım. Özellikle CNC uygulamalarımda Gerber kodları makinaya vermek için iyi bir seçenek oluyordu. Ancak kullanmakta olduğum sürücü kodları, zamanında internetten bulduğum örnekler üzerinden geliştirmiştim. Bu kodlar yaptığım eklemeler ve değişiklikler ile yamalı bohçaya dönmüş bir durumda idi.
Son zamanlarda, STM32 cube IDE platformuna geçtiğimden beri bunları güncelleyip temize çekmeyi aklıma koymuştum. STM32 CubeIDE FATFS alt yapısını da entegre etmiş olduğundan bu işe el atmanın zamanı gelmişti ve geçiyordu.
Geçenlerde kolları sıvayıp işe giriştim ve derli toplu bir sonuca ulaştım. Bu yayında bunu nasıl yaptığımı anlatacağım.
STM32 mikrodenetleyicisinin GPIO çıkışlarına bir şeyler göndermek istediğimizde başvuracağımız iki farklı yöntem var. ODR ya da BSRR kayıtçılarının seçtiğimiz bitlerine “1” ya da “0” yazarak bunlara karşı düşen GPIO pinlerini “1” ya da “0” konumlarına getirebiliyoruz.
Aynı işi yapmak üzere neden iki farklı kayıtçı kullanıldığı ilk bakışta çok belirgin değil. STM32 dokümantasyonundaki açıklamalar da tekrar açıklama gerektiriyor.
Hatta işi biraz daha kurcalarsak, aynı işi yapmak üzere kullanılabilecek iki kayıtçı daha, BRR ve BSR kayıtçılarının da olduğunu görüyoruz. Ben konuyu burada kendi cümlelerimle açıklamak istiyorum.
STM32 ye TFT bağlarken, paralel veri aktarımının SPI a göre çok yavaş kaldığını görerek şaşırmıştım. Halbuki tersi olmalıydı. Üstelik SPI’ı DMA ile kullanmadığımda dahi durum böyle idi. TFT SPI Hızları konusundaki yayınım için burayı tıklayabilirsiniz.
Halbuki benim elimde epeyce paralel arayüzlü TFT var, paralel TFT kullanan kitlerim ve projelerim var. Dahası, TFT nin dışında başka uygulamalar için de paralel veri aktarımı yapıp duruyorum. O halde bu konunun üzerine gitmeye değer diye düşündüm ve epeyi ilerleme kaydettim. Bu yayının konusu “STM32 de GPIO porta nasıl daha hızlı veri aktarılır” olacak.
TFT ekranları kullanmaya ilk başladığımda internetten bulduğum örnek kodları kullanmıştım. Karşıma çıkan tüm örnekler ekrana text yazmak için aynı algoritmayı kullanıyorlardı.
Bu algoritmada bir satırdaki her bir karakter sıra ile alınarak ekrana çiziliyor, sonra yanındaki karaktere geçilerek devam ediliyordu. Bu yöntem ile bir süre çalıştıktan sonra, görüntüleme hızının pek çok uygulamam için yetersiz kaldığını gördüm. Örneğin, bir encoderi okurken ekranı güncellemeye yetişemiyordum. CNC programımda da koordinat değerlerini motor adım süreleri içinde ekrana yazmak mümkün olmuyordu. Ekran güncellemek için diğer işlemleri bekletmek söz konusu değil elbette.
Bu sıkıntılar karşısında ekrana daha hızlı veri göndermenin yollarını araştırarak algoritmamı geliştirdim. Esas olarak iki konuda yaklaşımımı değiştirdim.
TFT ekranların SPI girişli ve 8/16 bit paralel girişli tipleri var. Bunlar data girişleri, ayrıca veri akışını kontrol eden kontrol pinleri de var.
Bu yayının konusu olan SPI girişli TFT lere ilk el attığımda, TFT ye gönderdiğim her byte öncesinde ve sonrasında TFT_RS ve TFT_CS kontrol pinleri ile senkronizasyon sağlıyordum. Tabi ki bu çok yavaş ve CPU yu meşgul eden bir yöntem idi. Çok kısa bir süre içinde bu yöntemi terkederek, çoklu veri paketleri gönderdiğim, kesmeleri kullandığım yöntemlere geçtim. TFT de görüntüleme hızları konusunda katettiğim yolu anlattığım yayına ulaşmak için burayı tıklayınız.
TFT’yi daha da hızlandırıp CPU üzerindeki yükü olabildiğince hafifletmek için DMA -Direct Memory Access- yöntemini kullanmaya başladım. Bunun nasıl yapıldığını anlatacağım.
Samandıra’daki evimize 2009 da taşınmıştık. Sekizinci yılda mutfak lavabosunun bağlı olduğu gider borusu önce zaman zaman tıkanmaya başladı, pompalayarak, ya da lavabo-aç türü kimyasallarla temizleyip devam ettik. Sonunda da tamamiyle tıkandı.
Aynı boruya bağlı bulaşık makinası da o kısmi tıkanıklıklar, zorlamalar sırasında arızalandı, iki üç defa servis çağırmak zorunda kaldık. Ama önceleri sorunun daralmış olan gider borusu olduğunu anlayamamıştık, sonradan işin ayırdına vardık.
Bu gider borusu soldaki fotodaki köşede. Lavabonun altında başlayıp sağ alt köşeye doğru eğimli olarak gidiyor. Ondan sonra buzdolabının olduğu köşeye doğru çok az bir eğimle geliyor. Bu köşeden sonra tekrar sağa dönerek bir metre kadar buzdolabının arkasında kalan köşeye, ama bu sefer sıfır eğim ile gidiyor. Son olarak, o köşeden de dik açı ile dönerek 2 metre ileride yerdeki çıkış noktasına yine sıfır eğim ile ulaşıyor. Görüldüğü gibi 3 metre kadar mesafeyi, yarısı sıfır eğim ile kateden 50 mm ilk PVC borudan bir giderimiz var.
Bir de krokisini çizelim oldu olacak:
Krokideki kırmızı bölüm buzdolabının ve mutfak dolaplarının arkasında kalan sıfır eğimli borular. Bu kısım ve hatta bunun öncesindeki hafif eğimli bölüm tamamiyle tıkanmış vaziyette idi, hiçbir şekilde ulaşılamıyordu, son derece sert bir pislikle dolmuş durumdaydı.
İlk akla gelen ve tesisatçıların önerdikleri, seramikleri kırıp kaldırıp boruları tamamiyle değiştirmek idi. Ama bu korkunç müdaheleyi göze alsak dahi kesin çözüm olmayacaktı, zira yine aynı şekilde eğimsiz bir tesisat yapacaktık, 8-10 yıl sonra gene tıkanacaktı.
Bunun üzerine yine ben kolları sıvadım, buzdolabının arkasında görünmeyen bölgede boruya erişip bir delik açarak temizlemeye karar verdim. Açtığım deliğe de bir bakım kapağı koyup ileride tekrar aynı şey başımıza geldiğinde müdahale edebilecektim.
Boruya ulaşmak için duvar dibindeki tek bir seramiği kesip kaldırmak yeterli olacaktı. Zamanında tesisatı yaparken epeyi fotoğraf çektiğimden seramiklerin altından ne çıkacağını, borunun nereden geçtiğini çok iyi biliyordum. Bu önemli idi, zira bu pis su borusu tek başına değildi, onun yanısıra sıcak-soğuk su boruları ve elektrik tesisat boruları da gidiyordu. Ezbere yapılacak bir kırma delme işi çok ciddi sonuçlara yol açardı.
Önce buzdolabını çekip alet edevatı hazırlayarak işe giriştim. Bunun için hanımın evde olmadığı bir günü seçtim, tahmin edebileceğiniz nedenlerle.
burada görülen Karcher basınçlı yıkama aleti, borulara basınçlı su vererek temizlik için kullanılacak. Ama önce katı pisliği temizlemek gerekiyor.
Buzdolabı çekildi, inşaat alanı hazır.
Sırada pis su borusuna ulaşmak üzere seramiği kırmak var. Hassas bir operasyon olacak.
Seramik kırılarak borunun çevresi açıldı, buraya kadar sorun yok.
Biraz yakından bakalım. Siyah elektrik tesisat borusu ve temiz su boruları engel oluşturmayacak. Şanslıyım.
Boru buat açma testeresi ile delindi. Yalnız, bu testerenin ortasından aşağıya uzanan kılavuz matkap ucunu hesaba katmamıştım, az kalsın matkabın ucu borunun alt tarafını delecekmiş. Şans eseri kurtarmışım. Bazan -nadiren de olsa- şansım yaver gidiyor. Borunun içindeki sıkıştırılmış kum görüntüsündeki pislik görünüyor. Bu pislik borunun yatay gittiği bölümleri tamamiyle doldurmuş halde.
Borunun içini kalıncana bir galvaniz tel ile sağa sola dürtükleyerek temizledim. Bu arada musluğu önce az, sonra tam olarak açarak ufalanan pisliklerin su ile akıp gitmesini sağladım. En son da tazyikli su makinasıyla nihai temizliği yaptım.
Boruyu tıkayan, yılların birikimi tortular böyle. Adeta alçı dökülmüş gibi, kaskatı bir şey. Deterjan, yemek, yağ, artık lavaboya ne gidiyorsa zamanla beton gibi olup böyle sonuçlanıyor. Bu ancak mekanik yöntemlerle temizlenebiliyor. Öyle kimyasal ya da basınçlı su ile olacak iş değil. Pis su borularında eğimin hayati önemi var. Benim burada eğim verme şansım olmadı, zira duvarı bu kadar oymam mümkün değil, taşıyıcı beton perde var. Yüzeyden iki santim ötede karşıma betonun demirleri çıkıyor..
Şimdi yıllar içinde yeniden böyle bir birikim olacak. Onun için sırada bu açtığım yere bir bakım kapağı koymak var.
Bakım kapağını yerleştirdim. Bakım kapaklı PVC boruyu buraya geçirebilmek için, boyuna keserek bir tarafını açtım. Biraz esneterek delmiş olduğum yerin üzerine oturttum. Gayet güzel ve sıkıca yerleşti. Yapıştırmak ve sızdırmazlığı sağlamak için altına bolcana Tangit sürdüm.
Tangitin sertleşmesinden sonra epeycene test ettim, ama su seviyesini kapağa kadar yükseltmenin bir yolunu bulamadığım için gerisini zamana bıraktım.
Artık sıra buraya bir kapak yapmaya geldi. Yeniden harç ve seramik işine girişmek istemediğim için önce tahtadan bir kapak uydurdum. Tahtanın kapağa baskı yapmadığından emin oldum. Bu kapak seramik seviyesinden birkaç milimetre aşağıda şu haliyle.
Nasıl olsa buzdolabının altında kalacağı için işin kozmetik yönünü kafama pek takmadım. Bu çözümün bizi kurtardığı felaketi düşününce ödenen küçük bir bedel.
Buzdolabı tekerleri o tahta kapağın üzerinden geçemeyecek. Onun için alüminyum profilden bir takviye plakası koyup silikonla sabitledim.
Buzdolabı biraz itekleyerek zorlayınca kapağın üzerinden yürüyerek yerine yerleşti. Ve iş tamamlandı.
Tesisatçıların önerisine uyup bütün mutfağı harap etmeden bu işi çözebildiğim için memnunum.
Bu arada söyliyeyim, bu işe girişmeden önce “kırmadan dökmeden yapıyoruz” diye reklam yapan tesisatçılardan birisini de çağırmıştım. Boru içine sokulan kameralarla, tıkalı boruları açamda kullanılan motorlu spiral hortumlu bir makina ile gelip epey uğraştılar. Ama o spiral, 90 derecelik dirsekleri dönemediği için 1 metreden öteye gidemedi. Üstelik benim durumumda dönülmesi gereken bir değil, üç tane dirsek var.
Bu işi 2017 de yaptım. Sekiz dokuz yıl sonra bakım kapağını açıp durumu kontrol etmekte yarar var, bu sefer borunun tıkanmasını beklemeyelim. Zira su seviyesi yükselir ve basınç da artarsa bu kapaktan su sızıntısını göze alamam, alt komşu ile papaz oluruz.
Bu yayının sonu – Selçuk Özbayraktar – Haziran 2020
Onarım işleri ikide birde karşıma çıkıyor ama, galiba yazmaya değmez diye burada yayınlamıyorum. Onu yayınlama, bunu yayınlama, sonunda blog sitesi dinamizmini kaybediyor. Bununla başlayalım, bakalım arkasını getirebilecek miyim.
Geçenlerde oğlumun eski Samsung televizyonu bozulmuş. İçinden patlama sesleri gelip susmuş ve bir daha da açılmamış. LE32A550P1 RXXH kodlu, 7-8 yıllık bir LED tv.
Böyle arızaları severim, cihazın tamamiyle ölü olduğu durumları yani. Zira mefta gayet kararlı bir konumdadır. Gelir gider, bazan görünür, bazan kaybolur arızaların teşhisi zor olur.
Hele cihaz tamamiyle ölü durumda ise bakacağınız yer besleme devreleridir, nereden başlayacağınızı bilirsiniz.
Neyse TV nin arka kapağını açınca karşımıza aşağıdaki manzara çıkıyor:
Bu epey eski bir televizyon. Smart TV tipinde değil, aptal bir set.
Ama Samsung’un geleneksel TV tasarımına uygun düşüyor. Yeni modellerde ekran sürücü ayrı bir grafik modül üzerinde yer alıyor.
Neyse, arkası açık iken besleme verip duruma bir bakınca hiç hayat olmadığı tekrardan doğrulandı. Kontrol edince zaten sigortanın da atmış olduğunu gördüm.
Yüksek gerilimler nedeniyle dikkatli olmak gerekiyor, hele son aylarda tek göze kalmış olmamam nedeniyle benim süper dikkatli olmam lazım. Zira 3 boyutlu göremiyorum.
Besleme modülünü çıkartıp masamızın üzerine aldık. Sigortasının atmış olması arızanın mutlaka burada olduğu anlamına gelmiyor ama gene de %90 ın üzerinde bir ihtimalle suçluyu burada bulacağız.
Bir alkol banyosu ile temizliğin ardından sıkı bir göz muayenesi ile, giriş katı ile inverter bölgesi arasındaki yüksek gerilim disk kondansatörünün bir bacağının eriyerek kopmuş olduğunu, bunun hemen yanından geçen bir köprüleme telinin de sigorta gibi eriyerek açılmış olduğunu gördüm. Bunu görmek öyle kolay oldu sanmayın, pek çok devre elemanında yaptıkları gibi bu bölgeye de silikon dökerek üzerini örtmüşlerdi.
Silikonla yapılan bu tür sabitleme yöntemlerini hiç sevmiyorum. Arızaları gizlediği gibi, tozu kiri toplayıp, nemin de etkisiyle arızalara yol açıyor. Burada silikonu bir yüksek gerilim dekuplaj kondansatörünün üzerine dökmüşlerdi. Bunun çatlak ve kıvrımları arasında biriken nemli toz da kısa devreye yol açmış.
Bu silikonla tesbit işini MOSFET lere de uyguluyorlar, son derece hassas olan gate ayakları da silikonla kaplanıyor. Neden böyle yaptıklarını anlayamıyorum. O tranzistorlar zaten soğutuculara vidalanıp bağlanmış durumda, daha da sabitlenmelerinde ihtiyaç yok ki.
Sonuçta, elimdeki hurda güç kaynaklarından söktüğüm bir 2200pF 2kV lık bir seramik disk kondansatörü kullanarak arızayı gidermiş oldum. Eriyip kopan teli de değiştirince TV miz çalıştı, bir on yıl daha hizmet eder artık.
Türlü çeşitli TFT grafik ekranları uzun zamandır STM32F103 mikrokontroller ile kullanıp duruyordum. Bunlardan bir bölümü SPI arayüzlü, kimisi de 8 bit paralel girişli ekranlar.
Kendi tasarladığım STM32 geliştirme kitlerinde ekran konnektörlerinde data pinlerini aynı porttan sıralı olarak, B8 B9 … B15 olarak verip basit bir algoritma ile sürüyorum. Ama, elimdeki hazır geliştirme kitlerinde ekrana giden bağlantılar böyle aynı porttan ve sıralı olmuyorlar.
Malzeme kutularımda yıllardır durmakta olan Nucleo kitine TFT takıp kullanmaya kalkışınca, ekran sürücü kodlarımı revize temek zorunda kaldım. Bu yayının konusu bu.
STM32 Çalışmalarımda 4-5 aydan bu yana register seviyesinde programlamayı bırakıp HAL kütüphanelerini kullanmaya başladım. STM32 CubeIDE platformunu kullanıyorum.
Bu yeni ortama adapte olmak öyle bir kaç günde olmuyor. El attığım her yeni çevre birimi ve metod ile birlikte mutlaka birkaç sorunla karşılaşıyorum, bazılarının çözümü de epey vakit alıyor.
Burada ele aldığım konu aslında temel programlama tekniklerine dikkat edildiğinde kolaylıkla savuşturulabilecek bir sorun, ama insanın bazan basireti bağlanabiliyor böyle.