Elektronik / Mikrodenetleyici Projeleri/

MSP430

Sponsorlu Bağlantılar

Staja başladığım ilk günlerde incelediğim MSP430‘u, işlerimin biraz durulmasından sonra biraz daha öğrenmek için tekrar kutusundan çıkardım. İlk öğrenmeye başladığım zamanlarda osilatör ayarlarının zorluğundan yakınsam da, Texas’ın ilgili dokümanlarında bu ayarların ne kadar kolay yapıldığını görünce, bu kadar zaman bununla mı uğraşıyormuşum diye kendime de kızmıştım. Peki nedir bu MSP430, neden bugünlerde herkesin gündeminde?

Texas Instrument‘in özellikle Microchip’in karşısına “düşük güç tüketimi neymiş gör” diye ürettiği dünyanın en düşük güç harcayan mikrodenetleyicilerinden biri MSP430. Elektronik piyasasında özellikle ürettiği güç entegreleri ile nam salan Texas Instrument’in ürettiği bir mikrodenetleyicinin güç tüketiminin uçuk olması beklenemezdi elbette. Onlar da bunun hakkını vermek için ellerinden geleni yapmışlar zaten. Ayrıca MSP430, 8bitlik işlemlerden kurtulmak isteyenler için bir basamak oluşturabiliyor, çünkü MSP430 16bitlik veri yolu kullanıyor.

Peki rakamlara dökecek olursak, gerçekten ortalama (MSP430F2013) MSP430’u eşsiz kılan nedir şöyle bir bakalım;

– Gerçek zamanlı saat modunda çekilen akım: 0.7uA
– MIPS aktifken çekilen akım: 200uA
– Flash seçenekleri: 10-60kB
– Rom seçenekleri: 1-16kB
– Ram seçenekleri: 512B-10kB
– GPIO seçenekleri: 14-22-48
– ADC seçenekleri: 10-12Bit
– DAC seçenekleri: 12Bit
– İletişim seçenekleri: SPI, I2C, UART, USI
– 12kHz RC, 16MHz’e kadar içsel krital
– 16bit veri yolu
– Ve daha bir çok özellik.[/important]

Orta seviye sayılabilecek bir mikrodenetleyicinin tüm özelliklerine sahip bu mikrodenetleyici sadece 3.3V ile çalışıyor. Tüm bu rakamlar özellikle taşınabilir cihaz tasarımcıları için oldukça önemli değerler.

Örneğin elimize 2600mAh’lik ortalama bir pil olsun. MSP430’unda MIPS’inin her zaman aktif olduğunu düşünelim. Hemen oran orantı kurduğumuzda 2,600,000/200=13000saat~1,5yıl çalışma demek. Bir de MSP430’u uyku moduna aldığınızı düşünün.
Bu kadar özendirmeden sonra elbette bir örnek yapmadan olmaz.

msp430-msp430F2013-kit

Ben, staj yerinden temin ettiğim, resmini yukarıda görebileceğiniz USB geliştirme sticki üzerinde kodlarımı yazıp deniyorum, bu stick’in üzerinde ise yine yukarıdaki resimde görüleceği üzere MSP430F2013 bulunmakta. Ayrıca stickten dışarı pin çıkışları da alınmış, programlamlama ve debugger özelliğine sahip olan stick’te kontrol için bir tane de led koymuşlar.

MSP430’un geliştirme ortamı ise Texas’ın kullanıcılara bedava olarak sunduğu “IAR Embedded Workbench KickStart for MSP430”. Özellikle şunu belirtmek isterim ki, programı oldukça hızlı derlese de IAR’ın görünümü gerçekten “iğrenç”. Onun için her zaman AVR programlarken çok hoşlanıyorum, çünkü adamlar Eclipse gibi bir arayüz kullanıyorlar. İnternette yaptığım ufak araştırmalarda MSP430 için de geliştirilmiş Eclipse eklentileri gördüm, fakat deneme şansım daha olmadı. Fakat deneyip, olumlu sonuçlar aldığımda elbette buradan yine sizlerle paylaşacağım.

MSP430 için ilk örneğimizde, 16 bitlik TIMERA ve kesmesini kullanarak bir ledin 1sn’de yanıp sönmesini sağlayacağız. Krital kaynağımızı ise DCO seçeceğiz.

Örnek kodlarımız ve açıklamalarını aşağıda görebilirsiniz.

#include "msp430.h"       	  // MSP430 başlık dosyası

void main( void )
{
	WDTCTL = WDTPW + WDTHOLD; // Watchdog Timer'ı durdur.
 
	BCSCTL1= CALBC1_1MHZ;     // Kristal şu anlık 1MHz ayarlanıyor
	DCOCTL = CALDCO_1MHZ;
	BCSCTL3= LFXT1S_2;
        
	TAR=0x0000;      // TAR değeri sıfırlanıyor
	TACTL=0x02D6;    // SMCLK seçili, MOD1, 1:8, Interrupt Enable, Interrupt Flag temizleniyor
	TACCR0=62500;    // TACCR0 değerine 1.000.000/8=125.000/2=62500 yükleniyor
        
	P1DIR=0xFF;   // P1 çıkış olarak ayarlanıyor
        
	for(;;)
	{
		if((TACTL&0x0001)==0x0001)    // TimerA kesmesi bekleniyor
		{
			P1OUT^=0xFF;   // Kesme gelince P1 çıkışları tersleniyor
			TACTL&=0xFFFE; // Kesme bayrağı temizleniyor
		}
	}
}

Yukarıda yazdığımız kod TIMERA’nın kesme bayrağına sonsuz döngüde bakıyor. Bu, basit uygulamalar için uygulanabilir gözükse de oldukça amatörcedir. Bunun yerine her zaman TIMER kesmesi kullanılması tercih edilmelidir. Aynı işlemi yapan kod ise aşağıda gözükmektedir.

#include "msp430.h"         // MSP430 başlık dosyası

// TimerA kesme vektörü
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  P1OUT^=0xFF;              // Kesme gelince P1 çıkışları tersleniyor
}

void main( void )
{
  WDTCTL = WDTPW + WDTHOLD; 	// Watchdog Timer'ı durdur.
 
  BCSCTL1= CALBC1_1MHZ;   // Kristal şu anlık 1MHz ayarlanıyor
  DCOCTL = CALDCO_1MHZ;
  BCSCTL3= LFXT1S_2;
        
  TAR=0x0000;             // TAR değeri sıfırlanıyor
  TACTL=0x02D6;           // SMCLK seçili, MOD1, 1:8, Interrupt Enable, Interrupt Flag temizleniyor
  TACCR0=62500;           // TACCR0 değerine 1.000.000/8=125.000/2=62500 yükleniyor
  TACCTL0=CCIE;           // CCIFG interrupt'ı açılıyor  
        
  P1DIR=0xFF;             // P1 çıkış olarak ayarlnıyor
  
  _EINT();                // Genel kesmeler açılıyor
        
  for(;;);
}

Görüleceği üzere bu kod daha sağlıklı olmuştur. Yukarıdaki kodda göreceğiniz üzere MSP430’da kesmelere gitmeden önce vektörel olarak tanımlama yapılmalıdır. Yine yukarıda görüldüğü gibi kesmeye gidildiğinde MSP430, o kesmeye ait bayrağı kendisi silmektedir.

Yazdığımız kodun çalışırken çekilmiş videosu ise aşağıda gözükmektedir.

Görüldüğü gibi o ya da bu mikrodenetleyici olsun her şey registerleri kontrol etmekte bitiyor. Onun için ben, yeni bir mikrodenetleyici öğrenirken öncelikle çevresel birimleri ve registerleri ele alıyorum. Daha sonrası kod yazmak olduğu için gerisi o ya da bu şekilde devam eder. Fakat registerler öğrenilmeden, bir led yakıp söndürmek bile işkence haline gelebilir.

İlerleyen zamanlarda yavaş da olsa bu konu üzerine eğilmek istiyorum.
Her türlü sorunuzu bana yorum kısmından sorabilirsiniz.
Herkese iyi çalışmalar.

  • Nadir

    Selamlar,
    http://www.cizgi-tagem.org/activity/request.aspx?key=mcuturkey linkine bakarsan proje yarısması senin katılmanı ve bilgi paylaşımını bekliyoruz. Ben meslek lisesi kategorisinde katılacağım :-)

  • FxDev

    @Nadir: Ben de katılmayı düşünüyorum. En azından kit sahibi olmak hoş olabilir.

  • Seçkin Alan

    Merhaba,
    Bu kiti tam olarak nasıl temin edebilirim? Öğrenciyim, yarışmaya katılacak vakit bulamadım. TI sitesinden sipariş şuan için veremem. Türkiyede satın alacak bir yer varmı? Tabi makul bir fiyat.
    Teşekkürler…

  • FxDev

    Şu an Çizgi Tagem’den başka yer aklıma gelmiyor.

  • Ömer

    if((TACTL&0×0001)==0×0001) kısmında, sonsuz döngü içerisinde kesmenin oluşup oluşmadığını kontrol ediyorsunuz. Ben de aynı şekilde

    if(TACCTL0_bit.CCIFG == 1) kodu ile sonsuz döngü içerisinde, yakalama işleminin gerçekleşip, gerçekleşmediğini kontrol edebilir miyim?

  • FxDev

    Edebilirsin Ömer ;)

  • Hakan KOÇ

    Bu denetleyici güç elektroniği uygulamalarındamı tercih ediliyor eğer ediliyorsa ne avantajı var. Ben convertörlerde bu denetleyiciye nasıl bir rol verebilirim.

  • Hakan KOÇ

    Güç elektroniğinde hangi denetleyicileri tercih edersiniz. dsPIC diye duymustum daha önce, acaba dsPIC ler normal picler gibimi programlanıyor veya sizin bu konuda fikriniz nedir. Paylaşımlarınız için çok teşekkür ederim.

  • DumaN

    Bende Ç.T. sayesinde MSP430 serüvenine başladım denebilir. Site üzerinde M.Fatih İnanç hocamızın eğitimi de mevcut. Bence MSP430 üzerine yoğunlaşmak gerekiyor. Normalde ATMEL den ve PIC den başka mikrodenetleyici kullanmaya gerek yok diyordum ama MSP430 gerçek 16bit mimarisiyle baya fazla avantaj sunmakta. Benden tavsiye bu konuda yoğunlaşmalıyız.