5.   8051 Seri Port ile Haberleşme

8051 entegrenin güçlü özelliklerinden birisi de yapısında bulundurduğu seri haberleşme birimidir (UART).  8051 entegrenin seri bir haberleşme birimine ship olması demek, 8051 ile standart RS-232 seri haberleşmesinin yapılabilmesidir. Böyle bir birim entegre içerisinde bir parça olarak verilmeseydi, seri bir hattan bilgi yollayıp okumak oldukça uğraştırıcı bir iş olarak karşımıza çıkacaktı. Seri bir hattan bilgi yollamak için bit değerini entegrenin bir bacağına yazmak, daha sonra dikkatli bir zamanlama kullanarak sırasıyla bitleri hatta yerleştirmek gerekecekti. Bir pin üzerinden seri bilgi okunması daha da külfetli bir iş olarak karşımıza çıkacaktı. Yollanan veya okunan her bir karakterin, başlangıç biti  (start bit), bitiş biti veya bitleri (stop bit), parite kontrolünün 8051 programcısı tarafından yapılması gerekecekti. Fakat günümüz mikrokontrolcülerinin çoğunda seri haberleşme biriminin bulunması bu sorunu gidermiştir.

Entegrenin seri portunu kullanmak için yapmamız gereken yalnızca bir kaç işlem vardır.   Bunun için entegrenin seri port iletişim modunu ve seri port haberleşme hızını seçmemiz gereklidir. Bu işlemler yapıldıktan sonra yapmamız gereken tek şey yazacağımız karakteri SBUF özel fonksiyon registerine yazmak ve okuyacağımız karakteri SBUF registerinden okumaktır. 8051 bir karakteri yolladığında bize karakteri yolladığını, veya seri porttan bir karakter okunduğunda okunan bir karakterin olduğunu bize bildirecektir.  Böylece programlayıcı karakterin bit bazında gönderilme işleminin sıkıntılarından kurtulmuş olmaktadır.

Seri port asenkron iletişim,  bir start biti, bir veya daha fazla stop biti kullanır. 

 

Seri haberleşme ve Ağ Yapıları

Bir dizi bilgisayarı veya bir dizi işlemciyi birbirine bağlamak için  en uygun yöntem olarak bir kaç temel yöntem vardır. Bunlardan en önemlileri, yıldız (star) ve loop (döngü) bağlama yöntemleridir.

Yıldız bağlama yönteminde ana kontrolcüden birer hat tüm diğer ikincil kontrolcülere götürülür. Bu yöntem de tüm kontro kararı ana kontrolcü tarafından verilir ve her bir ikincil kontrolcü yalnızca ana kontrolcü ile iletişimde bulunur.

Döngü (llop) bağlama yönteminde ise bir kontrol hattı ile ana kontrolcü tüm diğer kontrolcülere bağlanır. Hangi yöntemin seçileceği bu işi düzenleyen kişinin tercihine ve pek çok dış etkene bağlı olabilir.

Temel olarak yıldız bağlama yöntemi güvenilirlik ve hata bulma açısından döngü yöntemine göre daha üstündür.  Döngü yöntemi ise maliyet ve kablo sayısı yönünden üstündür. Yıldız yöntemi eğer ikincil kontrolcülerin sayısı azsa ve ana kontrolcü ile ikincil kontrolcüler arasındaki mesafe az sa tercih edilen yöntem olabilir.  Fakat ikincil kontrolcülerin sayısı ve bu kontrolcülerin ana kontrolcüye olan uzaklığı arttıkça tercih döngü yöntemine doğru gider.

 Seri Data Modu 0

8051 entegrenin seri haberleşme biriminin Seri data modu 0’a getirilmesi için SM0 ve SM1 bitleri 0 yapılır.  Seri data modu 0’da haberleşme hızı sabittir ve osilatör frekansının  12 de birine eşittir.  12Mhz kristal kullanılan bir 8051 devresinde bu haberleşme hızı 1 Megabyte/s dir.  Bu haberleşme modunda RxD ucu hem karekterlerin okunmasında, hem de karakterlerin yollanmasında kullanılır.  Entegre seri haberleşme modu 0’a getirildiğinde, TxD pininde ise kristal frekansının 1/12 sinde kare dalga sinyal bulunur. Bu  sinyal yalnızca haberleşme sırasında aktif duruma gelir. Hatta haberleşme olmadığı zaman, TxD hattı 1 seviyesinde bulunur. Entegreden data yollanırken, TxD hattının ilk yükselmesinden, 1 clock sonra yollanacak karakterin ilk biti RxD hattına kaydırılır. Daha sonra TxD hattının her yükselişinden 1 clock sonra diğer bitler RxD hattına konularak karakter hattan yollanmış olur. Entegreye data okunurken de, karakterler RxD hattından okunur.  TxD hattında ise yine senkronizasyon sinyali bulunur. Gelen bitler TxD hattının düşen kenarından 2 veya 3 clock sonra seri bafıra (SBUF ) alınır. Mod 0 bilgisayar ve 8051 arasında haberleşmeden daha ziyade 8051 ve mod 0 benzeri haberleşme kullanan diğer entegrelerle veya diğer 8051 işlemcilerle haberleşme için kullanılmak üzere düşünülmüş bir haberleşme modudur.

 

Seri Data Modu 1 

Seri port konfigüre edilirken yukarda da belirtildiği gibi program seri port haberleşme hızını belirleyecek düzenlemelreri yapmalıdır.  Yalnızca mod 1 ve mod 3 de seri port haberleşme hızının konfigürasyonuna gerek vardır. mod 2 ve mod 4 seri port haberleşme hızını direkt olarak kristal frekansından ürettiğinden bu modlarda haberleşme hızı ile ilgili işlem yapmaya gerek yoktur. 

Mod 1 ve Mod 3 de seri port haberleşme hızı zamanlayıcı 1 taşmalarıyla belirlenir. Zamanlayıcı 1 çok sık taşıyorsa, haberleşme hızı yüksek daha seyrek taşıyorsa haberleşme hızı daha düşük olacaktır.Zamanlayıcı 1'i haberleşme hızını belirlemek üzere çok farklı biçimde programlama olanağı vardır.  Fakat en çok kullanılan  metod, zamanlayıcı 1'i  8 bit otomatik yükle modunda (zamanlayıcı modu 2) kullanmak ve TH1 registerine gerekli tekrar yükleme değerini kaydetmektir.  TH1 registerine yüklenecek değeri bulmak için (PCON.7 = 0) iken aşağıdaki formülü kullanmamız gerekmektedir. 

TH1 = 256 - ((Kristal frekansı / 384) / Haberleşme Hızı)  

Eğer (PCON.7 = 1)  ise, haberleşme hızı iki katına çıkıyordu. Dolayısıyla PCON.7 = 1 olduğu durumda kullanmamız gereken formül, 

TH1 = 256 - ((Kristal frekansı / 192) / Haberleşme Hızı)  

olacaktır.  Örneğin 11.059 Mhz lik bir kristalimiz olduğunu düşünelim. Bu kristal frekansında, zamanlayıcı 1'i kullanarak saniyede 19,200 bit data haberleşme hızında haberleşme yapmak isteyelim. TH1 registerine yazmamız gereken değeri bulmak için, yukariaki formüllerden birincisini kulllanalım. 

TH1 = 256 - ((Kristal frekansı / 384) / Haberleşme hızı)

TH1 = 256 - ((11059000 / 384) / 19200 )
TH1 = 256 - ((28,799) / 19200)
TH1 = 256 - 1.5 = 254.5 

Yukardaki hesaplamalardan da görülebileceği 19,200 haberleşme hızında çalışabilmek için TH1'e yazmamız gereken değer 254.5 elde edilmektedir. Bir registere küsuratlı bir sayı koyma imkanı yoktur.  Dolayısıyla bu sayıyı TH1 registerine yazamayız. Bunun yerine 254 yazarsak elde edeceğimiz haberleşme hızı 14,400, 255 yazarsak ise elde edeceğimiz haberleşme hızı 28,800 olacaktır.  Öyleyse 19,200 haberleşme hızını gerçekleştirmek için  Pcon.7 bitini "1" yapıp, ikinci formülü kullanalım.

TH1 = 256 - ((Kristal frekansı / 192) / haberleşme hızı)
TH1 = 256 - ((11059000 / 192) / 19200)
TH1 = 256 - ((57699) / 19200)
TH1 = 256 - 3 = 253

Burada elde ettiğimiz değer, küsüratlı bir değer değildir. Dolayısıyla bu değeri TH1 registerine yazarak  19,200 baud için gerekli işlemleri tamamlamış oluruz. Dolayısıyla, 11,059 Mhz bir kristalle 19, 200 haberleşme hızında haberleşebilmek için yapmamız gerekenler sırasıyla şunlardır.

     1. Seri portu mod 1 veya mod 3 e getirmek gerekir.

    2. Zamanlayıcı 1'i mod 2'ye getirmemiz gerekir.

    3. TH1'e 253 değerinin yazılması gerekir.

    4. PCON.7 (SMOD)  bitini "1" yapmamız gerekir.

Şimdi yukarıdaki işlemleri, ASSEMBLY dilinde gerçekleştirelim.

MOV SCON, #048H  ; seri port mod 1
MOV TCON, #020H  ; zamanlayıcı 1 mod 2
MOV TH1, #0FDH    ; TH1 = 253
MOV TL1,  #0FDH    ; TL1 = 253

ORL PCON, #080H   ; PCON SMODE biti = 1

Eğer kullanıdğımız frekans 12 Mhz ise,  19200 haberleşme hızı için ne yapabileceğimizi görelim.

Önce PCON.7 = 0 alıp birinci formülü deneyelim. 

TH1 = 256 - ((Kristal frekansı / 384) / Haberleşme hızı)

TH1 = 256 - ((12,000,000 / 384) / 19200 )
TH1 = 256 - ((31,250) / 19200)
TH1 = 256 - 1..63 = 254.37 

Gördüğünüz gibi, küsüratlı bir sayı elde ettik. Bu sayının TH1’e konulmasına olanak yoktur. Şimdi PCON.7 = 1 alıp ikinci formülü deneyelim. 

TH1 = 256 - ((Kristal frekansı / 192) / haberleşme hızı)
TH1 = 256 - ((12,000,000 / 192) / 19200)
TH1 = 256 - ((62500) / 19200)
TH1 = 256 – 3.26 = 252.74 

Yine küsüratlı bir sayı elde ettik. Buna göre 12 Mhz kristal kullanıldığı zaman 19200 haberleşme hızı olanaklı değildir. 

Şimdi 9600 haberleşme hızını deneyelim. İlk önce PCON.7 = 0 alalım. 

TH1 = 256 - ((Kristal frekansı / 384) / Haberleşme hızı)

TH1 = 256 - ((12,000,000 / 384) / 9600 )
TH1 = 256 - ((31,250) / 9600)
TH1 = 256 – 3.25 = 252.75 

Bu sayı da TH1’e konmak için uygun değil. PCON.7 = 1 alalım. 

TH1 = 256 - ((Kristal frekansı / 192) / haberleşme hızı)
TH1 = 256 - ((12,000,000 / 192) / 9600)
TH1 = 256 - ((62500) / 9600)
TH1 = 256 – 6.5 = 249.5 

Bu sayıda TH1’e yerleştirmek için uygun değil.   

Şimdi 4800 haberleşme hızını deneyelim. PCON.7 = 0 

TH1 = 256 - ((Kristal frekansı / 384) / Haberleşme hızı)

TH1 = 256 - ((12,000,000 / 384) / 4800 )
TH1 = 256 - ((31,250) / 4800)
TH1 = 256 – 6.5 = 249.5 

Bu sayıda uygun değil. PCON.7 = 1 alalım. 

TH1 = 256 - ((Kristal frekansı / 192) / haberleşme hızı)
TH1 = 256 - ((12,000,000 / 192) / 4800)
TH1 = 256 - ((62500) / 4800)
TH1 = 256 – 13.02 = 242.98 

Bu sayıyı 243 (F3H) olarak alıp, TH1’e yerleştirebiliriz. Dolayısıyla yukarıdaki hesaplardan da görüldüğü gibi, 12 MHz bir kristal kullanıldığında, zamanlayıcı 1 kullanılarak oluşturulabilecek maksimum haberleşme hızı, 4800 dür. 12 MHz kristalde 4800 haberleşme hızını programlamak için yazmamız fereken satırlar aşağıdadır.

MOV SCON, #048H  ; seri port mod 1
MOV TCON, #020H  ; zamanlayıcı 1 mod 2
MOV TH1, #0F3H    ; TH1 = 243
MOV TL1,  #0F3H    ; TL1 = 243

ORL PCON, #080H   ; PCON SMODE biti = 1

Biz 8051-8031 entegrelerini kullandığımız devrelerde, standard oalrak 11,0592 Mhz kristali kullanacağız. Inceleyeceğimiz 8052  entegresi üçüncü bir zamanlayıcıya sahiptir. Bu zamanlayıcı da haberleşme hızının kontrolünde kullanılabilmektedir. Bu zamanlayıcı 12 MHz kristalde 9600 haberleşme hızında seri iletişime olanak vermektedir.  80535 entegresi ise, kendi içinde  haberleşme hızı kontrol birimi bulundurmaktadır. Dolayısyla bu entegrelerle yaptığımız devrelerde 12 Mhz kristal kullanacağız. Çünkü   12 Mhz kristal kullanıldığında, zaman ölçme hesapları daha kolay olmaktadır.

Seri Porta Yazma

Seri port yukarıda açıklandığı şekilde, konfigürasyonu yapıldığında, seri port yazma ve okuma için hazır hale gelmiştir.

Seri porta bir karakter yollamak için yapmanız gereken sadece, bu karakteri

SBUF (99h) özel fonksiyon registerine yazmaktır. Örneğin seri porta "X" karakteri yollamak istiyorsanız, vermeniz gereken komut, 

MOV SBUF,#’X’   komutudur.

Yukarıdaki komut işlemci taarafından okunduğunda, işlemci "X" karakterini seri port üzerinden yollayacaktır. Elbetteki seri porttan yollama işlemi anlık bir işlem değildir ve bir zaman dilimi içerisinde gerçekleşecektir. Standart 8051 bir seri çıkış bafırına sahip olmadığından, yeni bir karakter yollamadan önce, önceki karakterin yollandığından emin olmak zorundayız. 8051 entegresi bir karakterin yollanmasının bittiğini TI bitini "1" yaparak bildirir. Dolayısıyla bu bitin değeri "1" ise karakterin yollanması bitmiştir ve yeni bir karakter yollanabilir.  Bu kontrol 8051 kodu olarak aşağıdaki şekilde yazılır. 

 SENDCHR :

 CLR TI                 ; Önce TI bitini temizle.

 MOV SBUF,#’A’    ;Yollancak karakteri seri porta yaz.

 JNB TI,$              ;Karakter yollamasının bitişini bekle.

 RET                         ;

Yukarıdaki üç komut ile bir karakter seri port üzerinden yollanır ve yollama işleminin bitişi beklenir.

 

Seri Porttan Okuma

Seri porttan okuma yapmak ta seri porta yazma kadar kolay bir  işlemdir.  Seri porttan okuma yapmak için RI bayrağına bakılır. Bu bayrak "1" ise seri porttan bir karakter gelmiş demektir. Seri porttan gelen bu karakter  SBUF registerinde bulunur. 

Örneğin, program kodumuz  bir karakter okumak üzere beklesin ve karakter geldiğinde bu karakteri akümülatöre okusun. Bunun için yazmamız gereken kod yalnızca iki satır olacaktır. 

GETCHR:

JNB RI,$          ; 8051 RI bayrağının aktiflenmesini bekle

MOV A,SBUF    ; Gelen karakteri akümülatöre oku.

RET;

 

Yukardaki kodun birinci satırı RI biti "1" oluncaya kadar beklemektedir. Eğer  seri hattan bir karakter gelirse RI biti "1" olacaktır .  RI biti "1" olduğunda program ikinci satıra geçecek ve MOV komutunu işleme sokacaktır.

  

Seri Data Modu 2 (Çoklu İşlemci Modu) 

Seri haberleşme modu 2, seri haberleşme modu 1’e benzer.  Mod 2’de haberleşmede 11 bit kullanılır.  Bu 11 bitin biri start biti, birisi stop biti ve 9 tane data bitidir.  Gönderilen datanın  9’uncu  biti SCON registerinin TB8 bitine yazılır. Data okuma sırasında ise bu 9’uncu bit RB8 bitine gelir. Seri data modu 2’de iletişim hızı,

 fbaud2 =  (2SMOD / 64) x fclock

 formulü ile hesaplanır. Dikkat edilirse, bu iletişim modunda da haberleşme hızı mod 1 haberleşme hızından çok daha yüksektir. Pek çok işlemci kullanılan bir ağ üzerinde, toplanan verilerin çok hızlı bir şekilde aktarılabilmesine gerek vardır.   Bu ieltişim modunun en  önemli özelliği kullanılan 9uncu data bitinde yatmaktadır. Bu data biti sayesinde yollanan bir mesajın ağdaki belli işlemciler tarafından algılanması, diğerleri tarafından ise ihmal edilmesi sağlanabilmektedir.  Seri iletişim modlarında, 8051 entegresine bir karakter geldiğinde karakterin son bitinin alınmasıyala RI bitinin 1 yapıldığını biliyoruz.  Seri data modunda RI bitinin 1 olabilmesi extra bazı şartlara da bağlanmıştır.  RI bitinin set olabilmesi için, ya son data biti 1 olmalı yada  SCON registerindeki SM2 biti 0 olmalıdır. Dolayısıyla ağdaki bir işlemci gönderilen mesajın ağdaki tüm işlemciler tarafından alınmasını istiyorsa gönderdiği bilginin son bitini 1 yapmalıdır.  Eğer ağdaki yalnız belli işlemcilerin bu mesajı alması isteniyorsa, mesaj yollayan işlemci gönderdiği bilginin son bitini 0 yapar. Bu sayede ağdaki işlemcilerden yalnızca SM2 biti 0 olanlar, gelen mesajı alırlar. 

Bu sayede bir yerel ağ oluşturulup, zaman zaman sadece belli entegrelerin sorgulama sonuçlarına cevap verebilmeleri sağlanabilir. Bu yöntem işlemci ve bilgisayar ağlarında sık kullanılan, konuşan ve dinleyenlerin belirlenmesi esasına dayanan bir yöntemdir.

 

Seri Data Modu 3  

Bu işlemci modu seri data modu 2 ile aynı çalışma mantığına sahiptir. Yalnızca bu modda haberleşme hızı sabit değildir ve aynı seri mod 1’ de olduğu gibi zamanlayıcı 1 ile belirlenir.

 

RS-232 İletişiminin Temel Kavramları

RS-232 bilgisayar dışındaki cihazların bilgisayar ile haberleşmelerinde en çok kullanılan iletişim standartlarından birisidir. RS-232 temel olarak bir seri iletişim birimidir. Seri iletişim biriminde karakterler bir hat üzerinden bit bit yollanır. Seri iletişimin paralel iletişime göre en önemli üstünlüğü bağlantı kolaylığıdır.  Bilgisayardan cihaza karakter yollamak için bir hat , cihazdan gelen karakterleri okumak üzere bir hat ve bir toprak hattı olmak üzere toplam üç hat kullanılarak iletişim gerçekleştirilebilir.  Bu standardın önemli dezavantajı, haberleşme hızı arttıkça bilgi kaybına yo açmamak için kablo uzunluğunun da kısalması gerekliliğidir. Standard RS-232 19200 haberleşme hızında en fazla 20m kablo uzunluğuna izin vermektedir.  Yeni seri iletişim standartlarından RS-422, RS-449 çok daha yüksek haberleşme hızlarında çok daha uzun kablolamaya olanak vermektedir. Örneğin RS-422 1600 m uzunluğunda bir kablo üzerinden bir magabit/saniye haberleşme hızalarını desteklemektedir.

Her bilgisayar en az bir seri RS-232 iletişim birimine sahiptir. Yeni bilgisayarlarda RS-232 konnektörleri hemen hemen tamamen 9 pin erkek konnektörlerdir.  Öncelikle bilgisayarınızın arkasında böyle bir konnektör olup olmadığına bakın.  Bilgisayar herhangi bir RS-232 portuna o portun adresi aracılığı ile ulaşır.  Bilgisayarınızda bulunan RS-232 portunun adresini bilgisayar denetim masasından sistem seçeneği içinden araçlar menüsüne geçerek ulaşabilirsiniz. Araçlar menüsünde bilgisayarda var olan tüm iletişim birimlerinin (seri portlar, USB, printer portu, ekran kartı vs.)  adresleri bulunur. Seri iletişim biriminizin adresini buradan bulabilirsiniz. Bazı bilgisayarlarda yalnızca bir RS-232 çıkışı bulunabilir.  Eğer bu çıkışı seri fare için kullanılıyorsa mikroişlemci kartınızı bilgisayar ile haberleştirecek hiç bir      RS-232 biriminiz yok demektir. Yapmanız gereken seri fareden vazgeçip, bilgisayarınızın fare girişine bağlanabilecek bir fare satın almak olacaktır. Böylece RS-232 portunuz mikroişlemci kartınıza bağlamak üzere size kalacaktır.

Bu aşamada biraz da RS-232 konnektörünün yapısından ve seri iletişimden bahsetmek faydalı olacaktır. RS-232 seri iletişim standardı elektriksel özelliklerinde “1” biti  -3 volttan –25 volta kadar bir elektrik sinyali olarak tanımlanmıştır. “0” sinyali ise +3 volttan  +25 volta kadar elektrik sinyali olarak tanımlanmıştır. –3 volt ile +3 volt arasındaki herhangi bir sinyal ise belirsiz bir sinyaldir.

Daha önce de belirttiğimiz gibi yeni bilgisayarlarda RS-232 iletişimi için 9 pin erkek konnektörler kullanılmıştır Fakat bazı bilgisayarlarda ve seri iletişim kurulacak bazı cihazlarda 25 pin erkek konnektörler de bulunabilmektedir. Aşağıda 25 pin ve 9 pin DB kablolarda RS-232 sinyallerinin nasıl bağlandığını görebilirsiniz.

DB25S konnektör:

DB9S konnektör:

Mikrokontrolcülerle bilgisayarların iletişminde temel olarak TxD, RxD ve GND hatları kullanılır.  Pek çok mikrokontrolcüde, bilgisayarla haberleşmek üzere TxD ve RxD hatları bulunur. Fakat mikrokontrolcüler de bu hatların  sinyalleri 0 volt ve 5 volttur.  Bilgisayarla haberleşmede gereken RS-232 sinyalleri ise +12 volt ve –12 volttur. Bu yüzden mikrokontrolcü ve bilgisayar arasındaki iletişimde gerilim dönüşümünü sağlamak üzere bir gerilim dönüştürücü kullanılır. Bu tür gerilim dönüştürücülerin en çok kullanılanı MAX232 entegresidir. Aşağıda bilgisayarla mikrokontrolcü RS232 hattının bağlanmasında MAX232 entegresinin nasıl kullanıldığı görülmektedir.  

Genelde mikrokontrolcü tarafında kullanılacak RS232 konnektörü dişi yapılır.  Dolayısı ile mikrokontrolcü ile bilgisayarı bağlayacak ara kablonun bir ucuna 9 pin erkek konnektör, bir ucuna da 9 pin dişi konnektör  bağlanır Daha önce de söylediğimiz gibi gereken kablo sayısı yalnızca 3 tür.   Konnektörlerin 5 nolu uçları (GND) direkt olarak birbirine bağlanır.  2 (TxD) ve 3 (RxD) uçları ise birbirine çarpraz bağlanır. Böylece mikrokontrolcünün GONDER (TxD) ucu bilgisayarın AL (RxD) ucuna ve bilgisayarın YOLLA ucu mikrokontrolcünün AL ucuna bağlanmış olur.