ARDUINO_PARALEL_VERİ_YOLU_SERİ_HABERLEŞME BENCHMARK

Arduino Haberleşme Sınırları: 115200 Baud Hız, Paralel Veriyoluna Karşı! (Benchmark Deneyi)

Bu yazıda, belki de şimdiye kadar mikrodenetleyici projelerinizde hiç kullanmadığınız, ancak karmaşık ve gerçek zamanlı (real-time) sistemlerde hayat kurtaran devrimsel bir yaklaşımı ele alacağız: Donanım Seviyesinde Paralel Veriyolu Mimarisi.
Hemen aklınıza şu haklı soru gelebilir:
Kartlar arasında zaten SPI, I2C veya UART (Seri) haberleşme var. Hatta endüstriyel sistemlerde CAN-Bus ve Modbus kullanıyoruz. Neden durduk yere daha fazla kablo çekip paralel haberleşme kullanayım?

Bunun cevabı bazen saf HIZ, bazen de mimari bir zorunluluktur. Üstelik paralel bağlantı deyince hemen gözünüz korkmasın; Arduino’nun tüm pinlerini feda etmek zorunda değilsiniz. Bu projede 74HC595 kaydırmalı yazmaç (Shift Register) entegresini kullanarak işlemci pinlerinden maksimum oranda tasarruf edeceğiz.

📺 İki Farklı Dünya, Tek Bir Yarış (Benchmark)

Sizler için Proteus üzerinde iki farklı simülasyon dünyası hazırladım. Bu simülasyonlarda iki adet Arduino Uno’yu yan yana koyduk ve aralarında kütüphanesiz bir paralel veriyolu kurduk. Sistemlerin başarısını ve hızını ölçmek için de yanına standart 115200 Baud hızında çalışan donanımsal bir Seri Haberleşme (UART) hattı çektik ve ikisini canlı bir yarışa (Benchmark) soktuk.
Ancak bu yazı, sadece iki fiziksel sistemi karşılaştırmakla kalmıyor; aynı zamanda “yazılımsal hızlandırma” sanatını gözler önüne seriyor. Ne kadar hızlı bir sistem istiyorsanız, kodunuzu da o derece donanıma yakın yazmanız gerektiğini canlı kanıtlarla göreceksiniz.

🛑 1. Senaryo: Amatör Hatalar ve Ters Köşe Olan Mantık

Amatör olarak elektroniğe başlayıp “Ben Arduino programlıyorum” dediğinizde, genellikle yüksek seviyeli dille yazılmış digitalWrite() ve digitalRead() gibi komutlara sığınırsınız. Kolay hatırlanan bu komutlar, ne yazık ki arka planda işlemciye onlarca gereksiz iş yaptırır ve sistemi inanılmaz derecede yavaşlatır. İşte karmaşık projelerde yaşanan o sinir bozucu donmaların, takılmaların ve zamanlama hatalarının arkasındaki gizli düşman budur!
Mantıken baktığımızda; paralel veriyolu tek bir komut darbesiyle 8 biti (yani 1 karakteri) kütle halinde karşıya basabildiği için, bitleri arka arkaya dizen seri haberleşmeye göre çok daha hızlı olmalıdır, değil mi?
Ancak hazırladığım 1. Senaryo (Hantal Kodlama) simülasyonunu çalıştırdığımızda şoke edici bir sonuçla karşılaşıyoruz: Seri haberleşme yarışı kazanıyor!
Neden Seri Port Daha Hızlı Çıktı?
Çünkü bu ilk senaryoda paralel veriyi göndermek için amatörlerin çok sık kullandığı digitalWrite() komutunu ve hantal bir for döngüsünü (Bit-Banging) tercih ettik:
void paralelKarakterGonder(char c) {
  // 1. 74HC595 entegresine veriyi yükle ve dışarı bas (Hantal Yöntem)
  digitalWrite(LATCH_PIN, LOW);
  for (int i = 7; i >= 0; i--) {
    digitalWrite(CLOCK_PIN, LOW);
    digitalWrite(DATA_PIN, (c >> i) & 1);
    digitalWrite(CLOCK_PIN, HIGH);
  }
  digitalWrite(LATCH_PIN, HIGH);
}

Buradaki for döngüsü 150 karakterlik bir cümle için tam 3600 kez digitalWrite() çağırıyor! İşlemci komut yetiştirmekten yorulurken, seri port (UART) donanımı arka planda bitleri kendi hızıyla erittiği için paralel yolu kolayca ezip geçiyor.

⚡ 2. Senaryo: Mühendislik Dokunuşu ve 14 Kat Hız Rekoru!

Şimdi gelin, paralel veriyolunun gerçek gücünü ve bizim haklılığımızı kanıtlayan 2. Senaryo (Mühendislik Seviyesi) simülasyonuna bakalım. Bu senaryoda paralel veriyolu, 115200 baud hızındaki seri portu tam 14.2 kat daha hızlı bitirerek şampiyonluk kupasını göğüslüyor! (896 mikrosaniye vs 12752 mikrosaniye).
Peki Bu Mucize Nasıl Gerçekleşti?
    1. Donanımsal SPI Gücü: 74HC595 entegresine bitleri el ile üflemek yerine, Arduino’nun içinde hazır bulunan dâhili SPI donanımını aktif ettik. Bu sayede veriyi işlemci hızının yarısında (8 MHz!) göndermek mümkün oldu.
    2. Port Manipülasyonu: digitalWrite hantallığını tamamen çöpe atarak, doğrudan işlemcinin dâhili kayıtçılarına (PORTB/PINC) hükmettik.
    3. Seviye Tabanlı Tam El Sıkışma (Full Handshaking): Alıcı ve verici arasına STROBE ve ACK hatlarını kurarak, araya tek bir delay() bile koymadan, iki işlemcinin birbirini donanımsal hızlarında senkronize etmesini sağladık. Sinyal kaçırma riskini sıfırladık.

İşte o hız canavarı, kütüphanesiz saf donanım kodu:
void paralelKarakterGonder(char c) {
  // 1. Latch kilidini indir (PORTB'nin 2. biti - D10 Pini)
  PORTB &= B11111011;

  // 2. KÜTÜPHANESİZ DONANIMSAL SPI YAZIMI
  // Karakteri doğrudan SPI Data Register (SPDR) içine fırlatıyoruz.
  // Donanım bunu 8 MHz hızında (1 mikrosaniyede) 74HC595'e üfler!
  SPDR = c;

  // Donanım bitleri hattedip göndermeyi bitirene kadar (SPIF bayrağı 1 olana kadar) bekle
  while (!(SPSR & (1 << SPIF))) {}

  // 3. Latch kilidini kaldır, veri artık 74HC595 çıkışlarında kararlı (D10 HIGH)
  PORTB |= B00000100;

  // 4. Alıcıya "Veri hazır" de: STROBE (D8 - PORTB0) HIGH yap ve öyle bırak!
  PORTB |= B00000001;

  // 5. Alıcı işini bitirip ACK (A1 - PINC1) sinyalini HIGH yapana kadar KİLİTLEN
  while ( !(PINC & B00000010) ) {}

  // 6. Alıcı onayladı! STROBE sinyalini kapatıyoruz: LOW
  PORTB &= B11111110;
  
  // 7. Alıcı kendi ACK sinyalini sıfırlayana kadar bekle ve yeni karaktere geç
  while (PINC & B00000010) {}
}

⚖️ Avantajlar ve Dezavantajlar Terazisi

    • Avantajımız: Arduino’nun değerli pinlerini paralel port için harcamadık, 74HC595 ile hattı kurtardık.
    • Dezavantajımız: Standart seri port sadece 2 kablo kullanırken, biz bu sistemde 74HC595 için 3 kablo ve el sıkışma (teyit) için de 2 kablo olmak üzere toplam 5 kablo kullandık.

Fakat dikkat! Bu dezavantaj sadece 2 Arduino arasındayken öyledir. Veriyoluna bağlanan alıcı Arduino sayısı (Multi-Node Bus) arttıkça, verici kısmındaki pin sayısı asla artmayacak. Çünkü 74HC595 entegreleri birbirine ardışık (Cascading) bağlanabilir ve tek bir 3’lü hat yüzlerce karta hükmedebilir. İlerleyen zamanlarda bu teyit hatlarını da çoklayıcı entegrelerle tek pine indireceğiz.

🏭 Gerçek Dünyada Bu Mimarî Nerede Kullanılır?

“Hocam altı üstü 3 tane LED yakacağız, bu kadar hıza ne gerek var?” diyebilirsiniz. Elbette basit işler için bu hıza gerek yok.
Ancak kafanızda büyük bir endüstriyel otomasyon makinesi (örneğin otomatik çalışan bir kaç motorlu ve birçok sensörü bulunan gelişmiş 3d printer gibi bir makine ) tasarladığınızı hayal edin:
    • Merkezdeki Master Arduino sadece veriyolunu, adresleri ve stratejiyi kontrol eder.
    • Hatta bağlı diğer yardımcı Slave Arduino’lar ise görevleri merkezden jet hızıyla alır; motorları, sensörleri, hat switch’lerini yönetir ve işi bitince merkeze “Ben görevimi tamamladım” der.

Hepsini tek bir Arduino’dan kontrol edemeyeceğiniz kadar devasa ve karmaşık sistemleri hem sıfır kilitlenmeyle hem de mühendislik kontrolüyle yönetmek istiyorsanız, tek çareniz PARALEL VERİYOLU mimarisidir. Ve bu mimariyi kurarken kütüphanesiz donanım kayıtçılarına bağlı kalmak, sizi her zaman en üst ligde tutacaktır.

🛠️ Proteus ve Simülasyon Notları

    • Bu projeyi Proteus 8.6.2 versiyonuyla çizdim. Eğer bilgisayarınızda daha eski bir versiyon varsa dert etmeyin; çizim son derece sade ve anlaşılırdır. Ek dosyalar arasına koyduğum PDF şemasına ve görsellere bakarak kendi versiyonunuzda rahatlıkla çizebilirsiniz.
    • Çok Kritik Bir Uyarı: İki Proteus şeması birbirine ikiz gibi benziyor olsa da, 1. Senaryo ile 2. Senaryo arasında 74HC595’in giriş pinleri farklı Arduino bacaklarına gitmektedir! İkinci senaryoda donanımsal SPI pinlerini (D10, D11, D13) kullandık. Lütfen bağlantıları kurarken bu farka azami dikkat gösterin.

İKİ SENARYONUN SONUÇLARI BURADA.

 

Yarışma sonuçlarının canlı aktığı kodlar ve Proteus dosyalarını, burada bulabilirsiniz.
Deneyip aldığınız hız skorlarını yorumlarda benimle paylaşmayı unutmayın!
Not: Bilgisayarın durumuna göre farklı sonuçlar üretilse de sonuç değişmeyecektir.
Kütüphanesiz ve özgür kalın, Mikrobotik ile elektronikte ve programlamada farklı deneyimleri izlemeye devam edin!

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir