Laptop ve Rs232

 

Bu yazımda Pic ile bilgisayar arasındaki seri iletişimden bahsetmeye çalışacağım ve örnek olarak Proteus similasyonu üzerinde bir proje vereceğim. 

 Şimdi haberleşmede iki seçim yapılır bunlardan birisi seri haberleşme diğeri ise paralel haberleşmedir.  Kısaca seri ve paralel haberleşmeyi açıklayacak olursak;  paralel haberleşmede 8 bit için ayrı hat kullanılırken seri haberleşmede 8 bit için tek hat kullanılır.  Bunu kablosuz iletişimde düşünürsek burada da tek kanal ve çoklu kanallar karşımıza çıkar.  Lafı çok uzatmadan toplayalım. Aslında görüldüğü gibi paralel haberleşme seri haberleşmeye göre iletim hızı olarak daha avantajlıdır. Seri haberleşme biraz daha yavaş kalır ancak paralel haberleşmeye göre daha ucuz ve kolaydır.  

 Paralel iletişim daha çok uzmanlık gerektirdiği için biz şimdilik seri iletişimden bahsedeceğiz. Seri iletişim de iki kısımda gerçekleştirilebilir. Bunlar senkron ve asenkron seri iletişimleridir.  Senkron seri iletişimde data kablosu yanında bir de clock sinyali kablosu vardır. Bu clock sinyali, gönderilen ve alınan bilgilerin uyumlu olarak gönderilip alınmasını sağlamak amacı ile kullanılır.    Seri iletişimin diğer yöntemi ise asenkron seri iletişimdir.  Asenkron seri iletişimde herhangi bir clock sinyaline gerek duyulmaz. Bilgiler gelişi güzel gönderilir. Her şey kara düzendir aynı Türkiyedeki gibi 🙂  Bunun yerine start, stop ve parity bitleri mevcuttur.  Sırasıyla start biti, iletişimin başladığını bildirmek için, stop biti iletimin bittiğini bildirmek için party biti ise iletimin düzgün yapılıp yapılmadığını kontrol etmek içindir. 

 Yani şöyle  iletişim yaparken 1 bit start biti ondan sonra 8 yada 7 bit data biti, sonra 1 bit parity biti ve son olarak da 1 bit stop biti gönderilir. 

 Seri iletişim için genelde RS232 kablosu kullanılır;

 RS232 Kablosu

 

 

  Bu kablo portu size tanıdık geliyordur.  Bilgisayarda bunun dişisinden var 🙂  Şekilde de görüldüğü gibi portlarda 9 tane pin mevcur. Bu pinlerin açıklamaları da ok işaretleri ile gösterilmiş. 

 Şimdi bunu kabloyu pic e nasıl bağlarız? Şöyle;  Veri iletim ve alımı için pic in özel olarak kullanılan RX ve TX bacakları mevcuttur.  Tüm kablolu ve kablosuz seri iletişimlerde bu pinler kullanılır. Fakat RS232 iletişiminde bir problem var oda RS232 kablosunun verileri gönderirken yüksek voltaj kullanmasıdır.  Pic’in  logic-0 ve logic-1 değerleri için kullandığı voltaj değerleri RS232 seri iletişiminde kullanılmaz. Pic teki 0 ve 5 volt digital bilgiye karşı RS232 3 ve 25 volta kadar değer kullanır. Bu yüzden pic in RX ve TX bacağından alınıp gönderilecek bilgilerin RS232 ile pic arasında uyumluluğunu sağlayacak ekstra bir elektronik düzeneğe ihtiyaç duyulur.  Bu ihtiyacı karşılayan entegrenin adı MAX232 entegresidir.  Entegrenin datasheeti için;  max232

 Yani pic in RX ve TX bacaklarını ilk önce bu entegreye bağlıyoruz. İsterseniz devremizi görelim ilk önce; 

RS232 Devresi

 Görüldüğü gibi pic in TX yani gönderici bacağı entegrenin t1 in alıcı bacağı ise entegrenin R1 out bacağına bağlanmış. Üzerinde biraz düşündüğünüzde mantığını kolayca kavrayabilirsiniz. 

Şimdi gelelim iletişimi bilgisayar tarafından nasıl sağlayacağımız kısmına.  Bunun birçok yöntemi vardır. Bilgisayar üzerinden iletişim kurmak için Pic CCS C ve C# gibi derleyiciler kullanılabilir bunun dışında windowsun kendi HYPER TERMINAL programı mevcuttur. Eğer işletim sisteminiz Vista yada win7 ise bu uygulama otomatik olarak mevcut olmayabilir bu yüzden programı internetten aratıp indirebilirsiniz. 

 Ben Pic CCS C üzerinden anlatacağım. Pic CCS C derleyicisini açtığınızda tools sekmesinde Serial Port Monitor diye bir düğme göreceksiniz.  Bu düğmeye tıklandığında gelen ekrandan “set  port options” sı seçin. Karşınıza bir configrasyon ekranı çıkacaktır. Şöyle;

RS232 Configration

 

Ayarları doğru yaptığınızda seri iletişim başlayacaktır.   Şimdi geçelim programlamaya.  derleyici olarak Pic CCS C kullanacağız. Ve denetleyici olarak ise şemadan görüldüğü üzere 16f877 kullanıyoruz. 

 

[stextbox id=”grey”]

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#define use_portb_lcd TRUE // LCD B portuna bağlı

#include <lcd.c> // lcd.c dosyası tanıtılıyor

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // RS232 protokolünün 9600 bit/sn baud hızında olacağını ve
// TX,RX uçlarının hangi pinler olacağını tanımlıyor
// parity bitinin olmadığını, stop bitinin 1 bit olacağı belirtiliyor

char klavye[80]; // klavye isminde 80 üyeli bir dizi tanımlanıyor

#int_rda // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{
disable_interrupts(int_rda); // int_rda kesmesini pasif yap
output_high(pin_c5); // RC5 çıkışı lojik-1
gets(klavye); // String ifadeyi al ve “klavye” adlı dizi değişkenine aktar.
printf(“\n\rYazdiginiz Metin> %s\n”,klavye); // Satır atla, yeni satır,RS232 üzerinden klavye string ifadesini gönder,satır atla
printf(lcd_putc,”\f%s”,klavye); //LCD’yi temizle ve klavye string ifadesini LCD’de göster
output_low(pin_c5); // RC5 çıkışı lojik-0
printf(“\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>”); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder
}

/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
setup_psp(PSP_DISABLED); // PSP birimi devre dışı
setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
setup_adc(ADC_OFF); // ADC birimi devre dışı
setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

output_low(pin_c5); // RC5 çıkışı ilk anda sıfırlanıyor
lcd_init(); // LCD’yi hazırla

printf(“\r**************** Merhaba *********************”); // Yeni satır, RS232 üzerinden belirtilen metni gönder ve satır atla.
printf(“\n\rKlavyeden girdiginiz bilgiler LCD’de gorunecektir\n\n”); // Satır atla, yeni satır, RS232 üzerinden belirtilen metni gönder
printf(“\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>”); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder

enable_interrupts(GLOBAL); // Aktif edilen tüm kesmelere izin ver

while(1) // Sonsuz döngü
{
enable_interrupts(int_rda); // int_rda kesmesi aktif
}

[/stextbox]

 

 Şimdi programda en can alıcı kısım olarak int_rda seri iletişim kesmesi kullanılmıştır. Bu kesme seri iletişimler için kullanılıyor. Fakat kullanmadan da direk ana fonksiyon içerisinde program yazılabilir. Bu kesme disable edilmediği taktirde kendisini sürekli aktif edecektir bu yüzden kesmeye girilir girilmez int_rda kesmesi disable edilir.  Programı biraz incelerseniz temel mantığın klavyeden girilen strng ifadenin pic’e bağlı LCD ye aktarıldığını ve aktarma işlemi sırasında C5 pinine bağlı ledin yakıldığını rahat bir şekilde anlayabilirsiniz. 

 Dökümanlar için buraya bakabilirsiniz; RS232 Seri İletişim Uygulaması 

3 YORUMLAR

  1. Merhaba
    Elimde msp430f4152 işlemcisi mevcut.Öncelikle max 232 ile rs 232 ekleyeceğim. Ardından wireless modülü eklemem gerekiyor.
    Bir kaç sorum olacak..
    1.wireless modulu için hangi entegreyi önerırsınız.
    2.işlemcımde bir adet RX TX bacagı bulunmakta.Uart kullanarak nasıl yapabılırım ?
    Teşekkürler

  2. Öncelikle yapacağınız şeyi tam olarak anlamadım. İşlemci ile bilgisayar arasındaki bağlantıyı modem ile kablosuz olarak mı gerçekleştirmek istiyorsunuz yoksa rs232 ile bir hat çekerek mi? Eğer uart kullanacaksanız zaten uart’ın da RX ve TX pinleri mevcuttur. Mikrodenetleyicininin RX ve TX bacaklarını direk bu pinlere bağlayabilirsiniz. Yahut RS 232 hattınızdan gelen veriyi yine bir max entegre üzerinden geçirdikten sonra uart modülüne bağlayabilirsiniz.

    Bir de birinci sorunuzda wireless modülü demişsiniz ama hangi wireless? RF mi? Bluetooth mu? Ya da başka wireless sistemlerinden mi bahsediyorsunuz?

CEVAP VER

Please enter your comment!
Please enter your name here