2. UART NEDİR?
UART= Universal Asenkron Reciever Transmitter
UART seri ve paralel veriyi birbirine çevirir. PC sistem bus’ındaki paralel veri
UART tarafından belli bir yönde iletmek üzere seri veriye dönüştürülür. Öte
yandan karşıt yönden gelen seri veri de, yine UART tarafından, CPU ‘nun
sistem bus’ından okuması için, paralel veriye dönüştürülür.
Kullanım şekli:
START BIT | DATA(7-8 bit) | PARITY BIT | STOP BIT (1 veya 2 bit)
Programlanabilir.
3. UART Ne Sağlar?
Çift yönlü asenkron haberleşme
Yüksek doğrulukta baudrate üretebilme
8 veya 9 bit data uzunluğunda kullanabilme
Ayarlanabilir stop biti sayısı (1-2bit)
Senkron haberleşme için sinyal çıkışı
IrDA ve SmartCard arayüzü
Tek hat üzerinden, tek yönlü haberleşebilme
4 adet hata tespit bayrağı(overrun, noise, frame, parity)
6 adet kesme alabilme özelliği
2 adet kesme vektör adresi(RXI, TXI)
Azaltılmış güç tüketim modu
Çoklu işlemci haberleşme gibi özellikleri bulunmaktadır.
4.
5.
6. UART Veri Gönderme
Datalar en düşük değerlikli bitten en yüksek değerlikli bite doğru gönderilir.
Gönderici taraf TX (transmitter) hattını data göndermezken Lojik1 seviyesinde
tutar. Data gönderileceği anda hat Lojik 0 seviyesine çekilerek data
gönderilmeye başlanır.
Start bitinden sonra, datalar bit bit gönderilip dataların sonunda ise Stop biti
gönderilir.
Stop biti ise, son bitten sonra(MSB den sonra) hattı lojik 1 seviyesine çıkarma
işlemidir.
7. UART Veri Alma
Hattın lojik1’den lojik0 seviyesine çekildiğinde data gönderiminin başladığını
anlar gelen bitleri ayarlanan baudrate süresince alır ve buffer’ına yazar.
Stop biti ile buffera gelen data yazılmış olur. Ve ilgili flag set edilir.
Buffer dolduğunda set edilen bayrağı sürekli kontrol ederek datanın gelmiş
olduğunu anlarız.
8. Boundrate Süresi Nedir?
Baudrate 1 bitin ne kadar sürede gönderileceğini ve alınacağını belirleyen
bps(bit per second – 1 saniyede gönderilen bit sayısı) birimi ile ölçülür.
Baudrate parametresi 1200,2400,4800,9600,19200,115200
Alıcı taraf ile gönderici tarafın baudrate değeri aynı olmalıdır ki, gönderilen
datalar alıcı tarafında doğru bir şekilde alınabilsin.
10. #include <mqx.h>
/*Bu kütüphane FreeScale işlemcilerde kodu işlemciye tanıtmak için ve işlemci
bacaklarında uygun işlemleri yapabilmek için kullanılan kütüphanedir.C tabanlı
bir kütüphane olup sadece FreeScale işlemcilerde kullanılmak üzere
oluşturulmuştur.USB'den gelen stack(yığın) verilerinin uygun bir şekilde
programda işlenebilmesinden kaynaklanmaktadır*/
#include <bsp.h>
/*bsp kütüphanesi Board Support Package (BSP) kelimelerinin baş harflerinden
oluşmaktadır. Türkçe karşılığı Kurulum Destek Paketidir.
Buradaki kullanılmasının amacı FreeScale işlemcisinin kurulumu ve program
tarafından desteklenmesinden dolayıdır.*/
11. #if ! BSPCFG_ENABLE_IO_SUBSYSTEM
#error This application requires BSPCFG_ENABLE_IO_SUBSYSTEM defined nonzero in user_config.h. Please recompile BSP with this option.
/*Programa exeption tanımlanmıştır. user_config.h 'da
BSPCFG_ENABLE_IO_SUBSYSTEM değeri eğer sıfır olarak tanımlanmadığında
programı tekrardan BSP edip
derlemek gerektiğini belirlemiştir. #endif ile de bahsi geçen exeption
sonlandırılmış ve tanımlanması durdurulmuştur. */
#endif
12.
#ifndef BSP_DEFAULT_IO_CHANNEL_DEFINED
/* Burada da aynı şekilde bir exception tanımlanmıştır.Ve burada
BSP_DEFAULT_IO_CHANNEL_DEFINED değeri NULL olmalıdır. Eğer bu değerler
sağlanmamış ise program exception fırlatacaktır.Ayrıca sorununun giderilmesi
için de yapılması gereken şudur: user_config.h'ı ve programı tekrardan uygun
BSP'ye göre derlemek ve BSPCFG_ENABLE_TTYx değerini uygun olan sıfır
değerine getirmektir.Bu şekilde sorun giderilmiş olacaktır. Aynı şekilde #endif
ile tanımlanan exception'un tanımlanması durdurulmuşrur.*/
#error This application requires BSP_DEFAULT_IO_CHANNEL to be not NULL.
Please set corresponding BSPCFG_ENABLE_TTYx to non-zero in user_config.h
and recompile BSP with this option.
#endif
/*NOT: Bu exeption'ların programın hemen başında tanımlanmasının sebebi
şudur ki programın uygun olmayan değerlerle başlamasını engellemek ve
mikrodenetleyeciyi hatadan kurtarmaktır. Böylece program başlamadan olası
sorunlar göz önüne alınıp gereğinin yapılması noktasında kullanıcıyı
uyarmaktır.*/
13. #define UART_TASK 5// Burada define olarak UART_TASK değerine 5 atanmıştır. Buda
UART'ımızın ID'si olacaktır.
extern void uart_task(uint_32);/*uart_task fonksiyonu uartın seri port üzerinden veri alışverişi
için tanımlanmıştır.Fonksiyon içerisine bir
integer değer alacaktır.Kodda bu bu değer 32bit'lik bir olarak tanımlanmıştır.*/
TASK_TEMPLATE_STRUCT MQX_template_list[] =
{
{UART_TASK, uart_task, 1500, 9, "uart", MQX_AUTO_START_TASK, 0, 0},
{0,
0,
0, 0, 0,
0,
0, 0}
};
* Yukarıda belirtilen TASK_TEMPLATE_STRUCK komutu görev şablonları listesidir. Görev
şablonları listesinden bir görev tanımlanır. Görevler işlemci üzerinde tutulmaktadır
Bu komut yardımıyla program başlama aşamasında MQX kütüphanesi yardımıyla görev
şablonundan bir göre otomatik olarak başlatılacaktır. Bunun olması programı
daha optimum bir hale getirecektir.MQX_AUTO_START_TASK komutu TASK_TEMPLATE_STRUCT
komutuyla birlikte de kullanılabilir. Bunun sebebi ise belirttiğimiz gibi
programın başlangıçta bir görevle başlamasıdır.*/
14.
/* Aşağıdaki komutla birlikte görev şablonundan bir görev artık çalışmaya
başlayacaktır*/
void uart_task(uint_32 initial_data)
{
/*Bu komutta taşma ve overflow meydana gelmemelidir. Ayrıca durdurulmak
istenildiğinde 1 bitlik 1 verisi gönderilip interrupt gerçekleştirilebilir.
Ayrıca seri porttan veri alıveriş hızı bu komuta göre 9600 Baud(bit/sn) dir.Bu
hızda seriport haberleşmesi sağlanmış olacaktır. */
int_32 c;
//32 bitlik bir karakter tanımlanıyor
uint_32 flags = 0;
//Taşmanın gerçekleşmemesi için ve programın
hareketleri neticesinde bayraklardaki değişim görmek için bütün bayraklar 0
yapılıyor.
uint_32 baudrate = 9600;
/*Seriport veri aktarım hızı 9600 baud olarak
belirleniyor.Eğer bu değer farklılık gösterirse hyperterminal'den göndereceğimiz
veriyi düzgün olarak okuyamayız ve ekrana anlamsız karakterler gelecektir.*/
uint_32 stop_bits = IO_SERIAL_STOP_BITS_1; /*Komutu sonlandırma biti 1 bit
olacak şekilde 1 tanımlanmıştır.Eğer seriporttan gelen veri 1 olursa program
sonlamış olacaktır*/
uint_32 parity_bits = IO_SERIAL_PARITY_NONE; /* Eşlik biti tanımlanmıştır.*/
15. FILE_PTR serial_fd = fopen(BSP_DEFAULT_IO_CHANNEL, 0); /*PILE_PTR
komutu stack overflow durumlarında kullanılır.Bilgisayar üzerindeki
bir dosyanın içerisindeki verileri yığın haline getirmede kullanılır.Özetle
buradaki kullanımına bakarsak fopen komutuyla Board Support Package'in veri
kanalındaki 0 portunu açarak seri porttan gelecek olan veriyi stack haline
getirecektir.Ve bu değer serial_fd de tutulmaktadır.*/
if (IO_OK != ioctl(serial_fd, IO_IOCTL_SERIAL_SET_FLAGS, &flags)) {
printf("Setting the is failed");
_mqx_exit(-1);
}
/*Yukarıdaki if yapısında bir kontol söz konusudur.Yukarıda seri porttan stack
haline getirilmiş olan serial_fd verisinin işlemci üzerindeki
flaglara bakarak eğer flaglarda beklenmedik bir değişme meydana gelirse
programı -1 değeriyle sonlandırıp FAILTURE değeri dönderecektir.*/
16. if (IO_OK != ioctl(serial_fd, IO_IOCTL_SERIAL_SET_BAUD, &baudrate)) {
printf("Setting the baudrate is failed");
_mqx_exit(-1);
}
/*Yukarıdaki koda bakarsak programın başında belirlenen baud değeriyle(9600)
uyuşmuyorsa program FAILTURE değer dönderecektir.Yukarıda da belirttiğimiz
gibi eğer belirlenen baud değerlerinde bir tutarsızlık yada eşleşmeme meydana
gelirse ekrana farklı anlamsız karakterler dönderecektir.*/
if (IO_OK != ioctl(serial_fd,IO_IOCTL_SERIAL_SET_PARITY , &parity_bits)) {
printf("Setting the parity bits is failed");
_mqx_exit(-1);
}
/* Yukarıdaki kodda programın başında belirtildiği gibi eşleşme bitinde bir
tutarsızlık meydana gelirse program FAILTURE dönderecektir.-1 parametresi ile
sonlandırılacaktır.*/
17. if (IO_OK != ioctl(serial_fd, IO_IOCTL_SERIAL_SET_STOP_BITS, &stop_bits)) {
printf("Setting the stop bits is failed");
_mqx_exit(-1);
}
/*Yine programın başında belirtildiği gibi yıgın haline getirilmiş olan serial_fd
değişkeninde eğer programı sonlandırma bit
1 bit olacak şekilde 1 değerinden farklı ise o zaman program hataya düşecek
ve FAILTURE değer dönderecektir.*/
18. printf("n Embedded Systems Laboratory rn");
printf("n EE @ USF rn");
printf("n LAB #6 - UART DEVICE DRIVER rnn");
printf("n ------ Type your characters below: ----rnn");
/*Yukarıda printf içeriside yazılı olan veriler program arayüzünde program bu
aşamaya kadar başarılı bir şekilde çalıştırıldığında
kullanıcının karşısına çıkacak olan verilerdir.Bu veriler statiktir. Printf
içindeki veriler değiştirilirse program çalıştırıldığında
kullanıcı karşısına çıkacak olan yazılar da değişecektir.*/
19. while (TRUE) {
if (fstatus( serial_fd )) /*fstatus komutu _io_fstatus komutunun ileri düzeyde dil formunda C++ dilindeki
kullanımıdır.Bu yığın haline getirilen serial_fd
değerimizin o anki statusunu ekrana getirmektedir.Buna göre seri porttan artık veri alış verişi
başlamıştır. Buradaki if yapısı ile de bu durum sağlanmaktadır.*/
{
c = fgetc( serial_fd ); // Yukarıda 32 bir şeklinde olacak olan c karakterimize fgetc komutu ile girilen
karakterin ascii değeri alınmaktadır.Böyle seri portta veri alış verişindeki karakter transferi başlamıştır.
if (c==IO_ERROR)
break;
/*Eğer c karakter değişkenimizdeki değer input girişine göre
tanımlanmayan tutarsız bir karakter ise sonsuz şekilde
tanımlanan while döndüsünden çıkılacak ve program sonlanacaktır. Fakat tutarlı
karakterlerdeki veriler gelmeye devam ettikçe döndü dönecek ve karakter
alınımına ve seri port haberleşmesine devam edilecektir.Yada sonlandırma biti gelinceye kadar
devam edecektir.*/
fputc((char)c,serial_fd); // Burada c karakter değişkenimizde tutan veri artık karşı tarafa
gönderilmiştir.Yukarıda da belirtildiği gibi bu durum tutarsız karakter gönderilene kadar devam edecektir.
}
}
fclose(serial_fd); /* Sonlandırma biti geldiği zaman yada tutarsız karakter geldiği zaman serial_fd yığınımızın
bağlı olduğu pointer yapısıyla kurulmuş olan
port haberleşmesi kapatılacaktır ve program sonlanacaktır.*/
}