Arduino ile Binary Sayıcı Yapımı

Arduino ile Binary Sayıcı Yapımı

Arduino ile binary sayıcı (ikili sayıcı) yapmak; bilgisayarların kalbindeki ikili sayı sisteminin donanımla nasıl etkileşime girdiğini ve dijital mantık devrelerinin (logic gates) çalışma prensiplerini anlamak için son derece eğitici ve temel bir uygulamadır. Bu rehberimizde, 4-bitlik (0 ile 15 arası sayabilen) bir ikili sayacı hem standart Arduino kütüphane fonksiyonlarıyla hem de profesyonel mikrodenetleyici kodlamasında kullanılan port manipülasyonu (register seviyesi programlama) tekniğiyle adım adım kuracağız.

Binary Sayıcı Nedir?

Binary (ikili) sayıcı, dijital elektronikte ve bilgisayar mimarisinde saat (clock) darbelerine bağlı olarak sayma işlemlerini 0 ve 1’lerden (ikili sistem) oluşan bir dizi halinde gerçekleştiren ardışık mantık (sequential) devreleridir.

Senkron (Zaman Uyumlu) Sayıcılar: Sayımdaki tüm flip-flop’lar aynı anda tek bir saat darbesiyle tetiklenir. Tüm bitler eşzamanlı değiştiği için çok hızlıdır.
Asenkron (Dalgalı) Sayıcılar: İlk flip-flop saat darbesiyle tetiklenir, sonraki flip-floplar ise bir önceki elemanın çıkışından tetik alır. Devre yapısı basittir.
Kullanım Alanları: Dijital saatler, frekans bölücüler, bilgisayar işlemcilerinin komut döngüleri ve zamanlama sayaçları temel uygulama alanları arasındadır.

Arduino ile Binary Sayıcı Devre Şeması

Arduino ile Binary Sayıcı
Arduino ile Binary Sayıcı

Arduino ile Binary Sayıcı Kod Yapısı

Yöntem 1: Port Manipülasyonu (Register Seviyesi) ile

Doğrudan işlemci kayıtçılarına (registers) veri yazarak yapılan port manipülasyonu, standart digitalWrite() komutlarına kıyasla çok daha az flash bellekte yer kaplar ve mikrosaniyeler seviyesinde olağanüstü hızlı çalışır.

DDRD (Data Direction Register D): Arduino Uno’nun 0 ila 7 numaralı dijital pinlerinin yönünü (giriş mi yoksa çıkış mı olacağını) tek seferde belirler. Kodda yer alan DDRD = B10100000; satırı, ikili (binary) formatta sağdan sola doğru sayıldığında 5. ve 7. pinleri çıkış (1) olarak yapılandırır.

DDRB (Data Direction Register B): 8 ila 13 numaralı dijital pinlerin yönünü belirler. DDRB = B00001010; komutu ile bu bloktaki ilgili pinler çıkış moduna alınır. Port manipülasyonunda B ön eki, yazılan sayının ikili tabanda olduğunu belirtir.

void loop() Altındaki Lojik Döngü

Bu bölümde PORTD ve PORTB kayıtçıları üzerinden her sayım başında ilgili çıkış durumları tamamen temizlenir. Ardından arduino ile binary sayıcı değişkenimizin değeri 1’er artırılarak 2’nin kuvvetleri (2^0, 2^1, 2^2, 2^3) prensibine göre ikili sayı formatında ilgili LED’lere yansıtılır.

Yöntem 2: Standart Arduino API Fonksiyonları ile

Bu yöntem de aynı ikili mantığı kullanır; tek farkı doğrudan register adları yerine yeni başlayanların daha kolay okuyabileceği standart Arduino pinMode() ve digitalWrite() fonksiyonlarının kullanılmasıdır.

Hız Kıyaslaması ve Port Manipülasyonu Ne Zaman Kullanılmalıdır?

Olağanüstü Hız Farkı (Teknik Analiz): Standart digitalWrite() fonksiyonu, pin güvenliğini korumak için arka planda zamanlayıcıları kapatma, pin numarası doğrulama ve port haritası sorgulama gibi birçok ekstra yazılımsal güvenlik filtresinden geçer. Bu durum tek bir pinin konumunu değiştirmek için yaklaşık 3 ila 4 mikrosaniye harcanmasına yol açar. Doğrudan port manipülasyonu (örn: PORTD = B10100000;) uygulandığında ise bu işlem mikrokontrolcünün 16 MHz kristal saat frekansında tam olarak 1 saat çevriminde (clock cycle – 62.5 nanosaniye) tamamlanır. Bu da port manipülasyonunun standart fonksiyonlardan yaklaşık 50 ila 60 kat daha hızlı çalıştığı anlamına gelir!

  • Eş Zamanlı Tetikleme: Tek bir satır komutla aynı port üzerindeki birden fazla pini (örneğin 4 LED’i) nanosaniyeler içinde tam olarak aynı anda aktif edebilirsiniz.
  • Donanım Seviyesinde Öğrenim: İşlemcinin iç yapısını, veri saklayıcılarını ve bit işlemlerini kavramak için en verimli yoldur.
  • Okunabilirlik ve Bakım Zorluğu: Register seviyesindeki kodlar, bit işlemleri (<<, >>, &) barındırdığı için yeni başlayanlar için karmaşık görünebilir.
  • Farklı Kartlara Taşınabilirlik (Portability): Register isimleri mikrokontrolcü mimarisine göre değişir. Örneğin Arduino Uno (ATmega328P) için yazılan bir port komutu, bir Arduino Mega (ATmega2560) veya ESP32 üzerinde doğrudan çalışmaz.

Bu yüzden küçük hobi projelerinde önce standart kütüphane fonksiyonlarıyla mantığı kurmak, ardından aynı projeyi donanımsal hız kazanmak adına port manipülasyonuyla revize etmek en profesyonel öğrenme yoludur. AVR mimarisinin donanımsal register yapısını derinlemesine incelemek isterseniz, resmi ATmega328P Datasheet belgesi ana başvuru kaynağınız olacaktır.

Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.