Sosyal Medya  

FacebookTwitterDiggLinkedinRSS Feed
   

Günümüzde, işlemciler ile çevresel birimler arasındaki iletişimi sağlamak için paralel veya seri haberleşme kullanılır. Paralel haberleşmenin maliyeti yüksek ve işlemcilerden yüksek kaynak gereksenimi olduğu için genellikle hız gerektirmeyen işlemcilerde seri haberleşme tercih edilir. Bu makalemde seri haberleşme protokollerinden biri olan ve çok fazla terchi edilen RS232 protokolünü anlatmaya çalışacağım. Makalem boyunca, Microchip firmasının üretmiş olduğu PIC18F2580 işlemcisinin datasheet'ine referans alacağım ve yazılımı da yine bu işlemci için geliştireceğim.  

Seri Haberleşme Nedir?

USART(The Universal Synchronous Asynchronous Receiver Transmitter) olarak da bilinen seri haberleşme, en az bir ama genellikle iki adet bus yardımı ile işlemciler ve diğer çevresel birimler arasında iletişim kurmayı sağlayan ve yaygın olarak kullanılan haberleşme protokolüdür. RS-232, RS-422, RS-423, RS-485, I2C, SPI, Ethernet, USB, SDI-12 günümüzde en çok kullanılan seri haberleşme protokolleridir.

Senkron ve asenkron olmak üzere 2'ye ayrılır.

Senkron Seri Haberleşme

Senkron haberleşemede; haberleşme yapılacak işlemcilerden biri master görevi yaparak, slave olarak görevlendirilen diğer işlemcilere veya çevresel birimlere clock değeri üretip o clock darbesi yardmı ile bilgi alınır veya gönderilir. Üretilen her bir clock darbesinde bir bitlik veri gönderilir veya alınır.

Yukarıdaki şekilde de görüneceği gibi, master tarafından üretilen her clock darbesinin yükselen kenarında, veri yolundaki anlık bit değeri gönderilir ya da alınır.

Senkron haberleşeme; master ve slave olmak üzere iki gruba ayrılır. Master; haberleşmenin başalayacağı ve biteceği, haberleşme hızını belirleyeceği taraftır. Slave de master dan gelen clock darbelerine göre veri haberleşmesini sağlayan taraftır. Ethernet, USB, HDLC, PPP gibi prokoller senkron haberleşme yapan protokollere örnektir.

Asenkron Seri Haberleşme

Asenkron haberleşmede herhangi bir clock darbesi bulunmamakta. Haberlşeme start biti ile başlar ve stop biti ile sonlandırılır.

 

Haberleşeme herhangi bir zamanda sonlandırılabilir. Asenkron haberleşmede, kısa mesafalerde kullanılan en yaygın protokol RS-232'dir.

RS-232 Haberleşme Protokolü

RS-232 protokolü işlemcilerin biribiri arasında veya bilgisayarlarla iletişim için kullanılan ey yaygın haberleşme protokolüdür. TXD, RXD, DSR, GND, DTR, CTS, RTS ve Power olmak üzere 8 pin kullanılmaktadır.

 

RS232 standartı azami kablo uzunluğu belirtilmemiştir. Bunun yerine yük kapasitelerinden söz edilebilir. Normal kablolar ile 15metrenin üzerinde yüksek kapasitans oluşmakta. Bu da veri iletişimi büyük ölçüde bozmaktadır. Yalnız düşük kapasitans özelliği gösteren kablolar ile 300metre civarında haberleşme mümkün. Ama günümüzde düşük mesafelerde RS-232, yüksek mesafelerde de RS-485 kullanılmaktadır. Benim tavsiyem RS-232 ile 1buçuk metrenin üzerine çıkmamanız yönündedir.

RS232 Haberleşmesi Parametreleri

RS232 protokolü kullanılarak haberleşme yapmak için 5 parametre ayarlanmalıdır:

İletişim Hızı: İki işlemci arasındaki veri haberleşme hızıdır. Standartlara uygun veri hzıları şunlardır: 300, 1200, 2400, 9600, 19200, 57600, 115200. Hem verici hem de alıcı aynı iletişim hızına ayarlanmalıdır.

Başlangıç Biti: Veri haberleşmesinin başladığını belirten bit. Veri haberleşmesinin bulunmadığı (IDLE) anlarda, Tx veri aktarım pini logic 1 konumundadır. Ne zaman ki veri iletişimi başlayacak, bir clock süresince veri hattı logic 0 yapılır ve haberleşme başlar.

Veri Uzunluğu: Verilerin kaç bitlik paketler halinde gönderileceği belirtilir. Standartlarda 8bit olmasına rağmen, 9bitlik seri haberleşme yapmak da mümkündür.

Eşlik (Parity) Biti: Verilerin karşı tarafa doğru biçimde iletilip iletilmediğini anlamamıza sağlayan bittir. Gönderilen 8bitlik veri paketindeki 1lerin sayısının sayar ve eğer sayı çift ise 1, tek ise 0 olarak karşıya yollanır. Alıcı da aynı şekilde gelen verideki 1leri sayar ve eşlik bitini kontrol eder. Kendi saydığı 1ler tek iken parity çift ise veya tam tersi ise hata oluşur. Eşlik biti kullanıldığında bir biit fazladan veri gönderimi olur.

Dur Biti: Veri haberleşmesini durduran bittir. Tx veri gönderim hattı logic 1'e çeklir.

PIC18F2580 ile RS232 Veri İletişimi

PIC18F2580 mikrodenetleyicisiyle RS232 haberleşmesi yapmak için RC6(Tx) ve RC7(Rx) pinleri kullanılır. Tx pini, işlemciden dışa; Rx pini de işlemciden içe veri aktarılması sağlanır. Ayrıca ilgili kesme ayarlanarak da her veri giriş çıkışta, işlemci kesmeye giderek verilerin alınması veya gönderilmesi sağlanabilir. Ben bu makalemde sadece Rx kesmesini kullanarak veri geldiğinde kesmeye girilmesini sağlayacağım.

PIC18F2580 işlemcisi ile seri haberleşme yapmak için 4adet kayıtçının ayarlanması gerekiyor: TXSTA, RXSTA, BAUDCON, INTCON, PIR1, PIE1, SPBRG.

TXSTA Kayıtçısı

 

RXSTA Kayıtçısı

BAUDCON Kayıtçısı

INTCON, PIR1, PIE1 Kayıtçıları

 Rx kesmesini kurmak için şu adımlar izlenir:

  • INTCON kayıtçısının 6. biti lojik 1 yapılır. (PEIE/GIEL biti)
  • PIR1 kayıtçısının 5. biti lojik 0 yapılır. (RCIF biti)
  • PIE1 kayıtçısının 5. biti lojik 0 yapılır.(RCIE biti)
  • INTCON kayıtçısının 7. biti lojik 1 yapılır.(GIE biti)

SPBRG Kayıtçısı

BRG değeri seri haberleşmenin hızını yani baud rate'ini belirtir.

 Örnek Uygulama

Bu örneğimizde PIC18F2580 işlemcisi ile saniyede bir ekrana yazı gönderen, 's' geldiğinde gönderimi kesen ve 'c' geldiğinde de gönderime devam eden progrramı oluşturacağım. İşlemcide 40MHz'lik bir kristal kullanılmıştır.

 

 

#include <xc.h>
#include<stdlib.h>

#define _XTAL_FREQ 40000000 //40MHz

typedef unsigned int uint;
typedef unsigned char uchar;

uchar Sayac=0;
const uint TMR0_Sayac=50000;

void picAyar()
{
    TRISA = 0xFF;
    TRISB = 0;

    PORTA=0;
    PORTB=0;


    //Timer Kurulumu
    T0CON = 0b10000000; //TIMER0 Aktif, PRESCALE= 1:2 (1/(40MHz / 4)*2 = 200nS)  *50000
    WRITETIMER0(65535-TMR0_Sayac); //10ms'de bir Timer0 kesmesine girilecek
    INTCONbits.TMR0IE=1;
    INTCONbits.TMR0IF=0;

    //Seriport Ayarlar?
    TRISCbits.RC6=0; // Tx
    TRISCbits.RC7=1; // Rx
    TXSTA=0b00100110; 
    RCSTA=0b10010000;
    BAUDCON = 0b01001000;
    SPBRG=86; // 115200 baud hızı
    INTCONbits.PEIE_GIEL=1;
    PIR1bits.RCIF=0;
    PIE1bits.RCIE=1;

    ei();
}
void main(void)
{
    picAyar();
    while(1){}   
}
void veriGonder(uchar* veri)
{
    int i=0;
    for(i=0;veri[i]!='\0';i++)
    {
        while(!TRMT); //Veri gönderilinceye kadar bekle
        TXREG = veri[i];
    }
}

void interrupt kesmeler()
{
    di();
    if(INTCONbits.TMR0IE && INTCONbits.TMR0IF) // Timer-0 Kesmesi
    { // 10ms'de bir buraya giriyor.
        if(++Sayac >= 100)
        {// 1sn'de bir buraya giriyor.
            if(TXSTAbits.TXEN) // Tx gönderme pini aktif mi?
                veriGonder("http://www.muhammetefe.com\n");

        }
        WRITETIMER0(65535-TMR0_Sayac);
        INTCONbits.TMR0IF=0;
    }else if(PIR1bits.RCIF && PIE1bits.RCIE) // Rx Kesme Fonksiyonu
    {
        if(RCREG=='s')
		{
			INTCONbits.TMR0IE=0; // Timer kesmesi pasif yapılıyor.
            TXSTAbits.TXEN=0; // Seri port veri gönderme pasif yapılıyor
        }else if(RCREG=='c')
		{
            TXSTAbits.TXEN=1; // Seri port veri gönderme aktif yapılıyor
			
			Sayac=0; // Sayac sıfırlanıyor.
			INTCONbits.TMR0IE=1; // Timer kesmesi aktif yapılıyor.
			INTCONbits.TMR0IF=0; // Timer kesme bayrağı temizleniyor.
		}
    }
    ei();
}

Bir makalemin de sonua geldik. Bu makalemde PIC18F2580 ile seri haberleşme protokollerinden biri olan RS232 hakkında bilgi vermeye çalıştım. Umarım sizler için faydalı bir yazı olmuştur. Örnek uygulamada zamanlayıcı kesmeleri de kullanılmıştır. Zamanlayıcılar hakkında bilgi almak isterseniz PIC18F2580 İle Zamanlayıcılar isimli makalemi de okuyabilirsiniz.

Bir sonraki makalemde görüşünceye dek, sağlıcakla kalın.

Muhammet EFE

Yorumlar   

+1 # Mert 22-01-2015 11:18
Güzel bir anlatım olmuş, teşekkür ederim. Devamını bekliyorum.
Cevap

Yorum ekle


Güvenlik kodu
Yenile

   
© muhammetefe.com

Joomla Hata Ayıklama Konsolu

Oturum

Profil Bilgisi

Bellek Kullanımı

Veritabanı Sorguları