CCS C ile Seri Port Kullanımı

com-interface-serialport

             SERİ HABERLEŞME
Seri haberleşmenin temelindeki prensip, Verinin tek bir hat veya devre üzerinde aynı anda tek bir bit olmak üzere iletilmesidir. Seri port bilgisayar veri yolundan aldığı 8, 16 veya 32 lik paralel bit paketlerini 8, 16 veya 32’lik seri bit akımlarına dönüştürür. Seri haberleşme ismini bu prensipten alır; iletilecek bilginin her biti bir yerden diğerine seri olarak iletilir. Teorik olarak bir seri hat, bir yerden diğerine seri işareti iletmek için yalnızca bir işaret hattı ve toprak olmak üzere iki kabloya ihtiyaç duyar.
Ancak pratikte bu uzun bir süre için çalışmaz ve işaretteki bazı bitler kaybolur ve sonuç etkilenir. Eğer alan uçta bir bit bile eksik olursa ulaştırılan diğer bitler kayacağından, paralel işarete dönüştürüldüğünde sonuç hatalı veri olarak ortaya çıkacaktır. Güvenilir seri haberleşmeyi sağlamak için çeşitli şekillerde ortaya çıkabilecek bu bit hatalarının düzeltilmesi gereklidir.

SERİ HABERLEŞME YÖNTEMLERİ
Seri bit hatalarını düzeltmek için kullanılan iki seri iletim metodu vardır. İlki, her biti ayırarak iletim peryodunu tam olarak haberleşmenin her iki ucunda bir saat (Clock) ile eş zamanlı hale getiren senkron haberleşmedir. Alan uç, saati kontrol ederek bir bitin eksik olup olmadığını veya fazladan bir bitin (Genellikle elektriksel olarak ortaya çıkar) seri dizi (Stream) içinde ortaya çıkıp çıkmadığını tespit edebilir. Örneğin bir taşıyıcı bandın üzerinde bir ürün taşındığını ve ürünün beş saniyede bir, bir algılayıcı cihaz önünden geçtiğini varsayalım. 5. saniye süre içerisinde cihaz bir cisim algılarsa, bunu taşınan üründen farklı bir cisim olduğunu anlar ve alarm verir. Eğer 5. saniyede bir cisim geçmezse, bu seferde eksik bir ürün olduğunu fark eder ve başka bir alarm verir. Bu yöntemin zayıf yanı, haberleşmenin herhangi bir ucu saat işaretini kaybettiğinde, iletim durur.
Diğer bir seçenek ise (PC ‘lerde kullanılan) her veri bitinin izlenmesine yardımcı olması için bit dizisinin içine işaretleyiciler eklemektir. Kısa bir veri akımının başlangıcı, belirten bir başlangıç biti eklenerek, her bitin yeri bitlerin düzenli aralıklarda zamanlanmasıyla, tespit edilebilir. Her 8 bitlik dizinin önünde başlangıç biti gönderilmesiyle iki sistemin eş zamanlı çalışmasına gerek kalmaz, tek dikkat edilmesi gereken, her iki sistemin port hızlarının aynı olmasıdır. Haberleşmenin alıcı ucu başlangıç bitini aldığında kısa süreli bir zaman sayacı çalıştırır. Dizilerin kısa tutulmasıyla, zaman sayacının devre dışı kalmasının önüne geçilmiş olur. Bu yöntem haberleşme kanalının alan ve gönderen uçlarının bir işaret hattı ile tam olarak eş-zamanlılığı sağlanmadığı için asenkron haberleşme olarak bilinir. Her bit dizisi, mesaj (Word) adı verilen 5 ila 8 bitlik gruplara bölünür. PC ortamında 7 veya 8 bitlik mesajlar kullanılır.
İlki, ASCII tablosundaki büyük ve küçük tüm metin karakterlerini (127 karakter) sağlarken, ikincisi bir Byte’ı tam anlamı ile ifade eder. Geleneksel olarak bir mesajın en arkadaki biti ilk, en öndeki biti son olarak gönderilir. Haberleşme sırasında gönderen taraf, her mesajı, başına bir başlangıç biti, sonuna da bir veya iki duruş biti ekleyerek kodlar. Bazen de ilk duruş biti ve son bit arasına veri doğruluğunu kontrol etmek için bir eşlik (Parity) biti eklenir. Bundan sık sık veri çerçevesi (Data frame) olarak söz edilir. Kullanılabilecek beş değişik eşlik vardır. Darbe eşlik (Mark parity) biti her zaman lojik “i” değerine kurulur, boşluk eşlik biti lojik “O”dır. Çift eşlik (Even parity) biti mesaj içindeki bitlerin sayısı çift ise lojik “O”a, tek eşlik (Odd parity) biti ise bit sayısı tek ise lojik “O”a kurulur. Son iki yöntem bit tabanlı iletim hatalarının tespiti için bir yol sağlar. Eşlik bitlerinin kullanımı zorunlu değildir, bu her çerçevede iletilecek bir bitten tasarruf sağlar ve bundan eşliksiz (Non parity) bit çerçevesi olarak söz edilir.
Seri iletişim hakkındaki kısa bilgiden sonra birazda uygulamaya geçelim. Verilecek uygulamalarda seri portun pratik kullanımı ile ilgili basit uygulamalar yapılacaktır. Daha fazlası için soru sorabilirsiniz.
İki mikrodenetleyici ile seri iletişimin dışında eğer pc ile haberleşmek istiyorsak devremize gerekli voltaj ayarlamalarını yapan max232 entegresini dahil etmemiz gerekecektir. Kurmamız gereken en basit devre aşağıdaki gibi olmalıdır.

max23222

Devreyi kurduktan sonra gönderdiğimiz verileri bilgisayar ekranında görebilmek için serial port terminal programını tavsiye ederim hyper terminal ile her zaman sağlıklı iletişim kurulamıyor.

Seri iletişim örneklerine geçmeden önce “CCS C compiler reference manual” dosyasında sayfa 76′yı inceleyiniz. Bu sayfada seri iletişimde kullanılan getc(), gets(), putc(), puts() printf() gibi karakter gönderme ve alma fonksiyonlarının ayrıntılı açıklamaları yer almakta.

Gelelim örneklerimize;

İlk olarak aşağıdaki üç basit örneğe bakalım. 1. örneğimizde programcılığa başlarken gösterilen “Hello World” uygulaması yer almakta. Programlarda dikkat edeceğiniz üzere standart pic tanımlama, sigortaları ve kristal hızını belirleme satırlarından sonra
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS) satırı yer almakta. Burada #use rs232 ile seri iletişimi kullanmak istediğimizi , baud ile seri iletişim hızını, xmit ve rcv ile de kullanmak istediğimiz giriş çıkış pinlerini belirleriz. ERRORS ile de olası iletişim kopukluklarında programın kilitlenmemesini sağlarız. Aşağıdaki örneklerde kullandığımız Pic16f877 donanımsal olarak uart bulundurmakta ve uartın bağlı olduğu pinler C6 ve C7′dir. Bu pinler haricinde de ccs c bize istediğimiz herhangi iki pini seri iletişimde kullanmamıza olanak sağlar. Fakat bu usart pinleri haricinde pin kullanırsak seri iletişim kesmesi olan int_rda ‘dan faydalanamayız.

Verilen ilk örnekte gerekli tanımlamalar yapıldıktan sonra printf komutu ile ekrana bir kez “Hello World” yazırılır ve daha sonra program sonsuz döndüye girer.

İkinci örneğimizde ise işi biraz daha ilerleterek gene ekrana bir kez “This is a test program” yazdırılır. Daha sonra sonsuz döngü içerisinde yer alan putc(getc());satırında ilk olarak getc() ile ekrandan bir karakter alınır, putc() ile de alınan karakter terminal programına geri gönderilir. Yani yazdığımız metin aynen ekranda gözükür.

Üçüncü örneğimizde ise dikkat ederseniz iki adet #use rs232 satırı yer almakta ve ek olarak “stream” de fonksiyona eklendi. Burada stream ile iletişim kanallarını birbirinden ayırmış olduk. Birden fazla iletişim protokolü oluşturulduğunda karışıklığın önüne geçmek için bu ayrım yapılır ve stream’den sonra gelen tanımlama ile nereye bilgi göndereceğimizi veya nereden bilgi okuyacağımızı belirlenir. İki tanımlama yaptığımız için proteusta iki adet virtual terminal penceresi açılacaktır. Bu açılan pencerelerden ilkine yazdığımız mesaj diğerine gönderilecektir. fprintf, fgetc(), fputc() fonksiyonlarını kullanabilmek içinse programa stdio.h başlık dosyası eklendi.

seri1

Aşağıda verilen örnekte rakamlardan oluşan buffer dizisinin 10 elemanı sırasıyla putc() fonksiyonu ile ekrana yazdırılır.

seri2

Buradaki örnekte ise rs232 ile port kontrolü yapılmıştır. Terminal ekranından girilen sayı değerine göre b portundaki ilgili led yakılır. Dikkat ederseniz klavyeden girilen rakamdan ‘0′ çıkarılıyor. Bunun nedeni seri porttan gönderdiğimiz aslında rakam değil rakama ait ascii değeri. Bu değerden sıfır rakamına ait ascii değeri çıkardığımızda geriye sayı değeri kalacaktır.

seri3

Aşağıdaki örnekle yukarıda verilen örnek tamamen aynı işi yapmaktadır. İlk örneğimizde klavyeden gönderilecek verinin kontrolü sonsuz döngü içerisinde yapılmaktaydı. Aşağıdaki örnekte ise int_rda kesmesi kullanılarak program karakter beklemekten kurtarılıyor. Klavyeden veri gönderimi olduğunda kesme meydana geliyor, kesme rutininde digit değişkenine gelen karakter alınıyor ve rx_int değişkeni durum değiştirdikten sonra kesme işleminde çıkılıyor ve programda kalınan yere geri dönülüyor. rx_int değişkeni False olduğunda while(rx_int); satırı atlanır ve program bir sonraki satırdan devam eder.

seri4

Bu yazıdaki son örneğimiz ise 3×4 keypad kullanılarak yapılmıştır. Keypadte basılan tuş hangisiyse terminal ekranında gösterilir.

seri5

Bu yazı Pic Donanım kategorisine gönderilmiş ve , , , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.