C ile AVR Programlama -23- UART Kütüphanesi

avr-libc kütüphanesinde bir örnek projede yer alan usart kütüphanesi olsa da AVR’de bu tarz kütüphanelerin resmi sürümleri Arduino’da olduğu gibi yoktur. Bizim yapmamız gereken teknik veri sayfasını (datasheet) okumak ve bunun üzerinden C/C++ dilinde kod yazmaktır. Fakat AVR’nin açık kaynak programcılık anlayışında olan bir kullanıcı kitlesi olduğu için kullanıcılar tarafından yazılan kütüphaneler internette ücretsiz kullanıma sunulmaktadır. Biz de yazdığı kütüphaneleri AVR topluluğu tarafından yaygınca kullanılan bir geliştiricinin kütüphanesini inceleyip kütüphane referansını size anlatacağız. Amatör kütüphaneler oldukça fazla olsa da kaliteli ve taşınabilir (portable) kütüphane yazmak usta işidir. Bu inceleyeceğimiz kütüphane de genel olarak taşınabilirliği ve işlevi yüksek bir kütüphanedir. Bu kütüphanenin fonksiyonlarını tek tek açıklayacağız. Öncelikle kütüphane dosyalarını aşağıdaki bağlantıdan indirip bilgisayarımızda açalım.

http://homepage.hispeed.ch/peterfleury/uartlibrary.zip

Kütüphanenin referans kılavuzu yazıldığı için kütüphaneyi açıp tek tek kodları incelemek zorunda değiliz. O yüzden öncelikle değer tanımlamaları ve makrolar ile başlayalım ve sonra fonksiyonlara geçelim.

#define UART_BAUD_SELECT( baudRate, xtalCpu )   (((xtalCpu) + 8UL * (baudRate)) / (16UL * (baudRate)) -1UL)

Bu makro UART iletişim için baud oranınnı belirlemek için kullanılır. Önceki yazımızda baud oranını nasıl yazmaçlara yazmak için bir işlem uyguladığımızı anlatmıştık. Aynı işlem burada da uygulanmaktadır fakat xtalCpu ve baudRate adında iki değerden bahsedilmektedir. Bunlar bizim belirleyeceğimiz değerler olup xtalCpu sistemin saat hızı (16000000UL gibi) baudRate ise baud oranıdır (9600 gibi).

#define UART_BAUD_SELECT_DOUBLE_SPEED( baudRate, xtalCpu )   ( ((((xtalCpu) + 4UL * (baudRate)) / (8UL * (baudRate)) -1UL)) | 0x8000)

Bu makro yukarıdaki makronun aynısı olup Atmega’nın çift hız modunda kullandırır.

#define UART_RX_BUFFER_SIZE   32

UART iletişimde alıcının tampon belleğinin kaç bayt olacağını belirler. Bu değer 2’nin katları olmalıdır.

#define UART_TX_BUFFER_SIZE   32

UART iletişimde vericinin tampon belleğinin kaç bayt olacağını belirler. Bu değer 2’nin katları olmalıdır.

void uart_init(unsigned int baudrate)

Bu fonksiyon UART birimini hazır hale getirmeye yarar. Argüman olarak aldığı baudrate ise baud oranıdır. UART_BAUD_SELECT() makrosu ile aldığı baudrate değerini işlemci yazmaçlarına yazdırır.

unsigned int uart_getc ( void )

By fonksiyon tampon bellekteki bayt verisini almaya yarar. Yani UART okuma bu fonksiyon tarafından gerçekleştirilir. Bu fonksiyon değer olarak ilk sekiz bitte tampondan okunan veriyi son sekiz bitte (üst baytta) ise durum mesajını geri döndürür. Durum mesajları şu şekildedir,

  • 0 : UART biriminden veri alımı başarılır
  • UART_NO_DATA : Alınacak bir veri yok.
  • UART_BUFFER_OVERFLOW : Tampondan veri taşması. Yeterince hızlı veri okunmadığı için tampondaki bazı veriler kayboldu.
  • UART_OVERRUN_ERROR : UART’da overrun durumu oluştu. UART’ın UDR yazmacındaki mevcut karakter kesme tarafından yeni karakter gelmeden önce okunamadı. Bir veya birkaç karakter kayboldu.
  • UART_FRAME_ERROR : Veri çerçevesi hatası

void uart_putc ( unsigned char data )

Gönderilecek veri tamponuna bir baytlık veri eklemeye yarar. Aldığı argüman unsigned char yani byte değerinde olup 0-255 arasıdır.

void uart_puts ( const char* s )

Gönderilecek veri tampon belleğine harf dizisi verisi koymaya yarar .

void uart_puts_p ( const char* s)

Program hafızasına yerleştirilmiş harf dizisi verisini göndermeye yarar.

void uart1_init (unsigned int baudrate)

İkinci uart birimi olan ATmega mikrodenetleyiciler için ikinci UART’ı tanımlamaya yarar.

unsigned int uart1_getc (void)
void uart1_putc ( unsigned char data )
void uart1_put2 ( const char* s)
void uart1_puts_p (conts char* s)

Bu fonksiyonlar UART1 için tanımlanmıştır ve yukarıda aynı addaki fonksiyonlarla aynı görevi gerine getirdiği için açıklama gereği duymuyoruz.  Şimdi kütüphanenin test programını inceleyelim.

 

Burada yukarıdan itibaren başlayarak kodları Türkçe açıklayalım. Öncelikle 17. satırda uart.h başlık dosyasını programımıza ekliyoruz. Sonrasında ise F_CPU değerini tanımlamamız gerektiği için (delay kütüphanesinde olduğu gibi) bir hata mesajı ile bu denetlenmiş. Bunu da 21. ve 23. satırlar arasında görebiliriz. UART_BAUD_RATE değerini bizim tanımlamamız gerektiği için 26. satırda uart baud oranı değeri 9600 olarak tanımlanmış. 43. satırda uart_init fonksiyonunun kullanımına örnek verilmiş ve bizim önceden belirlediğimiz değerler argüman olarak alınmış. 48. satırda ilk gördüğümüz sei() fonksiyonu kullanılmıştır. Bu fonksiyon kesmeleri etkinleştirmek için  kullanılır. Kütüphane UART kesmeleri ile çalıştığı için bunu açmamız gerekir. 57. satırda uart_puts() fonksiyonu ile SRAM’da tutulan string verisi gönderilmiştir. 62. satırdaki uart_puts_p() fonksiyonu ile de program hafızasında tutulan string verisi gönderilmiştir. 69. ve 70. satırlarda ise integer yani tam sayı değerinin nasıl string değerine dönüştürüleceği ve bunun gönderileceği gösterilmiştir. 76. satırda ise tek bir karakter verisinin UART ile nasıl gönderileceği gösterilmiştir.

87. satırda unsigned int olarak tanımlanan c değişkenine gelen UART verisi yüklenmiştir. 88. satırda kontrol yapıları ile c değişkeninde durum veya hata mesajları denetlenmiş ve buna göre kodların işletilmesi için örnek karar yapıları verilmiştir.

125. satırda ise alınan veriyi tekrar göndermek için bir kod yazılmıştır.

UART kütüphanesini bu örnek programdaki fonksiyonların sözdizimine ve kullanılışına bakılarak kullanmamız gereklidir. Şimdilik AVR’nin USART birimi ile ilgili anlatacaklarımızın sonuna geldik. Bir sonraki konuda görüşmek üzere.

Hatırlatma, UART kütüphanesi kesmeleri kullandığından programa interrupt.h dosyasını eklemeniz ve kesmeleri etkinleştirmeniz gereklidir. Aksi halde çalışmaz.

Kapak Resmi :https://d3s11pzv7w3h1q.cloudfront.net/wp-content/uploads/IC-ATMEGA8A-PU-2.jpg

UYARI!!

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.