Videonun 15. saniyesine kadarki sürede encoderin ürettiği palslerde 1. ve 2. kanalın arasındaki zaman farkı gayet net. Ancak palsler sıklaştığında sanırım kondansatörlerin de etkisiyle bu fark gittikçe azalıyor. Interrupt'ın kısa sürede yakaladığı bu kadar hareketi diğer kodların serial ekrana yazdırması esnasında da bize pals atlaması gibi görünen hadise meydana geliyor. Yani değişkenlerimiz o kadar hızlı değişiyor ki haliyle bazı sayılar (biz palsler olarak adlandırıyoruz) atlanmış gibi bir illüzyon meydana geliyor.
Bu nedenle encoder ne kadar sık pals üretip Arduino yahut Pico bunu yakalasa da ekranın bunu tam olarak gösterme kabiliyetinden daha hızlı olduğu için istediğimizi elde edemiyoruz. Çözüm olarak yapmamız gereken encoderin pals/zaman oranı üzerinden gecikmeler yoluyla bir çözünürlük üretip değişkenlerimizi doğru zamanda işleyecek bir kod yapısına ihtiyacımız var.
Nitekim en son paylaştığım kodda bunu denedim ve gayet sağlıklı sonuç aldım. Arduino Interrupt'ı içinde delay() gecikmesi çalışmıyor. Ancak delayMicroseconds() kullanarak yazdığım Gecikme() fonksiyonu zamana bağlı bu çözünürlüğü sağladı. Bununla birlikte kesme meydana geldiğinde bütün kesmeleri deaktive edip, bir Gecikme'den sonra kesmeden çıkıp, değişkenleri main loop içinde işledim. Bu işlemlerin ardından elde ettiğim değişkenleri ekrana yazdırdım ve bundan da sonra kesmeleri main loop içinde aktive ederek encoderin yeni button/dönüş hareketlerine imkan verdim.
Eğer o son kodları siz de çalıştırmayı denerseniz, daha önce paylaştığım kodlardaki gibi hayalet bir durum olup-olmadığını test etmiş oluruz. En azından bu kodlarda doğru sonuç almayı sağlayan yapıyı anlayarak ilerlemeye çalışabiliriz.
Sizden ricam önce elinde Arduino UNO olanların bu kodları kendileri aynıyla test ederek sonuçlarını paylaşması.