MSP430 ve Karakter LCD ile Refleks Ölçer

Bu yazımda mikroişlemciler dersindeki final ödevim olan refleks ölçer uygulamasından bahsedeceğim. Yapmam gereken şey; bir buton aracılığıyla kullanıcının refleksini ölçmek, bunu da milisaniye cinsinden 7 segment displayde göstermekti. Ben sonucu gösterme kısmını değiştirip, 7 segment display yerine 2×16 karakter LCD kullanarak ödevi gerçekleştirdim. LCD’yi sürerken bir önceki yazımda anlattığım kütüphaneyi kullandım. 7 segment displayde göstermek için ise şu adresteki birden fazla displayin tarama yöntemiyle nasıl kullanılacağı hakkındaki yazım faydalı olabilir.

Öncelikle bu yapacağımız devre hassas bir zamanlama gerektirdiği için timer modülünü kullanmak doğru olacaktır. Bunun dışında yapmamız gereken oldukça basit. Belirli ve kullanıcıya herhangi bir şekilde bildirilen bir anda timer’ı başlatmak, kullanıcı butona bastığında da timerı’n o anki değerini alıp, milisaniye cinsine çevirip kullanıcıya göstermek.

Kısaca timer modülünü anlatacak olursak, mikrodenetleyiciden bağımsız olarak arka planda çalışan bir sayıcıdan başka bir şey değildir. Biz mikrodenetleyiciden timerı kurarız, o arka planda sayar, eğer izin vermişsek belirlediğimiz durumlarda bize kesme üretir.

Timer’ı kurarken istediğimiz şekilde kullanabilmek için birkaç parametre önemlidir. Bunlardan biri clock sinyali olarak timer’ın hangi kaynağı kullanacağıdır. Ben bu uygulamada frekansı 1MHz olan SMCLK kaynağını kullandım. Bu kaynak harici bir kristale ihtiyaç duymuyor. Ayrıca bildiğim kadarıyla timer’a clock kaynağı olarak bağladığınız kristali, ya da harici clock işareti kullanmayı da seçebiliyorsunuz.

Bir diğer önemli parametre, clock sinyali için bölücü değeri. Bu değer, timer için 1, 2, 4 veya 8 olarak ayarlanabiliyor. Bu bölücü değerine göre timer’ın sayma hızı değişecektir. Örneğin bölücü 1 seçildiğinde, timer gelen her clockta bir artar, buna karşılık bölücü 8 seçilirse, timer her 8 palste bir artar.

Eğer timer’ın kesme üretmesine izin verdiysek, bu kesmenin ne zaman üretileceğini belirlememiz gerek. Bunu da timer şu sayıya ulaştığında kesme gelsin şeklinde ayarlayabiliyoruz. Bu ayar TACCR0 registerına atadığımız değer oluyor, ve en fazla 65535 olabiliyor. Bu uygulama için kabaca bilmemiz gereken timer özellikleri bunlar. Timer modülü hakkında daha detaylı bilgi için Fatih İnanç’ın şu yazısını okuyabilirsiniz.

Şimdi biraz hesap yapalım. Bize milisaniye cinsinden bir değer gerekiyor. O zaman biz timerı her bir milisaniyede, bir artacak şekilde kurabilirsek direkt olarak sonucu elde edebiliriz. Bu durumda timer’ı, saniyede 1000’e kadar sayacak şekilde ayarlamalıyız. Elimizdeki clock kaynağı 1MHz, en fazla bölecileceğimiz sayı 8. 1 MHz, saniyede 1.000.000’a kadar sayması demek. O halde 1.000.000 / 8 = 125.000 yapıyor. Bu durumda en yavaş saydırmamız durumunda bile saniyede 125.000 kere sayıyor. Bu, bize gereken 1000’den oldukça yüksek.

O zaman şöyle bir şey yapalım, her 1 milisaniyede timer’dan bir kesme gelsin, ve biz her kesme geldiğinde bir değişkeni arttıralım. Sonuç olarak bu değişkende, bize gereken milisaniye cinsinden bir değer bulunacak. 1 ms için hesap yapıp timer’ı kaça geldiğinde kesme üretecek şekilde kuracağımızı bulalım. Bir üst paragraftaki hesaba bakarsak, 8’e bölünmüş clock ile, bir saniyede 125.000’e kadar sayıyor. Bu durumda bir milisaniyede de 125’e kadar sayar. Bu değeri aklımızda tutalım, kodumuzu yazarken lazım olacak.

Şimdi devre şemasını vereyim, sonra da yavaş yavaş koda başlayalım.

Devre şeması

Devre bir önceki yazımdaki devreye benziyor. Üstteki entegreler LCD ve MSP430’un beslemesi için gereken gerilimleri sağlıyor. Bir buton var, ve MSP’yi launchpadden bağımsız kullanacağım için RST pinine de lojik 1 uygulamam gerekiyor. Launchpad içinde de bu işlem muhtemelen yapılıyordur.

Koda başlayalım:

#include "io430.h"
#include "lcdFonksiyonlar.h"
#include "intrinsics.h"

void solaKaydir(void);
void hizliOl(void);
void sonucGoster(void);

int dongudenCik = 0, tarDegeri = 0, kazanmaLimiti = 115;
char tar2, tar1, tar0;

void main(void)
{
  lcdBekle(10);                       // Bir süre beklendi.

  WDTCTL = WDTPW + WDTHOLD;           // WDT kapatıldı.

  P1DIR = 0XF0;                       // P1 portunun 7 - 4. bitleri çıkış. Diğerleri giriş.
  P2DIR = 0XC0;                       // P2.6 ve P2.7 çıkış
  P2SEL = 0X00;                       // P2.6 ve P2.7 i/o olarak kullanılacak.
  P1IE_bit.P1IE_3 = 1;                // P1.3'teki buton için kesme aktif edildi.
  P1IES_bit.P1IES_3 = 1;              // Kesme düşen kenarda olacak, yani butona basıldığı anda.
  P1IFG_bit.P1IFG_3 = 0;              // Kesme bayrağı temizlendi.
  TACCTL0 = CCIE;                     // TIMERA modülünün kesme izni aktif edildi.
  __enable_interrupt();               // Genel kesmeler aktif edildi.

  lcdBekle(10);                       // Bir süre beklendi.
  lcdHazirla();                       // LCD hazırlanıyor.
  lcdBekle(100);                      // Bir süre beklendi.
  //----------------------------------------------------------------------------

Gerekli kütüphanelerimi include ediyorum, kullanacağım değişkenleri ve fonksiyon prototiplerini yazıyorum. Gerekli kesme ve port ayarlarını yapıyorum. Burada hangi değişken ne işi yapacak belirtmekte fayda var. dongudenCik değişkeni, normalde “0”. Bu değişkeni kontrol ederek, kullanıcıya değişken “0” olduğu sürece mesaj veriyorum. Butondan kesme geldiğinde bu değişkeni “1” yapıyorum, böylece döngüden çıkıp, LCD üzerinde bir sonraki ekrana geçmiş oluyorum. tarDegeri değişkeni, timer sayesinde her 1 ms’de bir artan değişkenim. tar0, tar1 ve tar2’yi ise, sonucu LCD’ye gönderirken tarDegeri değişkenini basamaklarına ayırıp bu değişkenlere atıyorum. Böylece LCD’ye sonucu char tipinde gönderiyorum.

  // İlk adım : mesajı göster ve butona basılıncaya kadar bekle
  lcdHucreyeGit(1, 1);                // 1. satır, 1. sütuna gidildi.
  lcdYaziYaz("   Baslamak icin butona basin.");     // Mesaj LCD'ye yazıldı.
  lcdBekle(3);                        // Bir süre beklendi.
  solaKaydir();                       // Yazı kesme gelene kadar sola kayacak.
  //----------------------------------------------------------------------------

  lcdTemizle();                       // LCD temizlendi.
  lcdGonder('k', 0x10);               // Sola kaymayı durdurmak için komut gönderildi.

  // İkinci adım : geri sayım
  lcdHucreyeGit(1, 8);                // 3'ten geriye doğru sayım işlemi yapılıyor.
  lcdYaziYaz("3");
  lcdBekle(1000);
  lcdHucreyeGit(1, 8);
  lcdYaziYaz("2");
  lcdBekle(1000);
  lcdHucreyeGit(1, 8);
  lcdYaziYaz("1");
  lcdBekle(1000);
  //----------------------------------------------------------------------------

Bu kısımda LCD’üzerinde “Baslamak icin butona basin” yazısını sola kaydırıyorum. Bu, aşağıda göreceğiniz “solaKaydir” fonksiyonunda, butona basıldığında kırılacak bir döngü içinde oluyor. Butona basıldığınıda lcd temizleniyor, yazının kaymaması için komut LCD’ye gönderiliyor ve 3’ten geriye doğru sayılıyor. Artık refleks ölçüm işlemi başlayacak.

lcdTemizle();                       // LCD temizlendi.

  // Üçüncü adım : Timer başlatılarak, değeri LCD'ye basılacak.
  TACCR0 = 125;                       // Her 1ms'de kesme üretecek.
  TACTL = MC_1 + TASSEL_2 + TACLR + ID_3;     // Timer, up modda ve div = 8 olarak başlatıldı.

  dongudenCik = 0;                    // Geri sayım sırasında kesme geldiyse değişken "1" olur.
                                      // Bunu "0" yapmamız lazım ki döngüye girebilsin.

  while(dongudenCik == 0 && tarDegeri < 1000)             // dongudenCik değişkeni 0 iken dönecek.
  {
    tar2 = tarDegeri / 100 + 0x30;    // Basamaklarına ayrılıyor.
    tar1 = (tarDegeri % 100) / 10 + 0x30;
    tar0 = tarDegeri % 10 + 0x30;     // 0x30 değeri, 0'ın ASCII kodudur. Elde ettiğimiz rakama bunu eklersek, o rakamın ASCII kodunu buluruz.
    lcdHucreyeGit(2, 6);              // İstenen yere gidildi.
    lcdHarfYaz(tar2);                 // Yüzler basamağı basılıyor.
    lcdHarfYaz(tar1);                 // Onlar basamağı basılıyor.
    lcdHarfYaz(tar0);                 // Birler basamağı basılıyor.
    lcdYaziYaz(" ms");                // " ms" yazısı basılıyor.
  }
  //----------------------------------------------------------------------------

Geri sayım işleminden sonra LCD temizleniyor, yukarıda hesapladığımız “125” sayısına kadar sayıp kesme üretecek şekilde timer başlatılıyor. Eğer yanlışlıkla ya da bilerek geri sayım işleminde butona basıldıysa dongudenCik değişkeni “1” olur. Böyle olursa şimdiki döngüye giremeyiz. Bu yüzden bu değişkeni sıfırlıyorum. Ardından değişken 0 iken, ve timer tarafından arttırılan değişkenim 1000’den küçükken (henüz 1 saniye geçmemişken) dönecek şekilde bir döngü oluşturuyorum. Bu döngünün içinde de, geçen süreyi basamaklarına ayırıp LCD’ye gönderiyorum. Böylece kronometre gibi bir görüntü elde ediyorum.

TACTL = MC_0;                       // Timer durduruluyor. Bu, bir kesme geldi demektir.
  lcdTemizle();                       // LCD temizlendi.

  // Dördüncü adım : sonuç gösterilecek.
  if(tarDegeri >= 1000)               // Eğer timer'dan 1000 kez kesme geldiyse, yani 1 saniye olduysa;
  {                                   // Refleks ölçtüğümüz için 1 sn'yi maksimum süre olarak belirledim.
                                      // Zaten ödevin orijinalinde üç display ile en fazla 999 ms gösterilebiliyordu.
    hizliOl();                        // Oyuncu kayan yazı ile uyarıldı.
    lcdGonder('k', 0x10);             // Artık yazıların kaymaması için komut gönderildi.
  }
  else                                // Eğer gelen kesme butondan gelmişse,
    sonucGoster();                    // Oyuncu zamanında basmıştır, sonucu gösterilecek.
  //----------------------------------------------------------------------------

Butona basıldığında, ya da 1 saniye dolduğunda döngüden çıkıyor, timer durduruluyor. Daha sonra şöyle bir kontrol yapıyorum. Ben döngüden çıktım ama, butona basıldı diye mi çıktım, yoksa 1 saniye dolduğu için mi çıktım. Eğer butona basıldıysa, sonucGoster fonksiyonuna gidiyorum. Yok eğer süre dolduysa hizliOl fonksiyonuna gidiyorum. Bu fonksiyonlardan aşağıda bahsedeceğim.

lcdTemizle();                       // LCD temizlendi.
  dongudenCik = 0;                    // Bir sonraki döngüye girebilmesi için değişken sıfırlandı.

  // Beşinci adım : oyuncuya tekrar denemek isteyip istemediği sorulacak.
  lcdHucreyeGit(1,1);                 // 1. satır, 1. sütuna gidildi.
  lcdYaziYaz("   Yeniden denemek icin butona basin.");    // Tekrar denemek isteyip istemediği soruldu.
  solaKaydir();                       // Yazı sola doğru kayacak.
  //----------------------------------------------------------------------------

  lcdTemizle();                       // LCD temizlendi.
  lcdBekle(200);                      // Bir süre beklendi.
  lcdGonder('k', 0x10);               // Yazıların artık kaymaması için komut gönderildi.
  lcdBekle(200);                      // Bir süre beklendi.
  WDTCTL = 0xFF;                      // Buton kesmesi gelirse, oyuncu tekrar oynamak istiyor demektir. Ben de
                                      // WDT registerına saçma bir değer yazıyorum, böylece MCU'yu resetlemiş oluyorum. 🙂
} // Main fonksiyonunun sonu.

İlgili gösterim yapıldıktan sonra kullanıcıya tekrar oynamak isteyip istemediği, yine kayan yazı ile soruluyor. Butondan kesme gelene kadar yazı kayıyor, kesme gelirse LCD temizlenip, WDTCTL registerına 0xFF gibi bir değeri yazıyorum, böylece denetleyici resetleniyor, ilk ekrandan başlanıyor. Şimdi fonksiyonlara bir bakalım:

// Fonksiyonlar
void solaKaydir(void)
{
  while(dongudenCik == 0)             // dongudenCik değişkeni 0 iken dönecek. Kesme geldiğinde çıkacak.
  {
    lcdGonder('k', 0x18);             // LCD için sola kaydır komutu.
    lcdBekle(200);                    // Bir süre bekleniyor.
  }
  dongudenCik = 0;                    // Bir sonraki döngüye girebilmesi için değişken 0 yapıldı.
}

Bu fonksiyonda, butona basılana kadar (yaklaşık) 200 ms aralıklarla LCD üzerindeki metin birer karakter sola kayıyor. Döngüden çıkılırken de, bir sonraki döngüye girebilmek için döngüleri kontrol ettiğim değişkenimi “0” yapıyorum.

void hizliOl(void)
{
  int i;
  lcdTemizle();                       // LCD temizlendi.
  lcdYaziYaz("   Daha hizli olmalisin :)");     // Oyuncu uyarıldı.
  for(i = 0; i < 27 ; i++)            // Hesaplanan sayıda dönecek.
  {
    lcdGonder('k', 0x18);             // Karakterler sola kayacak.
    lcdBekle(200);                    // Bir süre beklendi.
  }
}

Bu fonksiyon ise, eğer refleks ölçümünde 1 saniye içinde butona basılmadıysa, kullanıcıyı uyarıyor. Diğer kayan yazıların aksine bu sefer butona basana kadar değil, sadece bir kere yazı kayıyor.

void sonucGoster(void)
{
  int i;
  for(i = 0 ; i < 5 ; i++)            // Kaç kez yanıp sönecek?
  {
    lcdHucreyeGit(1, 4);              //  1. satır, 4. sütuna gidildi.
    lcdYaziYaz("Sonucunuz:");         // "Sonucunuz:" yazıldı.
    lcdHucreyeGit(2, 6);              // 2. satır, 6. sütuna gidildi.
    lcdHarfYaz(tar2);                 // Oyuncunun bastığı andaki timer değerinin yüzler basamağı,
    lcdHarfYaz(tar1);                 // Onlar basamağı,
    lcdHarfYaz(tar0);                 // Ve birler basamağı basıldı.
    lcdYaziYaz(" ms");                // " ms" yazısı basıldı.
    lcdBekle(300);                    // Bir süre beklendi.
    lcdTemizle();                     // LCD temizlendi.
    lcdBekle(300);                    // Bir süre daha beklendi. Bu süre, bize yazının yanıp sönmesini sağlayacak.
  }

  if(tarDegeri < kazanmaLimiti)       // Eğer oyuncu belirlenen kazanma limitinden daha erken bastıysa;
    for(i = 0 ; i < 5 ; i++)          // Kaç kez yanıp sönecek?
    {
      lcdHucreyeGit(1, 4);            //  1. satır, 4. sütuna gidildi.
      lcdYaziYaz("TEBRIKLER!");       // "TEBRIKLER!" yazıldı.
      lcdHucreyeGit(2, 4);            // 2. satır, 4. sütuna gidildi.
      lcdYaziYaz("KAZANDINIZ");       // "KAZANDINIZ" yazısı basıldı.
      lcdBekle(300);                  // Bir süre beklendi.
      lcdTemizle();                   // LCD temizlendi.
      lcdBekle(300);                  // Bir süre daha beklendi. Bu süre, bize yazının yanıp sönmesini sağlayacak.
    }
}
//------------------------------------------------------------------------------

Bu fonksiyon sonucu gösteren fonksiyonumuz. Oyuncunun skoru, LCD üzerinde beş kez yanıp sönerek gösteriliyor. Eğer (yaklaşık) 100 ms’nin altında basıldıysa, “TEBRIKLER! KAZANDINIZ” yazısı LCD’de yine beş kez yanıp sönerek gösteriliyor.

// Kesmeler
#pragma vector = PORT1_VECTOR         // Buton kesmesi

__interrupt void butonKesmesi(void)
{
  dongudenCik = 1;                    // Mevcut döngüden çıkılacak.
  P1IFG_bit.P1IFG_3 = 0;              // Kesme bayrağı temizlendi.
}

#pragma vector = TIMERA0_VECTOR       // Timer kesmesi

__interrupt void timerKesmesi(void)
{
  tarDegeri++;                        // Her 1ms'de tarDegeri değişkeni bir artacak.
}
//------------------------------------------------------------------------------

Kodun son kısmı ise kesme altprogramları. Port1’den gelen buton kesmesi, ve bu kesmenin içinde yapılan dongudenCik değişkeninin “1” yapılması. Daha sonrasında ise kesmeden çıkabilmesi için P1.3 ün kesme bayrağı sıfırlanıyor.

Timer kesmesi ise her 1 ms’de bir geliyor, ve kesme altprogramında tarDegeri değişkeni bir arttırılıyor.

Devrenin tamamlanmış halinden birkaç görüntü:

LCD takılmadan

LCD ile

 

 

Son olarak devrenin çalışmasından bir video ve dosyaları indirebileceğiniz bir linkle yazıyı bitirelim.

Devrenin IAR proje dosyalarını, LCD için kullandığım kütüphane dosyasını, Proteus dosyalarını ve PCB çizimlerini http://berkbaykal.com/upload/msp430-refleks.rar adresinden indirebilirsiniz. Not: ISIS simülasyonu düzgün çalışmıyor, ama videodan da göreceğiniz gibi gerçek hayatta sorunsuz çalışıyor.

İyi çalışmalar…

Share
  1. merhabalar.ben tam olarak bu refleks ölçerin mantığını anlamdım.final sınavı için uygulama yapmamız gerekiyor.final ödevi için bu programı yapmak istiyorum. sizin prograınızı compile ettim .baştaki lcdfonksiyonlar.h ta cannot open source lcdfonciyonlar hatası verdi.neden olduğunu anlamadım.yardımcı olabilirmisiniz

    • Olayın mantığı oldukça basit. Geri sayımdan sonra timer çalışmaya başlıyor. Butona basıldığında da duruyor. Arada geçen süre (timer kaça kadar saydıysa) LCD’de gösteriliyor. Verdiği hatanın muhtemel sebebi, main.c dosyanızın olduğu yerde lcdFonksiyonlar.h dosyasının olmaması. Eğer yazının sonundaki linkten projeye ait tüm dosyaları indirip denerseniz sorun kalmayacağını düşünüyorum. Kolay gelsin…

  2. merhabalar Berk Baykal öncelikle bu işlerle ilgilenen arkadaşlara yardımcı olduğunuz için diyer arkadaşların adına teşekkür ediyorum.Bu uygulamayı bende final ödevim için yapmak istiyorum.Fakat benim MSP430g2211 launchpad ile yapmam gerekiyor.Nasıl yapılacağımı bilmiyorum.bana bağlantı şemasını yapabilirmisiniz? çok acil lazım olduğundan cevabınızı bekliyorum. ❗

    • Merhaba,
      Bu proje için MSP430G2211 kullanacaksınız yukarıdaki şemada hiçbir değişiklik yapmanıza gerek yok. Kodlar da aynı şekilde sorunsuz çalışacaktır diye düşünüyorum. Ancak denetleyiciyi launchpadin üzerinde kullanacaksanız şemada sol üstteki 7805 ve L78L33’lü regülatör kısmını yapmanıza gerek yok. Şemada 3.3V yazan yere launchpad’teki Vcc pinini, 5V yazan yere de launchpad’teki TP1 (USB soketinin sağ altında.) pinini bağlarsanız devre çalışacaktır diye düşünüyorum.
      Kolay gelsin…

  3. msp430G2— ile refleks ölçer yapmak istiyorum bana yardımcı olurmusunuz.

  4. İSMAİL GÖKÇE

    sayın Berk bey ben yukardaki kodları aynen alarak ıar da kodları derlemeye çalıştım.fakat yukarda sertanın söylediği gibi o sorun bende oldu .tüm dosyaları indirdim.lütfen daha detaylı yardımcı olmanızı bekliyorum.ben devre malzemelerini aldım.takıştırmaya başladım.lütfen işim yarım kalmasın.mikro ödevi için yapıyorum.süremde az kaldı.birkaçgün içinde bitecek. ALLAH rızası için yerdmı olmanızı bekliyorum.kolay gelsın.iyi çalışmalar.

    • Merhaba,
      Sertan Bey ile aynı sorunu yaşıyorsanız onun yorumuna yazdığım cevaptan faydalanabilirsiniz. Blogda yazdığım yazılar birebir alınıp proje ödevi olarak teslim edilsin diye yazdığım yazılar değil. Anlatımdan ve fotoğraflardan görüleceği üzere projeler denenip çalıştığı görüldükten sonra makaleleştiriliyor. Benden detaylı yardım istiyorsanız net olarak takıldığınız yeri sorunuzda belirtmelisiniz. O zaman yardım edebileceğim bir konu ise yardımcı olmaya çalışırım. Aksi takdirde sizin proje ödeviniz beni ilgilendirmiyor.

  5. İSMAİL GÖKÇE

    bide, kütüphane dosyalrını nasıl kullancam

    • Kütüphane dosyalarını ana program dosyanıza include ederek, bu kütüphanedeki fonksiyonları kullanmalısınız. Temel kullanım şekli budur.

  6. iyi günler Berk bey;
    lcdfonksiyonlar.h sorununu hallettim dediğiniz gibi yaptım,aşağıda messages kısmında lcdfonksiyonlar.h yazıyodu o gitti,şimdi:

    Error[Pe136]: struct “” has no field “P2OUT_7” G:\mikroislemcilerProje\lcdFonksiyonlar.h 30

    Error[Pe136]: struct “” has no field “P2OUT_7” G:\mikroislemcilerProje\lcdFonksiyonlar.h 31

    Error[Pe136]: struct “” has no field “P2OUT_6” G:\mikroislemcilerProje\lcdFonksiyonlar.h 37

    Error[Pe136]: struct “” has no field “P2OUT_6” G:\mikroislemcilerProje\lcdFonksiyonlar.h 39

    Error[Pe134]: expected a field name G:\mikroislemcilerProje\main.c 21

    Error[Pe134]: expected a field name G:\mikroislemcilerProje\main.c 22

    Error[Pe134]: expected a field name G:\mikroislemcilerProje\main.c 23

    Error[Pe134]: expected a field name G:\mikroislemcilerProje\main.c 170
    8 tane hata veriyo
    bu sorunlar var.ben msp nin yabancısıyım.yeni sayılırım.rahatsız ediyosam kusura bakmayın.rica etsem bu projenizin yazılım kodlarınızı tekrar derlermisiniz,hata veriyosa hataları bulup düzeltirmisiniz,ben sizin yaptığınız projeyi aynen götürmeyecem, kodlarda biraz değişiklik yapcam.eğer bildiğiniz varsa ,paylaşırsanız sevinirim.iyi günler.iyi çalışmalar.başarılar çalışmarınızda.

    • Bu tarz bir sorunu sıkça duyuyorum. Sanırım IAR’ın farklı versiyonlarında benim kullandığım structlar yer almıyor. Bende sorun olmadan derleniyor kodlar. Cevap bayağı geç oldu ama kusura bakmayın. 🙂
      Kolay gelsin…

  7. Ömer Mumcuoğlu

    merhaba berk,
    öncelikle bu paylaşımlar çok yararlı bunun için teşekkür ederim. sorum şu ben msp430 kodlamak için code composer studio kullanıyorum orada bu kütüphaneleri nasıl yerleştireceğim ve kodlarda skntı çıkarmı?

    • Merhaba,

      Hiç CCS kullanmadım. IAR’da olduğu gibi proje oluşturulduğunda kütüphaneleri vs. otomatik olarak eklediğini tahmin ediyorum. Kütüphane isimleri farklılık gösterebilir, emin değilim.

  8. L78L33 REGÜLATÖRÜ BULAMADIM ONUN YERİNE BAŞKA BİŞEY KULLANABİLİRMİYM
    YARDIMCI OLURSANIZ SEWİNİRİM
    ŞİMDİDEN TEŞEKKÜRLER

    • 3.5V seviyesine yakın bir çıkış veren herhangi bir regülatörü kullanabilirsiniz diye düşünüyorum. Başka bir projemde UA78RM33 kullandım, bir sorun yaşamadım. Şu adresten temin edebilirsiniz.

  9. Selim Güngör

    Merhaba Berk bey aşağıdaki hataları alıyorum . Nasıl giderebilirim bu hataları?
    Bir arkadaş daha bahsetiş bundan IAR ın farklı versiyonu demişsiniz . Nasıl düzeltebiliriz?
    Kolay gelsin…

    Error[Pe136]: struct “” has no field “P2OUT_7″ G:\mikroislemcilerProje\lcdFonksiyonlar.h 30
    Error[Pe136]: struct “” has no field “P2OUT_7″ G:\mikroislemcilerProje\lcdFonksiyonlar.h 31
    Error[Pe136]: struct “” has no field “P2OUT_6″ G:\mikroislemcilerProje\lcdFonksiyonlar.h 37
    Error[Pe136]: struct “” has no field “P2OUT_6″ G:\mikroislemcilerProje\lcdFonksiyonlar.h 39
    Error[Pe134]: expected a field name G:\mikroislemcilerProje\main.c 21
    Error[Pe134]: expected a field name G:\mikroislemcilerProje\main.c 22
    Error[Pe134]: expected a field name G:\mikroislemcilerProje\main.c 23
    Error[Pe134]: expected a field name G:\mikroislemcilerProje\main.c 170
    8 tane hata veriyo

    • Bu hata veren structın IAR’ın yeni sürümündeki kullanım şekli PxOUT_bit.Py şeklinde idi yanlış hatırlamıyorsam. x: port, y: pin

  10. Hayri Akyurtlu

    Merhabalar,
    Öncelikle MSP430’a yeniyim diyerek başlayayım. Bu projede yaptığınız işlemin sadece refleks ölçer yerine basit bir voltaj kaynağı koyarak, değerinin LCD’de gözükmesini istiyorum. Bunun için ADC’den bilgi alan devrelere de baktım sitedeki, ancak LCD’de nasıl bu bilgiyi yazdıracağımı bulamadım. Yardım ederseniz sevinirim. Kolay gelsin.

  11. MRB BEN REFLEK ÖLÇÜM DEVRESİNİ DÖNEM ÖDEVİ ALIYORUM L78L33 REGÜLATÖR BULAMADIK NERDEN BULABİLİRİZ VEYE UYUMLU OLARAK YERİNE NE KULLANABİLİRİZ ÇOK ACİL CEVAP İLGİNİZ İÇİN TESEKKÜRLER…

  12. dosyanızın içinde io430.h ile intrinsics.h dosyaları yok o yüzden yukarıdaki hatalar oluyor…

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>