10 Temmuz 2025 Perşembe

 



RS232, 1960 yıllarının başında ortaya çıkmış, Recommended Standart’ın kısaltılmış hali olan, asenkron ve senkron seri iletişim protokolüdür.  Asenkron iletişimde clock sinyali kullanılmazken, senkron iletişimde clock sinyali vardır. Bu konumuzda asenkron iletişim üzerinde duracağız.

RS232 iletişimde bitler aynı hat üzerinden sırayla tek tek gider. Genelde kısa mesafe haberleşme için kullanılır. Yapılan çalışmalar kabloların kapasitesinden ötürü 15 metrenin üzerinde yapılan haberleşme işlemlerinde verilerin bozulmalara uğradığını göstermektedir. Fakat düşük kapasiteli kablolar yardımı ile yapılan bu haberleşmenin 300 metreye kadar yapılabildiği görülmüştür. Uzun mesafelerde yüksek hız elde etmek için RS-485 gibi diğer standartlar daha uygundur.

RS-232, yalnızca iki cihaz arasındaki iletişim içindir. RS-232'de bitler, bir zaman serisi halinde gönderilir. Hem senkron hem de asenkron iletimler bu standart tarafından desteklenir. İletilen veri ile alınan veri ayrı devreler olduğundan iletişim çift yönlü (full duplex) çalışabilir ve her iki yönde eşzamanlı olarak veri akışı olur. RS232 iletişim protokolü ayrıca I2C veya TTL aygıtlarından üretilen sinyallerden daha uzun mesafelerde sinyal iletmek için daha uygundur.

 

RS232 Voltaj Seviyeleri

Geçerli sinyaller +3 ile +12 volt arasında ya da −3 ile −12 volt arasındadır. -3V ile -12V arasındaki bir sinyal voltajı mantıksal '1'i temsil ederken, +3V ile +12V arasındaki voltaj mantıksal '0'ı temsil eder. Bu yüzden −3 ile +3 volt arasındaki gerilim değerleri RS-232 için geçerli değildir. Ayrıca GND toprak pini bulunur. RS232 seri haberleşme standardı, TTL(Transistor-Transistor Logic) seviyesinde iletim yapmaz. RS232 akım değeri ise 3 Amperdir.


RS232 Veri Türü

RS232’de veriler ASCII karakterleri şeklinde gönderilir. Gönderilecek olan veri, gönderici tarafından, belirlenmiş olan bu formatta hazırlanmakta ve iletilmektedir. Bu işlem süreçlerinde de alıcı devamlı olarak hattı dinlemektedir.


RS232 Kablo Sayısı

Tüm özelliklerin gerekmediği uygulamalarda, gönderilen veri (Transmitted Data: TxD), alınan veri (Received Data: RxD) ve ortak toprak (Common Ground: GND) hatlarından oluşan en az 3 kablolu RS-232 bağlantısı kullanılabilir. Hatta, veri akışı tek yönlü ise, iki kablolu bağlantı (veri ve toprak) bile kullanılabilir. Yalnızca donanım akış kontrolü gerektiği durumlarda iki yönlü veriye ek olarak RTS ve CTS hatları da eklenerek 5 kablolu sürümü elde edilir.


RS232 Baudrate

RS232’de baudrate değeri vardır. Bu değer seri portun saniyede göndereceği ve alacağı bit sayısını belirler. Örneğin baud hızı 9600 ise saniyede 9600 bit gider. Seri portun haberleşeceği cihaz ile aynı olmak zorundadır. 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 değerlerini alabilir.


RS232 Konnektör

RS232 protokolü DB9 veya DB25 konnektörü kullanır. DB25 konnektörleri 25 pin, DB9 konnektörü 9 pin kullanır.

 

DB9 Konnektörü




NOT: RS232 ilk olarak bilgisayar terminallerini modemlere bağlamak için tasarlanmıştı. Daha sonradan güncellendi. Yukarıdaki tablodaki pinlerin bu amaçla kullanıldığı görülmektedir. Biz ise RxD, TxD, GND gibi pinleri kullanarak asenkron veri iletimi ile dış kaynaktaki cihazlarla iletişime geçeceğimiz için buradaki birçok pini kullanmayacağız. Bizim kullanacağımız iletişimdeki pin bağlantıları genelde aşağıdaki resimdeki gibi olacak.




RS232 Veri İletim Protokolü



Start Biti: Alıcı cihaza veri gönderileceğinin haber verilmesini sağlar. Bu önemlidir çünkü; RS-232’nin asenkron protokolünde start biti alıcı cihazı, verileri doğru zamanlama ile okumaya hazırlar. Başlangıç bit değeri 0(sıfır)’dır.

Data: Gönderilecek veridir. RS232’de veriler ASCII karakterleri şeklinde gönderilir. Genelde data biti 8 bittir ama 5 ile 9 arasında da olabilir.

Parity Biti: Parity yani eşlik biti değeridir. Parity biti gönderilen 8 bitlik veri içindeki 1’lerin toplamının çift yada tek olduğunu belirtir. Alabileceği değerler; N,O ve E değerleridir.

•  “N” değeri “None” yani Parity biti gönderilmeyecek demektir.

•  “O” değeri “One” yani tek sayı demektir. Parity biti “1” olur.

•  “E” değeri “Even” yani çift sayı demektir. Parity biti “0” olur.

Stop Biti: Gönderilen datanın bittiğini belirten bittir. 1 yada 2 stop biti olabilir.


Aşağıdaki örneklerdeki gibi veri iletimi olur:





Aşağıdaki örnekte 198 sayısının iletiminin nasıl gerçekleştiğine bakalım. Parity biti kullanmayacağız. İlk önce bir bitin ne zaman başlayıp ne zaman biteceğini hesaplayalım. Bunun için baud değerini 9600 kabul edersek;

1 bitin uzunluğu = 1 / 9600 = 104 µsn eder. Yani bir bitin uzunluğu 104 µsn’dir. O zaman;



Alıcı, start biti başladıktan yani 1 ile 2 nolu çizgi arasını 104 µsn saydıktan sonra veri almaya hazırdır. 2 ile 3 nolu çizginin tam ortasına geldiği zaman ise 1. biti alır. 3 ile 4 nolu çizginin tam ortasına geldiği zaman ise 2. biti alır. Bu durum bu şekilde devam eder. Bitin tam ortada alınmasının nedeni herhangi bir parazit ya da karasızlık durumunun önüne geçmek içindir. Alıcı stop bitini görüp 104 µsn saydıktan sonra veri alımını tamamlamış olur. 


UART ve USART Seri Haberleşme Protokolleri

UART(Universal Asynchronous Receiver Transmitter); bilgisayar ve mikrokontrolcüler veya mikrokontroller ve çevre birimleri arasında haberleşmeyi sağlayan haberleşme protokolüdür. Asenkron olarak çalıştığı için herhangi bir “clock” ihtiyacı duymaz.

USART(Universal Synchronous Asynchronous Receiver Transmitter); hem senkron hem de asenkron olarak çalışabilir. UART’a göre daha gelişmiş bir protokoldür. Haberleşme mantığı aynı şekilde çalışır ancak USART aynı zamanda senkron haberleşmeleri de gerçekleştirebilir. Yeni çıkan bir mikroişlemcinin datasheet’ine baktığınız zaman bu birimleri genelde USART birimi olarak görüyoruz. Çünkü USART aynı zamanda UART’ı da kapsayan bir birim olarak tasarlanmıştır. USART, 5 ve 9 bit arası data uzunluğuna sahip veriyi taşıma özelliğine sahiptir.

RS232 haberleşme de UART-USART yöntemini kullanmaktadır. UART mantık seviyeleri üreticiler arasında farklılık gösterebilir. Örneğin, bir Arduino Uno’nun 5V mantık seviyesi vardır. Ancak; bir bilgisayarın RS232 portu +/-12V mantık seviyesine sahiptir. Bir Arduino Uno’yu doğrudan bir RS232 bağlantı noktasına bağlamak Arduino’ya zarar verir. Her iki UART cihazı aynı mantık seviyelerine sahip değilse, cihazları bağlamak için uygun bir mantık seviye dönüştürücü devresi gereklidir.


UART-USART Veri İletim Örneği 



Yukarıdaki görselde gördüğünüz gibi haberleşme gerçekleşmesi için ilk önce verici tarafında logic 1 (HIGH) seviyesinde bulunan iletişim hattı iletişimin başlaması için logic 0 (LOW) seviyesine çekilir ve bu bizim Başlangıç Bit’imizi (Start Bit) temsil eder. Ardından göndermek istediğimiz verileri başlangıç bitinin arkasına ekleriz. Eğer parity bitine sahipsek onu da ekledikten sonra son olarak iletişime sonlandırmak için gerekli olan bitiş bitini (stop bit) HIGH seviyesine çekerek iletişimin sonlandığını alıcıya bildiririz. Biz verici kısmında bu işlemleri yaparken alıcı da aynı şekilde işlem yapar ve sadece bizim gönderdiğimiz dataları kendi UART Data Register’ına yazar.


Nasıl Kullanılır?

UART-USART haberleşmesi yapabilmek için mikrodenetleyicimizdeki daha önceden tanımlanmış olan pinleri kullanırız. PC ile mikrodenetleyici arasındaki iletişim için; ya USB-TTL dönüştürücü ya da RS232-TTL dönüştürücü modülü kullanırız. Her iki modülü de RX-TX pinleri mikrodenetleyici RX-TX pinleri ile ters olarak bağlanacak şekilde bağlantısını yaptıktan sonra iletişimi başlatabiliriz.

(Yani mikrodenetleyici TX —> Modül RX, mikrodenetleyici RX —> Modül TX)



Arduino UART Kullanımı

Arduino geliştirme kartları, tercih edilen karta bağlı olarak bir veya daha fazla UART pinine sahiptir. Arduino Uno pin 0 (RX0) ve pin 1 (TX0) üzerinde bulunan tek UART arayüzüne sahiptir. Pin 0 ve 1 Arduino IDE ile USB üzerinden iletişim kurmak için de kullanılır. Bu nedenle, Arduino UNO geliştirme kartınıza kodlar yükleyecekseniz, önce 0 ve 1 pinlerindeki tüm kabloları çıkardığınızdan emin olun.



UART Avantajları

·         Sadece iki kablo kullanılır

·         Saat sinyaline ihtiyaç duymaz

·         Hata denetimine izin vermek için bir eşlik biti vardır

·      Her iki taraf da buna göre ayarlandığı sürece veri paketinin yapısı değiştirilebilir

·         Yaygın olarak kullanılan bir yöntemdir

UART Dezavantajları

·         Veri çerçevesinin boyutu maksimum 9 bit ile sınırlıdır

·     Birden çok bağımlı(çevre birimi/slave) veya birden çok ana sistemi(kontrolcü/master) desteklemez.



Örnek: 01001010 verisinin UART iletişiminin nasıl gerçekleştiğine bakalım.



Çeşitli TTL Dönüştürücüler

a.   RS232 – TTL Dönüştürücü Devre Şeması




a.   RS232 – TTL Dönüştürücü Kart




a.   FT232 Usb - Uart Dönüştürücü Kart




_____________________________________________________________________________________________________________________________________________________


9 Temmuz 2025 Çarşamba

 



Bu uygulamada; Arduino B portuna bağlı ledler kayar şekilde çalışırken 2 nolu uçtaki butona basıldığında kesme meydana gelir ve kayma işlemi durur. Kesme fonksiyonu çalışarak yeşil led yanar, butondan elimizi çekinceye kadar yeşil led yanmaya devam eder. Butondan elimizi çektiğimizde yeşil led söner ve program kesmeye gittiği noktaya geri dönerek devam eder.


Program Kodları:


int kayan;

#define kesme_led 4

void setup()

{

      pinMode(kesme_led, OUTPUT);

      DDRB = 0b11111111;          //B portu çıkış yapıldı.

      kayan = 0b00000001;

      attachInterrupt(0, kesme, FALLING);     //0: 2 nolu pinden kesme yap. kesme: kesme fonksiyonu. FALLING: düşen kenarda kesme yap.

}


void loop()

{

  

  do

  {

        PORTB = kayan;

        kayan = kayan << 1;   //kayan değişkeninin değerini 1 bit sola kaydır ve sonucu tekrar kayan değişkenine ata.

        delay(500);

  } while (bitRead(kayan, 6) != 1);   //kayan değişkeninin 6 nolu biti 1'e eşit olmadığı müddetçe döngüye devam et.

      kayan = 0b00000001;

}


void kesme()

{

      digitalWrite(kesme_led, HIGH);

      while (digitalRead(2) == 0);      //butona basık olduğu sürece bekle.

      digitalWrite(kesme_led, LOW);

}


Devre Şeması:


________________________________________________________________________________________________________________________________________________________


6 Temmuz 2025 Pazar

 



Bu uygulamada; program başladığında Arduino 13 nolu pine bağlı led sürekli yanıp söner. 5 nolu pine bağlı butona basıldığında pin sıfıra götürülür ve kesme çalışır. Kesme çalıştığında ana program durur. Kesmeye gidildiğinde butona basık olduğu süre içinde 8 nolu pine bağlı led yanar. Elimizi butondan çektiğimizde söner.

NOT: Bu uygulamadaki kesme işlemi Proteus'ta çalışmadı. Bu nedenle fiziksel Arduino kartında deneme yapıldı ve çalıştı.


Program Kodları:

int kesme_led = 8;

int surekli_led = 13;

int kesme_pin = 5;


void pciSetup(byte pin)     //Pin Change Interrupt işleminde; belirlediğimiz pin için gerekli ayarları yapan ve bu pin için registerlardaki değerleri değiştiren fonksiyon

{

      *digitalPinToPCMSK(pin) |= bit(digitalPinToPCMSKbit(pin));      // enable kesme_pin

      PCIFR  |= bit(digitalPinToPCICRbit(pin));     // clear any outstanding interrupt

      PCICR  |= bit(digitalPinToPCICRbit(pin));     // enable interrupt for the group

}


void setup()

{

      pinMode(kesme_led, OUTPUT);

      pinMode(kesme_pin, INPUT);

      pinMode(surekli_led, OUTPUT);


      pciSetup(kesme_pin);      //kesme yapacağımız pin için gerekli ayarları yapan fonksiyonu çağırır.

}


void loop()

{

      digitalWrite(surekli_led, HIGH);

      delay(500);

      digitalWrite(surekli_led, LOW);

      delay(500);

}


ISR(PCINT2_vect)     //PortD'den kesme geldiğinde bu kısım çalışır. 

{

      //butona basıkken led yanar elimizi çekince led söner.

      digitalWrite(kesme_led, HIGH);

      while (digitalRead(kesme_pin) == 0);

      delay(50);

      digitalWrite(kesme_led, LOW);

}


Devre Şeması:




_____________________________________________________________________________________________________________________________________________________


2 Temmuz 2025 Çarşamba

 



Bu uygulamada Timer1 kesmesi kullanıldı. Kesme işlemi için harici clock sinyali söyle oluşturuldu:

Arduino'nun 3 nolu pininden PWM sinyali gönderildi. Sonra bu pin 220ohm direnç ile 5 nolu pine bağlandı. 5 nolu pin Timer1'in harici clock girişidir. Yani Arduino'nun kendi ürettiği PWM sinyali alınıp tekrar  kendine harici clock sinyali olarak verildi. Arduino'nun 3 nolu pininden PWM çıkışının frekansı 490 hz'dir. Timer1 çözünürlüğü de 1469 yapıldı. Bu değerler kesme süresin 3 sn olmasını sağladı. Böylece program her 3 sn'de bir kesme alt programına giderek buradaki ledi yaktı. Ana programa dönünce led söndürüldü.

NOT: Bu uygulamadaki kesme işlemi Proteus'ta çalışmadı. Bu nedenle fiziksel Arduino kartında deneme yapıldı ve çalıştı.


void setup()

{

      pinMode(13, OUTPUT);

      pinMode(3, OUTPUT);

      cli();          //tüm kesmeler durduruldu

      TCCR1A = 0;     // TCCR1A register 0'lanıyor

      TCCR1B = 0;     // TCCR1B register 0'lanıyor

      TCNT1  = 0;     //sayaç değeri sıfırlandı

      OCR1A = 1469;     //timer1 çözünürlüğü

      TCCR1B |= (1 << WGM12);   //CTC(Clear Timer on Compare Match) mod açıldı

      TCCR1B |= (1 << CS12) | (1 << CS11) | (1 << CS10);  //external clock yapıldı. yükselen kenarda tetikleme olacak

      TIMSK1 |= (1 << OCIE1A);      //timer1 karşılaştırma kesmesi aktif edildi

      sei();          //tüm kesmelere izin verildi

}


void loop()

{

      digitalWrite(13, LOW);

      analogWrite(3, 127);      //3 nolu pine %50 görev döngüsünde PWM sinyali gönderildi.

}


ISR(TIMER1_COMPA_vect)

{

      digitalWrite(13, HIGH);

      delay(2000);

}


_______________________________________________________________________________________________________________________________________________________


 



Bu uygulamada Timer1 kesmesi kullanıldı. Kesme işlemi için Arduino'nun değil harici bir clock kaynağı kullanıldı. Timer1 başlangıç değeri 49 olarak, harici clock frekansı da 5 hz ayarlanarak, 10 sn'de bir programın kesme alt programına giderek buradaki ledi yakması sağlandı. Ana programa dönünce led söndürüldü. Harici clock olarak pull-down şeklinde Arduino'nun 5. pinine bağlı buton ile clock sinyali verildi.

NOT: Bu uygulamadaki kesme işlemi Proteus'ta çalışmadı. Bu nedenle fiziksel Arduino kartında deneme yapıldı ve çalıştı.


void setup()

{

      pinMode(13, OUTPUT);

      cli();          //tüm kesmeler durduruldu

      TCCR1A = 0;     // TCCR1A register 0'lanıyor

      TCCR1B = 0;     // TCCR1B register 0'lanıyor

      TCNT1  = 0;       //sayaç değeri sıfırlandı

      OCR1A = 49;    //timer1 çözünürlüğü

      TCCR1B |= (1 << WGM12);   //CTC(Clear Timer on Compare Match) mod açıldı

      TCCR1B |= (1 << CS12) | (1 << CS11) | (1 << CS10);  //external clock yapıldı. yükselen kenarda tetikleme olacak

      TIMSK1 |= (1 << OCIE1A);  //timer1 karşılaştırma kesmesi aktif edildi

      sei();          //tüm kesmelere izin verildi

}


void loop()

{

      digitalWrite(13, LOW);

}


ISR(TIMER1_COMPA_vect)

{

      digitalWrite(13, HIGH);

      delay(2000);

}


___________________________________________________________________________________________________________________________________________________


 



Bu uygulamada timer1 kesmesi kullanıldı. Timer1 başlangıç değeri 49900 olarak ayarlandı. Timer1 16 bitlik olduğu için 65535 e kadar sayma olacak. Formülde bu iki sayıyı yerine koyduğumuzda yaklaşık 1 sn yapıyor. Yani program her 1 sn de bir kesmeye gittiğinde led in durumunu değiştirecek.

void setup()

{

      Serial.begin(9600);

      pinMode(9, OUTPUT);

      cli();          //tüm kesmeler durduruldu

      TCCR1A = 0;     //TCCR1A register 0'lanıyor

      TCCR1B = 0;     //TCCR1B register 0'lanıyor

      TCCR1B |= (1 << CS12) | (1 << CS10);      //prescalar değeri 1024 yapıldı

      TCNT1 = 49900;  //timer1 başlangıç değeri belirlendi

      TIMSK1 |= (1 << TOIE1);     //Overflow kesmesi aktif edildi

      sei();          //tüm kesmelere izin verildi

}


void loop()

{

      Serial.println(TCNT1);

}


ISR(TIMER1_OVF_vect)

{

      digitalWrite(9, !digitalRead(9));

      TCNT1 = 49900;      //timer1 başlangıç değeri tekrar belirlendi

}


_________________________________________________________________________________________________________________________________________________________


 



Bu uygulamada timer1 kesmesi kullanıldı. Timer1 başlangıç değeri 0 ve bitiş değeri 15624 olarak ayarlanarak 1 sn'de bir programın kesme alt programına giderek buradaki ledin durumunu değiştirmesi sağlandı. 

NOT: Bu uygulamadaki kesme işlemi Proteus'ta çalışmadı. Bu nedenle fiziksel Arduino kartında deneme yapıldı ve çalıştı.


void setup()

{

      pinMode(9, OUTPUT);

      cli();          //tüm kesmeler durduruldu

      TCCR1A = 0;     //TCCR1A register 0'lanıyor

      TCCR1B = 0;     //TCCR1B register 0'lanıyor

      TCNT1  = 0;     //timer1 başlangıç değeri sıfırlandı

      OCR1A = 15624;      //timer1 bitiş/karşılaştırma değeri belirlendi

      TCCR1B |= (1 << WGM12);   //CTC(Clear Timer on Compare Match) mod açıldı

      TCCR1B |= (1 << CS12) | (1 << CS10);      //prescalar değeri 1024 yapıldı

      TIMSK1 |= (1 << OCIE1A);      //timer1 karşılaştırma kesmesi aktif edildi

      sei();          //tüm kesmelere izin verildi

}


void loop()

{

  

}


ISR(TIMER1_COMPA_vect)

{

      digitalWrite(9, !digitalRead(9));

      OCR1A = 15624;  //timer1 bitiş/karşılaştırma değeri tekrar belirlendi.

}



_______________________________________________________________________________________________________________________________________________________


Arduino Eğitimi Konu - 7

Toplam Sayfa Görüntüleme Sayısı

Seri İletişim Protokolleri

Sensörlerin Arduino İle Kullanımı

Popular Posts

Yararlanılan Kaynaklar

İletişim

gokdag17@gmail.com