31 Aralık 2013 Salı

PIC16F877A'nın Yazılımsal Seri Haberleşmesi

Şekil 1.1
Bu makalede özel fonksiyon kaydedicileri (special function register - SFR) kullanılmadan senkron veri transferinin nasıl gerçekleştirileceğine değineceğiz. PIC16F877A MCU'nun seri haberleşme portu bulunmasına rağmen bu uygulamanın amacı, seri haberleşmeyi yazılımsal olarak nasıl kontrol edebileceğimize dair yaklaşımlarda bulunmaktır.

PIC16F877A MCU Teknik Özellikleri
Şekil 1.2
Şekil 1.3
Şekil 1.4
Şekil 1.4'den görüleceği üzere PIC16F877A mikrodenetleyicisi üzerinde donanımsal olarak (on-chip) seri ve paralel haberleşme kanalları mevcuttur. Haberleşme donanımı bulunan bir MCU üzerinde yazılımsal haberleşme olanakları sağlamanın mantıksal bir izahı yoktur. Gerek olmadığı halde yazılımsal olarak atılan her adım komut çevrim süresini uzatarak giriş biriminin sinyal yakalama süresinin uzamasına neden olur.
Şekil 1.5
Çevrim süresini kısaltmanın iki yolu vardır:
1- Yapılacak işi daha az komut kullanarak gerçekleştirmek.
2- Dahili komut işlem frekansını artırmak. 

PIC mikrodenetleyiciler, hızlı çalışmaları için RISC(Reduced Instruction Set Computer) işlemci olarak tasarlandı. RISC mimarisinde komutlar tek çevrimde işletilir. PIC'in dahili komut işletim frekansı, harici kaynak aracılığıyla sağlanan frekansın dörtte biri kadardır.  Şekil 1.5'de görüleceği üzere PIC16F877A için kullanıcı el kılavuzunda tanımlanan maksimum clock frekansı 20 MHz olup her komutun işletilmesi için gerekli sürenin (T = 1/f'den) 200 ns olduğu görülecektir. 

PIC16F877A'nın flash program hafızası 8K x 14 kelime olup (8 x 1024 = 8192 komut) yaklaşık 8192 satırdan(assembly kod) oluşan bir program yüklenebileceği bildirilmektedir. 8000 satırdan oluşan bir assembly kod yazdığımızı varsayalım. Kod içinde, herhangi bir döngü işlemine yer verilmeyecek şekilde bir  tasarım yapılıp çevrim için gerekli sürenin:

8000 (komut) x 200 (ns / komut) = 1600000 ns = 1.6 ms 

olarak hesaplandığını düşünelim. Tasarladığımız gömülü sistemde PIC MCU'nun senkronize olarak RB0 portundan harici bir IC ile haberleştiğini ve harici IC'nin anlamlı sinyal güncellenme periyodunun 1 ms olduğunu hayal edelim. PIC'e gömülen kodun çevrim süresinin 1.6 ms olmasından dolayı  böyle bir uygulamaya girişmek olası verileri kayıplarını göze aldığımız anlamına gelecektir. 

Haberleşme donanımı bulunan PIC'lerde ise, haberleşme işlemleri CPU'dan bağımsız bir şekilde gerçekleştirilmektedir. PIC'e veri gönderimi gerçekleştiğinde gelen veri öncelikle daha sonra kullanılabilmesi için tampon belleğe yazılır. Ardından kesme sinyali üretilerek CPU'ya uyarı sinyali gönderilir. Yazılımsal olarak kesme olaylarının aktifleştirilmesi halinde CPU ana programın işletilmesini durdurarak kesme alt programına dallanır. Bu sayede CPU'nun periyodik olarak seri portu kontrol etmesinin önüne geçilir. Genel bir kanı olarak belirtmeliyim ki donanımsal olarak yapılan her işlem CPU'nun yükünü hafifletecektir. 


Bu makaleyi kaleme alma nedenim, haberleşme donanımı olmayan PIC'lerin, senkron seri haberleşme protokolünde çalıştırılabileceğini göstermektir. Kaynak kod, seri haberleşme donanımı olmayan PIC'lere (Örneğin PIC16F84A) özel kalibre edilerek kullanımı elverişli hale getirilebilir. 

Uygulamada 74HC597 entegresi kullanılarak, 8-bitlik paralel verilerin seri formata dönüştürülmesi sağlanmıştır. Seri hale dönüştürülecek 8-bitlik paralel veri MSB(Yüksek Değerlikli Bit)'den LSB(Düşük Değerlikli Bit)'ye doğru aktarılır. Seri hale dönüştürülen veri, PIC mikrodenetleyici tarafından okunurken bu teknik detayı bilmekte fayda var.


8 bitlik paralel veri D[0:7] pinleri aracılığıyla 74HC597 entegresine girilir. MR girişine dijital 1 sinyali uygulandığında giriş birimindeki veriler işleme alınır. STcp pinine yükselen kenar saat sinyali uygulanarak paralel veri, latch'lere aktarılır. PL pinine yükselen kenar sinyal uygulandığında latch'de bulunan veri kaydırmalı kaydediciye aktarılarak paralel verinin seri formata dönüştürülmesi sağlanmış olur. Seri data çıkışı Q pininden olup PIC16F877A'nın RB1 pini ile ilişkilendirilmiştir.  PIC16F877A tarafından çözülen seri veri(yazılımsal olarak), paralel hale getirilerek 2 adet BCD 7-Segment sürülmüştür. 74HC597 entegresinin pin fonksiyonları Şekil 1.7 aracılığıyla öğrenilebilir.
Şekil .17
Seri verinin paralel hale dönüştürülmesi işlemi yazılımsal olarak gerçekleştirilmiş olup kaynak kod içinde gerekli teknik ayrıntılar, yorum satırları okunarak edinilebilir.

PROTEUS/ISIS ORTAMINDA YAPILAN SİMÜLASYONDAN KARELER


PIC ASSEMBLY KAYNAK KOD
(NOT: Notepad++'da 'Export to HTML' işlemini gerçekleştirirken oluşan hatadan dolayı kaynak kodu görüntü formatında paylaşıyorum.)


PROTEUS/ISIS ÇALIŞMA DOSYASINI İNDİR (.DSN)


ASSEMBLY KAYNAK KODU İNDİR (.ASM)


MAKİNE KODUNU İNDİR (.HEX)


OSİLASKOP GÖRÜNTÜSÜNDE HABERLEŞME (.PNG)



Hiç yorum yok:

Yorum Gönder