Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Uart ve seri̇ haberleşme

17,306 views

Published on

Freescale UART Seri Haberleşme ve UART Modulunun tanımlanması.

Published in: Education
  • Be the first to comment

Uart ve seri̇ haberleşme

  1. 1. UART VE SERİ HABERLEŞME BİLAL BURAK İZGİ CAN EZGİ AYDEMİR
  2. 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. 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. 4. 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.
  5. 5. 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.
  6. 6. 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.
  7. 7. UART UYGULAMASI
  8. 8. #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.*/
  9. 9. #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
  10. 10.  #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.*/
  11. 11. #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.*/
  12. 12.  /* 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.*/
  13. 13. 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.*/
  14. 14. 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.*/
  15. 15. 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.*/
  16. 16. 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.*/
  17. 17. 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.*/ }
  18. 18. Dinlediğiniz için Teşekkürler

×