Uzun süredir ARM çalışmalarıma bitirme tezi dolayısıyla ara vermiş olsam da ne zamandır aklımda olan bir programı bugün tamamlayabildim: ARM Calculator.
İlgilenenlerin bildiği üzere ARM konusunda kullanıcılara ilk başta en karmaşık gelen ünitelerden biri saat kaynağı seçim bloğudur. LPC1768‘i baz alarak söylersek, bu birim gerek dahili osilatörden gerek dışarıdan beslenecek yapıda dizayn edilmiştir ve bazı bloklar gerekli aralıklarda frekanslarla beslenmeleri gerekmektedir. Aksi halde PLL’ler kitlenmez ve bunun sonucu olarak cihazımız istediğimiz gibi çalışmaz.
Ben de bu konu hakkında ilk çalıştığımda zorlansam da daha sonra Keil‘ın startup.s ve startup.c dosyalarına ve ilgili mikrodenetleyicinin datasheet’ine bakarak bu konuda çok fazla bilgi öğrendim. Hatta bu noktada Keil’da nasıl commentler kullanarak kullanıcı arayüzüne benzer kütüphaneler yazılabildiğini de gördüm.
Yalnız her ne kadar Keil bana hesaplamalarda kolaylık sağlasa da bunu görsel olarak ve debug yapmadan hesaplamak istedim ve sonuç olarak aşağıda ekran görüntüsünü görebileceğiniz programı yazdım.
Yukarıdaki resimde görebileceğiniz üzere başlangıç değerlerini CCLK=12MHz ve USBCLK=48MHz olarak ayarladım. Olası yapılan hatalara karşı da uyarı notlarını programa ekledim.
Tüm ayarları yaptıktan sonra hazır yazılan fonksiyon kodunu kullanmak için ise “Show PLL Function Code” butonuna basmanız yeterli olacaktır. Bunun sonucunda aşağıda görülebilecek kod öbeği ekrana yansıyacaktır.
// FxDev.org // PLL Function for LPC17xx #define SCS_Val 0x20 #define CLKSRCSEL_Val 0x1 #define PLL0_SETUP 0x1 #define PLL0CFG_Val 0xb #define CCLKCFG_Val 0x17 #define PLL1_SETUP 0x0 #define PLL1CFG_Val 0x0 #define USBCLKCFG_Val 0x5 void SystemInit (void) { LPC_SC->SCS = SCS_Val; if (SCS_Val & (1 < < 5)) { while ((LPC_SC->SCS & (1< <6)) == 0); } LPC_SC->CCLKCFG = CCLKCFG_Val; if (PLL0_SETUP) { LPC_SC->CLKSRCSEL = CLKSRCSEL_Val; LPC_SC->PLL0CFG = PLL0CFG_Val; LPC_SC->PLL0CON = 0x01; LPC_SC->PLL0FEED = 0xAA; LPC_SC->PLL0FEED = 0x55; while (!(LPC_SC->PLL0STAT & (1< <26))); LPC_SC->PLL0CON = 0x03; LPC_SC->PLL0FEED = 0xAA; LPC_SC->PLL0FEED = 0x55; } if (PLL1_SETUP) { LPC_SC->PLL1CFG = PLL1CFG_Val; LPC_SC->PLL1CON = 0x01; LPC_SC->PLL1FEED = 0xAA; LPC_SC->PLL1FEED = 0x55; while (!(LPC_SC->PLL1STAT & (1< <10))); LPC_SC->PLL1CON = 0x03; LPC_SC->PLL1FEED = 0xAA; LPC_SC->PLL1FEED = 0x55; } else LPC_SC->USBCLKCFG = USBCLKCFG_Val; }
Son olarak yapmanız gereken ise main fonksiyonunun ilk satırında ekrana yansıyan yukarıdaki fonksiyonu bir kez çağırmak olacaktır. Ayrıca daha önceden yazdığım PINSEL ve System Timer Tick sekmelerinin de yararlı olacağı ve işlerinizi kolaylaştıracağı kanısındayım.
Projeye ait tüm kodları ve programı
Programların çalışabilmesi için sisteminizde Microsoft .NET Framework kurulu olması gerekmektedir. Microsoft .NET Framework kurulum dosyasına buradan ulaşabilirsiniz. Ayrıca programı istediğiniz şekilde paylaşıp, kullanabilir, ayrıca kendiniz sekmeler ekleyip, programı daha fonksiyonel hale getirebilirsiniz.
Herkese iyi çalışmalar, bol ARM’lı günler dilerim.
Projeye ait tüm kodları ve programı;
Şifre-Pass: 320volt.com
Yayım tarihi: 2010/10/13 Etiketler: arm, arm calculator, arm pinsel, arm pll, arm tick timer
Hocam PICSEL Yazmissiniz PINSEL yerine.
*Aslında PIC’i bırakalı çok oldu aklınızda demek ki hala var 🙂
Hemen düzelttim.
PIC’i unutmamak olur mu o ilk göz ağrımız. Bitirme tezimde de elime yapışacak gibi bir hava var.. 🙂
Bakalım..
Bu arada hocam, C# ile de bir kaç ders vermeyi düşünüyor musunuz? Sırf MCU arayüzleri için atıyorum USB, LPT veya RS232 için?
Bir de hangisi daha zor, MCU programlamak mı yoksa C# mı 🙂
Şu anda C# anlatma gibi bir planım yok. Fakat verdiğim kodlar ve örneklerin çoğu MCU’lar için olduğundan biraz C# tabanı ile siz de istediğinizi yapabilirsiniz.
MCU programlamak bence daha zor. Nedenine gelince C# alanınız, sınırlarınız oldukça geniş. Çoğu şey hazır, alıp kullanıyorsunuz. Fakat MCU programlamaya iş gelince bir bitin bile ne kadar kıymetli olduğunu biliyorsunuz. Sınırlarınız çok dar ve daha fazla cambaz olmak zorundasınız.
Fakat hangisinden daha fazla zevk alıyorsunuz diye sorarsanız her ikisinden de..
Elbette bu işi MCU ve C# ile sınırlandırmamak lazım. Elektrik ve güç elektroniği var ki orası da bir okyanus.
Hocam C# ile de bir kaç not hazırlamayı düşünüyor musunuz? En azından PC ile MCU arayüz birimleri icin USB, RS232 veya LPT? Saygilar
Maalesef şimdilik öyle bir planım yok fakat ileride böyle bir uygulama yaparsam bunu açıklayıcı şekilde yapmaya çalışacağım..
Arkadaşım eline sağlık. Önsözden gördüğüm kadarıyla ARM ile uğraşıya başlayanlar için çok yararalı bir program. Ancak link kırık ve programı indiremiyorum.
Linki şu an kontrol ettim ve bir sorun göremedim.
FxDev teşekkür ederim çalışmaların için .
Ben ARM işlemcilere geçmek istiyorum fakat (IARM, KEIL, ECLIPPSE, GrossWork ) veya daha kullanışlı olarak ne kullanmak istediğime karar veremedim. Bana ne tavsiye edersiniz?
Teşekkür ederim.
@Kenan Doğan: Ben Keil’ı tercih ediyorum. Debug olayları Keil’da daha kolay ve anlaşılır. Hele ki JTAG’ınız varsa kesinlikle Keil’ı öneririm. Açık kaynak olaraksa Eclipse iyidir.
Merhaba, programı kullanarak bir pll örneği yaptım. LPCXpresso kit ve 1769 çip ile 12 Mhz de saniyede bir kere ledi yakan bir programı PLL’yi aktif ettikten sonra gözlemek istedim. PLL çıkışında istediğim frekans 120 Mhz olmasına rağmen sırf çalıştığını görmek için çeşitli bir çok frekansta ayarlayarak denedim. Fakat hiç bir değişiklik yok. Sanki hiç pll konfigürasyonu yapılmamış gibi. Main.c dosyasını aşağıda veriyorum.
http://www.upload.gen.tr/d.php/www/bigog81q/main.c.html
Hi thanks for the nice program. Only one susgestion, the posibility to enter kHz values manually. I want to calculate for 32.000Hz RTC_CLK instead of 32.768Hz but is not possible, only MHz can be used manually.