PIC Programlama – 11 – USART

Merhabalar,

Önceki yazı ile birlikte, bir mikrokontrolöre nasıl SDK geliştirebileceğimizi ve PIC16F84A’nın tüm modüllerini detaylıca incelemiştik. Her iki başlık için de gerekli mesajların verildiği, gerekli bilgilerin aktarıldığı düşüncesi ile PIC yazılarının seyrini biraz daha değiştiriyorum.

PIC programlama yazı dizisinin bu bölümünde, şu zamana kadar incelemediğimiz, ancak gömülü sistemler dünyasının adeta kolonları/kirişleri olan temel modülleri inceleyeceğiz. Bunların başında da USART modülü geliyor. PIC16F84A’da ne yazık ki USART modülü bulunmuyor. Bu sebeple PIC16F877A üzerinden devam edeceğiz 🙂 Bu defa, PIC16F877A için de ayrıca bir kütüphane yazmak yerine, mecvut kütüphaneleri kullanarak uygulama yapacağız. Kütüphane geliştirme ile ilgili bilgileri önceki yazılarda yeterince işlemiş olduğumuzdan, bu yola girmekte artık bir sakınca görmüyorum. Dileyen azimli arkadaşlar, PIC16F877A için de kütüphane yazabilirler.

Şimdi gelelim her zamanki gibi USART’a bir girizgah yapmaya. Ancak öncesinde irdelememiz gereken bir başka önemli kavram var…

Haberleşme 

Bir bilgiyi, bir kaynaktan başka bir hedefe aktarmak o bilgili veriye dönüştürüp; veriyi kaynaktan hedefe aktaracak bir haberleşme hattı kurmakla mümkündür. Çok derinden girdiğimiz bu hususu bir örnekle irdeleyelim. Ali adlı arkadaşımız, o anki şaşkınlığını ifade eden ‘A’ sesini, Veli’ye duyurmak istediğinde haberleşme süreci nasıl oluşur?

Şaşkınlık bilgisi bu şemada ‘A’ sesi ile kodlanmıştır. Bu bilgi, havayı belli frekansta titreştiren ve Ali’nin ağzından gelen ‘A’ sesi vasıtası ile havada ilerler ve Veli’nin kulağında oluşan titreşimlerin algılanması ile Veli’ye bu veri aktarılır. Ardından Veli’nin beyni bu veriyi tekrardan bilgiye dönüştürerek ‘A’ sesini algılar ve Veli; Ali’nin şaşırdığını algılamış olur. Bu şemada kaynak Ali, hedef Veli, haberleşme kanalı hava, bilgi şaşkınlık, veri ise ‘A’ sesi olmaktadır. Haberleşme ses vasıtasyla da taşınsa, elektriksel olarak da taşınsa bu şema değişmez. Bilgi, veri ve haberleşme kaynaklarını açıkladığımız bu örnek çok saf ve naif görünse de, kompleksleşen haberleşme sistemlerinde temelleri hatırlamak ve bu gerçekliklerin farkında olmak hayat kurtarmaktadır.

Bilginin veriye dönüşümü, bu yazının odak noktası olmadığından; biz verinin aktarımı üzerine yoğunlaşacağız.Peki tek bir veriyi değil de, birden fazla veriyi göndermek istediğimizde ne yapacağız?

Paralel ve Seri Haberleşme

Yukarıdaki örnekte Ali’nin biraz daha konuşkan biri olduğunu düşünelim. Ali, Veli’ye “Selam Veli” dediğinde sesler ardışıl olarak; yani peşi sıra olarak Veli’ye gider. Yani Ali sırasıyla önce ‘S’,’e’,’l’,’a’,’m’ der biraz bekler, ardından sırasıyla ‘V’,’e’,’l’,’i’ harflerini peşisıra söyler. Veli de bu sesleri -kısa bir gecikmeden sonra- aynı sıra ile duyar. İşte bu şekilde ardı-sıra veri aktarımı olan haberleşme şemaları, seri haberleşme şemaları olarak adlandırılır. Özellikle, tek haberleşme kanalının bulunduğu durumlarda, bu haberleşme yöntemi kullanılır. Seri haberleşmede yalnızca tek kanal kullanılır, ancak tüm veri sırasıyla gönderildiğinden tüm verinin aktarımı zaman alır.

Paralel haberleşmede ise veri, -adı üzerinde- paralel olarak gönderilir. 8 hoparlörü olan bir cihaz, 8 mikrofonu olan bir cihaza ‘Selamlar’ mesajını paralel olarak iletmek isterse (her bir hoparlörü sadece 1 mikrofonun duyabildiğini varsayarsak) 1. hoparlör ‘S’ sesini, 2. hoparlör ‘e’ sesini, … , 8. hoparlör ‘r’ sesini aynı anda çıkartır. Karşı tarafta da bu sesler mikrofonlardan aynı karşılıkla aynı anda algılanırsa; tüm sesler paralel olarak gönderildiğinden bu haberleşme adı üzerinde “paralel haberleşme” olur. Paralel haberleşme, birden fazla haberleşme kanalı gerektirir ancak bilgi daha kısa sürede aktarılır.

Aynı konseptler elektriksel olarak da geçerlidir. Yani ses yerine bitleri inceleyecek olursak, aşağıdaki gibi bir gösterim yapmamız yanlış olmaz. [Resim Wikipedia sayfasından alınmıştır.]

Güzel.. Şimdi dönelim konumuza. USART dediğimiz nane, bir seri haberleşme algoritması olup; sıkça kullanılmaktadır. Özellikle “tracing”,”serial logging” gibi işler için; sıklıkla USART kullanılır. Ayrıca USART ile haberleşen çok sayıda sensör vb. elektronik ekipman bulunmaktadır.

PIC16F877A ve USART

Şimdi gelelim PIC16F877A ile USART haberleşmesi yapacak kodu yazmaya… Bunun için oldukça basit bir örnek yapacağız. İlk hedefimiz, USART üzerinden “Merhaba dünya!” yazısını gönderecek bir kod yazmak. Bunu, Microchip’in en yeni kütüphanesi olan; xc kütüphanesini kullanarak yapacağız. Unutmayınız ki, xc kütüphanesini kullanabilmek için XC8 derleyicisini yüklemeniz gerekmekte.

USART haberleşmesi seri bir haberleşme olduğundan, verilerin ardı sıra gönderilimindeki zamanlama çok önemlidir. Bu sebeple, kodumuza PIC16F877A’nın kristal osilatör fraksnsını aşağıdaki gibi giriyoruz.

Öncelikli olarak UART_Intialize fonksiyonunu incelemeye başlayalım. PIC16F877A’nın C portunun 6. pini USART_TX (transmit, veri gönderme), 7. pini ise USART_RX (receive, veri alma) pini olduğundan, 6. pini çıkış, 7. pini giriş olarak konfigure ediyoruz. Buna ilişkin kod aşağıda yer alıyor:

Ardından modülümüzü konfigüre edeceğiz. Buna göre datasheet’e baktığımızda konfigüre etmemiz gereken kütüklerin TXSTA, RCSTA, SPBRG kütükleri olduğunu görüyoruz. Veri göndermek için ise TXREG kütüğüne ihtiyaç duyacağız. Veri kağıdından sırası ile bu kütüklerle ilgli bilgilere bakıp, konfigürasyonumuzu yapalım 🙂

Buna göre SYNC=0 (Asenkron mod), BRGH = 1 (Yüksek hızlı mod), TXEN=1 (Veri gönderimi aktive edildi, izin verildi), TX9=0 (8 bit veri aktarımı modu) şeklinde konfigürasyon yaptığımız gözüküyor 🙂

Şimdi hemen diğer bir önemli kütüğümüz olan RCSTA’ya bakalım.

Buna göre RX9=0 (8 bit mod), ADDEN= 0 (9. bit parity biti olarak kullanılsın), CREN=1 (Sürekli veri alımı aktive edildi, izin verildi), SPEN=1 (Seri port aktive edildi) şeklinde konfigürasyon yaptığımız gözüküyor 🙂

Seri haberleşmemizi 9600 baudrate’te yapmak istiyoruz. Buna göre SPBRG kütüğüne yazmamız gereken değeri, PIC16F877A’nın datasheet dökümanından buluyoruz.  Buna göre, veri kağıdının aşağıdaki kısmından da görülebildiği üzere BRGH bitinin durumuna göre hesaplamalar değişiyor. Biz BRGH=1 olacak şekilde konfigüre etmiştik.

Bir diğer önemli tablo da, BRGH seçim tablosu. Veri kağıdından aldığım tablolar ise aşağıdaki gibi:

Yukarıdaki tablonun alt kısmını kullancağız, çünkü BRGH=1 olarak konfigüre etmiştik. Kullanacağımız osilatör frekansı 4MHz olduğunda ve istediğimiz Baudrate (veri aktarım hızı) 9600 baud = 9.6K baud olduğundan, SPBRG değerinizin 25 olması gerektiği tablodan görülebiliyor. Biz de bu sebeple aşağıdaki konfigürasyonu yaptık:

Artık USART modülümüzü konfigüre ettiğimizden, veri gönderme kısmına geçelim. Veri göndermek için yapmamız gereken şey, göndereceğimiz 8 bitlik değeri TXREG kütüğüne yazmak. Ancak hali hazırda gönderilmekte olan bir veri var ise öncelikle onun gönderilmesini beklememiz gerekiyor. TRMT biti 1 oldğunda veri gönderimi yok demektir. Buna göre TRMT kütüğü sıfır olduğu sürece bekliyoruz.

Yukarıdaki fonksiyon ile her seferinde 8 bitlik bir veri gönderebiliriz. Bu, her seferinde en fazla 1 ASCII karakteri gönderebileceğimiz anlamına geliyor. String, yani karakter dizisi göndermek için ise aşağıdaki fonksiyonu yazdık.

Buna göre uygulamamızın Proteus ISIS simülasyonundaki çıktısı aşağıdaki gibi oluyor [Benzetimden önce PIC16F877A’ya sağ tıklayarak Processor Clock Frequency parametresini 4MHz yapmanız gerekmekte] :

Şimdilik bu kadar 🙂 Bir sonraki yazımızda USART RX kesmesini ve USART aracılığı ile veri okumayı inceleyeceğiz.

 

Yazıları beğendiyseniz, faydalanabilecek tanıdıklarınızla paylaşmayı unutmayınız.

Önceki Sayfa   Sonraki Sayfa

Leave a Reply