MSP430 Launchpad – Led Yakma Uygulaması

Bu dönemki mikroişlemciler dersimizi Texas Instruments’in MSP430 mikrodenetleyicisi üzerinden işliyoruz. Okuduğum ve duyduğum kadarıyla MSP430 birçok şeyin düşünüldüğü güzel bir denetleyiciymiş. Kodları yazmak için iki tane bilinen IDE varmış. Bunlar, CCS ve IAR firmalarının programlarıymış. Ben IAR’ın Embedded Workbench IDE’sini kullanmaya karar verdim. Şimdi adım adım ilk uygulamamızı oluşturmaya başlayalım.

Öncelikle bu programı indireceğiz. Şuradan indirebilirsiniz. Programı indirip kurduktan sonra, launchpadimizi kutudan çıkan USB kablosu aracılığıyla bilgisayara bağlıyoruz. Bağlantıyı yaptıktan sonra, launchpad için gerekli sürücüler vs. kuruluyor. Artık bilgisayarımızla launchpadimiz haberleşebilecek. Sürücüler kurulurken, yazılımsal bir seri portun da kurulduğunu gördüm. Bilindiği gibi çoğu dizüstü bilgisayarda seri port bulunmuyor. Bu bize, USB portu üzerinden, sanal seri port yardımıyla launchpadimiz ile haberleşebilme olanağı sağlayacak. Güzel bir şey.

Launchpadin üzerindeki MSP430, üzerinde yüklü bir yazılımla beraber geliyor. Bu bir sıcaklık ölçme uygulaması. Soldaki (P1.3) butona basıldığında, ortamın sıcaklığını referans olarak alıyor. Ortam ısınırsa, kit üzerindeki kırmızı led, soğursa da yeşil led yanıyor. Hatta üstteki paragrafta bahsettiğim sanal seri port özelliğini bu uygulamada kullanabiliyoruz. Oluşan seri portu, bir terminal yazılımı ile dinlersek yaklaşık yarım saniyede bir veri gönderdiğini görebiliriz. Ortam sıcaklığının değişimine göre farklı veriler gönderiyor.

Şimdi ilk uygulamamız olan led yakıp söndürme uygulamasına başlayalım. İlk olarak IAR Embedded Workbench’i biraz kurcalamak lazım. Öncelikle yeni bir proje oluşturalım. “Project” menüsünden “Create New Project”e tıklayınca karşımıza bir pencere geliyor. Burada, kodlarımızı yazacağımız dili seçeceğiz. Ben C ile yazacağım için, “C”nin yanındaki “+”ya, oradan da altta çıkan “main”e tıklayarak “OK” diyoruz. Şimdi açılan pencerede ise projemizin ismini ve kayıt yerini seçeceğiz. Burada her proje için ayrı bir klasör oluşturursak, hem düzeni sağlamış oluruz, hem de olası bir kaza ile eski yazdığımız main.c dosyasının üzerine yazmayı engellemiş oluruz.

Proje adını ve kayıt yerini belirledikten sonra karşımıza genel hatları oluştrurulmuş olan main.c dosyası geliyor. Şimdi kod yazmaya başlamadan projemizde yapmamız gereken birkaç ayar var, onlara bakalım. Üstteki “Projects” menüsünden “Options”u açıyoruz. Gelen pencerede, hemen “General Options” kategorisi altından, denetleyicimizin modelini seçiyoruz. Launchpadin üzerinde takılı gelen çipin modeli MSP430G2231.

Yapmamız gereken ikinci ayar ise “Debugger” kategorisi altından, “Driver”ı, “FET Debugger” olarak seçmek. Bunu yapmazsak, yani “Simulator” iken, IAR, kodumuzu bilgisayar üzerinde simüle ediyormuş. Biz, sonucu kitin üzerinde görmek istediğimiz için bu seçimi yapıyoruz.

Bu işlemi de yaptıktan sonra kodumuzu yazmaya başlayabiliriz.

#include "io430.h"

void main( void )
{
  // Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;

  P1DIR = 0x41;

  while (1)
  {
  if (!(P1IN & 0x08))
    P1OUT = 0xFF;
  else
    P1OUT = 0x00;
  }

}

Burada, main fonksiyonu int tipinde tanımlanmıştı. O şekilde de kullanıldığında sorun yok, ama bir warning veriyordu. Ben de bu yüzden main fonksiyonunun tipini void yaptım, “return 0;” satırını da sildim.

Şimdi kodun ne iş yaptığına bakalım. Aslında gayet basit. Soldaki butona basıldığında her iki led de yanacak, butona basılı değilken sönecek.

Öncelikle gerekli kütüphane dosyamızı include edip main fonksiyonunu başlattık ki bunlar zaten kendiliğinden yazılı olarak gelmişti. Öncelikle hangi pinleri çıkış yapacağımı belirliyorum. Launchpad üzerinden ledlere baktığımızda, bunların P1.0 ve P1.6 pinlerine bağlı olduklarını görüyoruz. Butonumuz da P1.3 pinine bağlı. Bunlar bir kenarda dursun.

Ledlerin olduğu pinleri çıkış yapacağım, geri kalanlar giriş olacak. Bu tanımlamayı yaparken, “1” çıkış, “0” ise giriş oluyor. Bu durumda P1 portunun direction özelliğinin şu şekilde olması gerekir: “01000001”. Burada, en sağdaki bit P1.0, en soldaki ise P1.7. Görüldüğü gibi 0. ve 6. pinleri çıkış, geri kalanları giriş yapacağız. Şimdi bu binary ifadeyi hexadecimale çevirirsek “41” değerini elde ederiz. O zaman direction tanımlamamızı yapalım:

P1DIR = 0x41

Evet, artık işi yapan kısma geçebiliriz. Sonsuz bir döngü oluşturuyorum ki, sürekli olarak benim butona basıp basmadığımı kontrol etsin, ona göre işlem yapsın. Sonsuz döngünün içinde de “if” ile butona basılıp basılmadığını kontrol ediyorum. Peki bunu nasıl yapıyorum?

Şimdi ben, P1.3 pininde takılı olan butonun değerini okumak istiyorum. Bu değer lojik 1 ya da lojik 0 olabilir. Bir biti, “1” ile “VE” işlemine sokarsam, o bitin değerini görürüm. “0” ile “VE” işlemine sokarsam, sonuçta “0” görürüm. O zaman, ben PORT1’i, okumak istediğim bitin “1”, diğer bitlerin “0” olduğu binary bir yapıyla, bitsel olarak “VE” işlemine sokarsam, okumak istediğim pinin değerini boolean olarak görebilirim.

Örneğin butona basılmamış olsun. Bu durumda P1IN registerının değeri “XXXX1XXX”dir. Benim okumak istediğim pin, P1.3. Bu durumda, ben P1IN registerını, “00001000” ile bitsel ve işlemine sokarsam, sonuçta “00001000” görürüm. Bu değer, 0’dan farklı olduğu için lojik “1” anlamı taşıyor. Butona basıldığında ise P1IN registeri “XXXX0XXX”. Ben bunu “00001000” ile bitsel ve işlemine sokarsam, sonuçta “00000000” görürüm.

Şimdi elimde şöyle bir şey var; Butona basıldıysa if’in içi “0”, basılmadıysa “1” oluyor. Ben bunu “NOT” işlemine sokarsam, daha mantıklı gelen, basıldığında “1”, basılmadığında “0” değerini görürüm. O zaman, bu koşula göre P1OUT registerımın değerini değiştirirsem, butona basılıp basılmadığına göre ledleri kontrol edebilirim. Burada “0xFF”, “11111111” anlamına geliyor, yani çıkışların tümü “1” oldu. Bu durumda ledler yanar. Tersi durumda ise “0x00”, “00000000” olduğundan ledler söner.

Şimdi kodumuz tamam olduğuna göre, bunu kite atıp çalışmasını görelim. Bunun için sağ üstteki yeşil “play” butonuna tıklıyoruz.

Evet işlem tamamlandıktan sonra kodumuz çipe aktarıldı. Şimdi kullanabileceğimiz birkaç buton var. Ben bunların tamamını denemedim, sadece işime yarayanları kullandım. O an hangi satırda olduğumuz yeşil arkaplanla belirtilmiş. Sağda da kodumuzun assembly hali gözüküyor. Adım adım ilerleme gibi işlemler yapılabilir. Ben sadece direkt olarak çalıştırdım.

Kullandığım butonları kutu içine aldım. Kırmızı kutudaki butona basarak uygulamanın çalışmasını başlatabilirsiniz. Mavi kutudaki buton ile, debug işlemini sonlandırabilirsiniz. Yeşil kutudaki butonla ise, debug işlemi bittikten sonra da, uygulamanızın çalışmaya devam etmesini sağlayabilirsiniz. Bu buton seçili olmadan debug işlemini bitirirseniz, kit üzerinde uygulamanın çalışmasını görmeye devam edemezsiniz. Diğer butonlar da sanırım adım adım ilerlemek için, ama kullanmadığım için ne iş yaptıklarından tam olarak emin değilim.

Son olarak kit üzerindeki çalışmadan da birkaç resim koyalım ve bu yazıyı bitirelim…

Ledler sönük

Ledler sönük

Burada butona basılmadığından ledler sönük.

Ledler yanıyor

Ledler yanıyor

Burada ise her ne kadar fazla belli olmasa da ledler yanıyor.

Share
  1. Kolay gelsin ben de 4 led için şöyle bir kod yaptım ama çalıştıramadım.Yanlışlar neler acaba bakabilirmisin?

    #include “msp430g2231.h” // MSP430G2231 Kütüphanemiz

    int main( void )

    {
      
    WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset
     int i;
    int j;
    int sayilar1[] = {00000001,00000010,00000100,00001000};
    int sayilar2[] = {00000001,00001000,00000100,00000010};

    // sırayla yapılacak çıkış değerlerimizi girdim

    P1DIR = 0x0f; // çıkışlarımızı seçiyoruz P1=00001111 olmak üzere 4 tane
     
      while (1)
      {
      
    for(i=0;i++;i<100) {
    for(j=0;j++;j<4){

    P1OUT = sayilar1[j];
    __delay_cycles(100000);// bekleme
    P1OUT = 0x00;
    __delay_cycles(100000);// bekleme
        
    }
    for(i=0;i++;i<100) {
    for(j=0;j++;j<4){

    P1OUT = sayilar2[j];
    __delay_cycles(100000);// bekleme
    P1OUT = 0x00;
    __delay_cycles(100000);// bekleme
        
    }

      
      

    }
    }
     
    }

    • Deneme imkanım olmadı ama sayilar1 ve sayilar2 dizilerinin elemanlarını binary olarak değil de decimal ya da hexadecimal olarak yazıp öyle bir deneyin. Gerçi siz yorumu yazalı bayağı olmuş. Muhtemelen çözmüşsünüzdür ama sorun devam ediyorsa yazdığım gibi bir deneyin derim.

  2. Dediğiniz gibi baya oldu çözeli 😀
    Şu aralar msp430 da uart denemeleri yapıyorum ama maalesef kavrayamadım 😳 Anladığım kadarı ile g2231 de de donanımsal uart modülü bulunuyormuş.Yeni max3232 alıp onu kuurcalamaya başladım…

    Kolay gelsin

    • Evet, G2231’de UART modülü yok. Eğer Launchpad kullanıyorsanız, bunun oluşturduğu sanal seri port üzerinden bit banging yöntemiyle seri haberleşme yapmanız mümkün. Bununla ilgili sitede bir yazım var, onu inceleyebilirsiniz. Kolay gelsin…

  3. Kolay gelsin. Ben msp430’da zaman ayarlı led yakmak istiyorum. beceremedim. delay kodunu kullanamadım.Bir örnek yazmanız mümkün mü?

  4. merve durmuş

    4 tane yedi parçalı gösterge kullanarak bi digital saat uygulaması yapacağım ancak kristal dışarıdan bağlanacak ve 32 Mhz olacak sizce kesme kullanarak yapma daha kullanışlı olabilir mi

  5. hocam gerçekten çok teşekkürler, başlangıç için türkçe kaynaklar arasında en iyisi, emeğinize sağlık.

Yorum Yap


Not - Bunları KullanabilirsinizHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>