
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 yolunundan 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.
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 periyodunu 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
elektiriksel 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 farkeder 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 birzaman 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.
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 birzaman 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.

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 sayfa76′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” ugulaması
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.
#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 ouyacağı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 yadığımız
mesaj diğerine gönderilecektir. fprintf, fgetc(), fputc()
fonksiyolarını kullanabilmek içinse programa stdio.h başlık dosyası
eklendi.
Aşağıda verilen örnekte rakamlardan oluşan buffer dizisinin 10 elemanı sırasıyla putc() fonksiyonu ile ekrana yazdırılır.
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.
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.
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.
Hiç yorum yok:
Yorum Gönder