C18 Diliyle Robot Programlama – Servo Motor Kullanma

Bu projede amaç bir servo motorunu çalıştıracak şekilde mikrodenetleyiciyi programlamak. Aslında yapacağımız çalışmada toplamda 7 servo motoru sürebilecek kapasitede bir program yazmış olacağız.

Servonun ne olduğundan biraz bahsedelim. Servo bir mil etrafında dönebilen motorlu bir yapıdır. Bu yapı kameralarda, robotik aksamların hareket ettirilmesinde (kol, bacak, kafa) kullanılır. Temelde aldığı sinyale göre döner, böylece servoya bağlı cihazın yönü değişir.

Aşağıda örnek bir servo motoru ve bu motora bağlı parça görünmektedir;

Bir tane servoyu sürmek için yapılması gereken işlem timer 0’ı yaklaşık her 20 milisaniyede bir belli bir duty(gecikme – lojik 1’de kalma süresi) zamanı kadar lojik1’de tutmak. Servo aldığı lojik1 sinyalinin süresine göre dönme işlemi gerçekleştirecek. Bu sinyal çok uzun verilirse servo tamamen bir yöne döner ve zorlanır, eğer bu sinyal lojik sıfır olarak kalırsa bu sefer servo tamamen ters yöne döner ve yine zorlanır. Bu zamanlamayı öyle bir ayarlamalıyız ki ne çok fazla, ne de çok az voltaj vermeliyiz. Benim hesaplarıma göre yaklaşık 20 milisaniyede bir 3 milisaniyeden küçük bir duty değeriyle işlem yaptığımızda servo normale yakın çalışıyor. Bu değerlerle kendi işlemlerinizi yapmak için oynayabilirsiniz.

Okumaya devam et

C18 Diliyle Robot Programlama – I²C (Inter-Integrated Circuit) Haberleşmesi

I²C seri iletişimi, mikrodenetleyicinin diğer entegre elemanlarıyla kolay iletişim kurmasını sağlayan entegreler arası bir haberleşme protololüdür. Kullanacağımız PIC18F4585  içerisinde hem I²C hem de SPI (Serial Peripheral Interface) birimini içinde barındıran MSSP (Master Synchronous Serial Port) modülü bulunmaktadır.

I²C protokolünde haberleşmek için iki uç kullanılır. Bunlar SDA (Seri veri giriş-çıkış) ve SCL (Seri saat sinyali – clock)’dir. SDA uçlarından bilgi aktarımı işlemleri SCL ucundaki  saat sinyali sayesinde senkronize olarak gerçekleştirilmektedir. Datasheet’e bakacak olursak PIC18F4585’de SDA ve SCL  için kullanılan uçların 18. ve 23. pinler olduğunu görebiliriz.

Bu protokolde entegreler master(ana-usta) ya da slave(uydu-köle) olabilir. Entegre master iken; saat sinyalini kendisi yönetir, iletişimin kontrolü master olan entegrededir. Slave konumunda olan entegre saat sinyali üretmez, sadece veri alışveriş işlemi yapar.

Bu bölümdeki amacımız elimizdeki 2 adet PIC18F4585 entegresinden birini master, birini slave olacak şekilde programlayarak master’dan slave‘e veri gönderip, yine master   aracılığıyla slave‘den veri okumak olacak. İki entegreyi de bu senaryo için programlamamız gerekiyor.

I²C iletişiminde her bir slave cihazının kendine özgü bir adresi vardır. Böylece master olan cihaz hangi slave cihazıyla işlem yapacağını belirtebilir (Bir master birden çok slave cihazıyla veya birden çok master kendi arasında I²C kullanarak haberleşebilir). Bu adres  7 bitlik veya 10 bitlik olabilir. Biz bu bölümde 7 bitlik adresleme kullanacağız. Veri iletişim hattı I²C protokolünde 8 bittir. Yani tek seferde 8 bitlik (1 byte) veri gönderip okuyabiliriz.

Genel olarak iletişim aşağıdaki şekilde sağlanır;

  • Başlama şartı (Start Condition)
  • Adres + Okuma/yazma bilgisi
  • Veri bitleri
  • Durma şartı (Stop Condition)

Not:  Start ve Stop şartları master cihaz tarafından oluşturulur. Master cihazın adres bilgisi olmaz. Veri bitlerinden önce mutlaka adres bilgisi gönderilmelidir ki o adrese sahip slave    cihaz seçilsin. Yoksa veri aktarımı -tek bir slave cihazla haberleşme yapılsa bile- gerçekleşmez. Okuma/yazma bilgisi denen şey iste master cihazın slave cihaza veri gönderme veya cihazdan veri alma durumunun belirlenmesinde kullanılır.

Okumaya devam et

C18 Diliyle Robot Programlama – Dış Kesme (External Interrupt) Kullanımı

Bu bölümde amacımız B portundan gelen sinyalin değişimini algılayan bir kesme oluşturmak. Bu kesme pinlerden gelen sinyaller tarafından tetiklenecek ve istediğimiz işlemi yapacak. Özellikle encoder okuma modülünü kodlarken bu sinyal değişimleri tarafından tetiklenen kesmelerden çokça faydalanacağız.

PIC18F4585’te 3 adet dış kesme girişi bulunur. Bunlar RB0(INT0), RB1(INT1) ve RB2(INT2) pinleridir.

Aynı zamanda bu RB0, RB1 ve RB2 pinlerine bizim butonlarımızın da bağlı olduğunu biliyoruz. Biz bu butonlar sayesinde bu kesme girişlerine +5V sinyali ve 0 (IDLE) sinyali verebiliyoruz. (Butona basmazsak 5V, butona basarsak 0V olduğunu kabul edelim). Amacımız butonlarla oluşturacağımız bu sinyalin düşen veya yükselen kenarlarında kesmelerin oluşmasını sağlamak. Düşen kenar dediğimiz şey, sinyalin 1 (+5V) durumundan 0 (IDLE) durumuna geçmesi, yükselen kenar dediğimiz şey ise sinyalin 0 (IDLE) durumundan 1 (+5V) durumuna geçmesidir.

Şekilde;

  • Mavi dikey çizginin olduğu bölümler; B sinyalinin yükselen kenarlarını,
  • Kırmızı dikey çizginin olduğu bölümler A sinyalinin yükselen kenarlarını,
  • Mor dikey çizginin olduğu bölümler B sinyalinin düşen kenarlarını,
  • Yeşil dikey çizginin olduğu bölümler A sinyalinin düşen kenarlarını göstermektedir.

Okumaya devam et

C18 Diliyle Robot Programlama – Timer (Zamanlayıcı) Kullanımı

Zamanlayıcı kullanmak için mikroişlemcilerde belirli birimler bulunur. PIC18F4585‘te bununla ilgili 3 birim bulunmakta. Timer0, Timer1 ve Timer2.

Bu bölümde amacımız bu zamanlayıcı birimlerini kullanarak belirli zaman aralıklarında kesme oluşmasını sağlamak. Oluşan kesmelerin kontrolünü yine ledlerle yapacağız.

Timer0 ve Timer1 hem zamanlayıcı hem de sayıcı olarak kullanılabilir. Birimin zamanlayıcı olarak kullanılabilmesi için değer artışının düzenli (periyodik) olması gerekir (Ör: 3 saniyede bir butona basmak). Sayıcı olarak kullanımda ise değer artışı düzenli olmak zorunda değildir (Ör: 10 dakika boyunca 35 defa herhangi bir zamanda butona basmak). Timer2 birimi ise sadece sayıcı olarak kullanılır. Bu birimleri sırayla inceleyelim.

Okumaya devam et

C18 Diliyle Robot Programlama – Kesme (Interrupt) İşlemleri

Kesmelerde temel amaç o anki program akışını durdurup kesmeyi oluşturan duruma özgü kodları çalıştırmak ve kodların çalışması bittikten sonra program akışını kalınan yerden devam ettirmektir. PIC18F4585’te kesmeleri oluşturmak için 2 vektör adresi kullanırız. Bu vektör adresleri mikroişlemcide interrupt geldiği zaman çalıştırılacak kodların bulunduğu bir bölüme referans verir. Bu vektör adreslerinden biri low_vector(düşük öncelikli interruptlar) diğeri ise high_vector(yüksek öncelikli interruptlar)’dür. Low_vector 0x18 adresini, High_vector ise 0x08 adresini gösterir. Programda bu kısımlar aşağıdaki şekilde kodlanır;

#pragma code high_vector=0x08
void high_interrupts (void) {
     _asm GOTO high_ints _endasm
}
#pragma code

Aynı şekilde düşük öncelikli interruptlar için low_vector=0x18 yazılır. Ayrıca _asm _endasm arasında kalan kısıma assembly koduyla referans verilir. Goto komutuyla high_ints denen bir bölgeye gidilir. Bu bölge aşağıdaki şekilde kodlanır;

#pragma interrupt high_ints
void high_ints (void) {

     //Kesme geldiginde calisacak kodlar

}

high_ints veya high_interrupts yerinde kendiniz de isimler belirleyip yazabilirsiniz.

Bir kesmenin oluşup oluşmadığı nasıl anlaşılır? Bunun için ilgili birimle alakalı flag‘in 1 ya da 0 olma durumuna  bakılır.  C18’de  bir  çok  modüle ait register  bulunur.  Bu  register’ların bazıları interruptların enable/disable durumunu ayarlamak için, bazıları interrupt oluştuğunda anlayabilmek için, bazıları kendi modülüne ait işlemleri gerçekleştirmek için kullanılır.

Okumaya devam et

C18 Diliyle Robot Programlama – Buton Yapma

Genel olarak output mantığı burada da geçerli. Bu sefer bazı portları giriş için (TRIS = 1) bazı portları ise çıkış için (TRIS = 0) ayarlayacağız. Amaç butonlara bağlı pinlerden sinyal (5 volt) geldiğinde ledlere bağlı pinlere sinyal (5 volt) vermek.

Benim kullandığım kart üzerinde butonlar 35,34 ve 33. pinlere bağlanmış durumda. Datasheet’e bakarsak bu pinlerin RB2, RB1 ve RB0 pinleri olduğu görülebilir.

Okumaya devam et

C18 Kütüphaneleri ve Özellikleri

Bu yazıda bundan sonraki yazılarda referans olarak kullanacağım bir çok fonksiyonun özelliklerini, ne tür parametreler aldıklarını ve bu parametrelerin ne için kullanıldığını açıklayacağım.

Bu başlık altında fonksiyonlarını inceleyeceğimiz modüllerin isimleri aşağıdaki gibidir;

  • ADC (Analog-to-Digital Converter)
  • I/O Port
  • Timer
  • PWM (Pulse Width Modulation)
  • USART
  • Delay
  • I²C

Okumaya devam et