06- UART Seri İletişim Kütüphanesi

06- UART Seri İletişim Kütüphanesi

Merhaba sevgili okuyucu.

Bir sistem tasarladığınızda sistemin başka sistemlerle konuşup veri alışverişinde bulunma ihtiyacını hissedersiniz. Bunu gerçekleştirmenin en basit yolu da USART iletişim tipini kullanmak. Bu yazıda PIC in kendi dahili USART modülünü kullanarak çift taraflı iletişim gerçekleştireceğiz.

USART (Universal Synchronous Asynchronous Receiver Transmitter) Türkçe adıyla Evrensel Eşzamanlı Eşzanansuz Alıcı Verisi demektir. Bir diğer adı SCI (Serial Communications Interface) Seri iletişim arayüzüdür.

Asenkron iletişimi tercih edeceğiz yani UART olarak kullanmış olacağız. Bunun nedeni ise hem kolay kullanılması hem de iki pin ile bunu halledebilmemiz. Tek pin ile de bunu gerçekleştirmek mümkün hatta. Buna sonraki bir yazıda değinmeyi düşünüyorum.

Bu modül için RC6/TX/CK ve RC7/RX/DT pinlerini kullanacağız.

TX veriyi karşıya göndereceğimiz pin, RX veriyi karşıdan alacağımız pindir.

Öncelikle PIC imiz başladığında bazı ayarlar yapılması lazım. UART modülünün açıp iletişim hızını belirlememiz lazım. 16F877A datasheet ini açıp ilgili UART bölümüne gittiğimizde bizi 3 register karşılıyor. Biz buradaki değerlerle oynayarak ayarlarımızı yapıp gönderim ve alım işlemini gerçekleştireceğiz. Donanımsal seri iletişim modülü olması yazılımsal anlamda işimizi çok kolaylaştırıyor. İleride yazılımsal seri iletişime de yer vereceğim.

Öncelikle ilk register olan TXSTA yı inceliyoruz.

  • CSRC: Saat kaynağı seçimi
  • TX9: 9 bit gönderim aktifleştirme
  • TXEN: Gönderim aktifleştirme
  • SYNC: USART tipi seçimi
  • BRGH: Yüksek hız seçim biti
  • TRMT: Gönderim durumu
  • TX9D: 9. bit değeri

uart1

Biz asenkron iletişim metodunu kullanacağımız için CSRC değerine 9. biti kullanmayacağımız için de TX9, TX9D bitlerine ihtiyaç duymuyoruz. Herhangi bir değişiklik yapmamız gerekmiyor.

İkinci register olan RCSTA yı inceleyelim.

  • SPEN: Seri port aktifleştirme
  • RX9: 9. bit alıcı biti
  • SREN: Tek alıcı aktifleştirme
  • CREN: Devamlı alım biti
  • ADDEN: Adres tespit aktifleştirme
  • FERR: Framing hata biti
  • OERR: Overrun hata biti
  • RX9D: 9. bit alınan veri

uart2Burada da asenkron iletişim istediğimiz için SREN bitine 9. biti kullanmayacağımız için RX9, ADDEN, RX9D bitlerine ve hata bitlerini kontrol etmeyeceğimiz için FERR, OERR bitlerine gerek duymuyoruz.

Bunlar ile ilgili gerekli ayarlarımızı yapalım.

SPEN bitini 1 yaparak seri port kullanımını aktifleştiriyoruz.

SYNC değerini 0 yaparak asenkron modu seçiyoruz.

TXEN bitini 1 yaparak iletişimdeki veri gönderme ayarını aktif ediyoruz.

CREN bitini 1 yaparak veri alım ayarını aktif ediyoruz.

Ayrıca C7 ve C6 portlarının giriş mi çıkış mı olduğunu da ayarlamamız gerekiyor.

Şu an elimizde seri iletişim modülü aktifleşmiş, asenkron moda alınmış, veriyi hem göndermeye hem almaya uygun bir PIC mikrodenetleyicimiz var. Sıra geldi bu iletişimin hızını ayarlamaya.

SPBRG register değerini datasheet de yer alan formüle göre bulacağımız değer ile dolduracağız.

uart3Görüldüğü gibi iki adet hız ayarımız bulunmaktadır. Bunu henüz ayarlamadığımız BRGH biti ile kontrol ediyoruz.

Yavaş mod için : Baud Rate = F OSC /(64 (X + 1))

Hızlı mod için : Baud Rate = F OSC /(16 (X + 1))

formüllerini uygulamamız lazım.

uart4

Bir sonraki sayfaya baktığımızda hangi hızda yavaş ve hızlı modda hangi iletişim tipinin ne kadar hata ile gerçekleşeceği gösteriliyor. Buraya bir sonraki yazıdaki örneklerde bakacağız.

Baud Rate yerine istediğimiz iletişim hızını, F OSC yerine ise kullandığımız osilatör değerini girip X değerine ulaşmamız gerekiyor. X değerlerini yalnız bıraktığımızda

Yavaş mod için : (_XTAL_FREQ / (baudrate*64)) – 1

Hızlı mod için : (_XTAL_FREQ / (baudrate*16)) – 1

formüllerini elde edebiliriz. Osilatör değerini üstte yazdığım şekilde yazarak otomatik olarak okutabiliriz. baudrate değerini ve hızlı mı yavaş mod mu olması gerektiği bilgisini biz dışarıdan vereceğiz. Bu hesaplama ve ayarları göz önüne aldığımızda dışarıdan iki değişken alan aşağıdaki fonksiyonu elde ediyoruz.

Sırasıyla

  • İletişim ayarları yapıldı
  • Giriş çıkış ayarları yapıldı
  • Hızlı mod veya yavaş moda göre hesaplamalar yapıldı
  • Bu sırada BRGH değerine eğer hızlı mod seçildi ise 1 değeri verildi.
  • Hesaplanan değer SPBRG değerine aktarıldı.

 

Sıra geldi veri gönderimi fonksiyonuna. Ayarlar yapıldığı için ve kullandığımız modül donanımsal olduğu için tek yapmamız gerek şey donanımın meşgul olup olmadığını kontrol edip eğer meşgul değil ise veriyi donanımsal değişkene aktarmak.

TRMT biti iletişim yolunun meşgul olup olmadığının bilgisini verir bize. TMRT biti 0 ise yol meşguldür demektir. “while(!TRMT);” komutu bize “TRMT değeri 0 olana kadar bekle der. Bu sayede bu komuttan sonra göndermeye uygun duruma gelir PIC. Aşağıdaki gibi bir fonksiyon ile bunu sağlayabiliriz. Gönderilen verinin bir “char” yani “1 byte” yani “8bit” değerinde olduğunu unutmayın.

Gönderme komutu yanında bir de veri okuma fonksiyonu yazalım. Aynı veri gönderme gibi yapılır fakat daha önce bahsettiğimiz register larda değil de PIR1 register ı içindeki RCIF değeri ile okunur verinin gelip gelmediği. Bu değerin 1 olması verinin geldiğinin haberini verir. Okuma işlemini ise RCIF 8 bitlik değerden yaparız. Fonksiyonu aşağıdaki şekildedir.

Yazma işlemi için bir fonksiyon daha yazmamız yararlı olur. Nedeni de bizim yazma fonksiyonumuzun sadece 1 byte veri alabilmesi. Biz bir cümle göndermek istersek tek tek uğraşmak yerine bunu da bir fonksiyon ile yapabiliriz. Verdiğimiz değeri karakterlerine ayırarak tek tek gönderen fonksiyon da şu şekilde olur.

 

SONUÇ

Sonuç olarak böyle bir kütüphane dosyası elde etmiş oluyoruz. bunu .h formatında kayıt ederek seri iletişim kullanacağımız herhangi bir yere atabiliriz. Siz yine de aşağıdaki linkten indirebilirsiniz.

Bir sonraki yazıda, oluşturduğumuz seri iletişim kütüphanesi ile yaptığım örnekler yer alacak. Buraya tıklayarak o yazıya gidebilirsiniz.

Görüşmek üzere