LPC1769 led yakma, ama nasıl ?

Başlatan zxcxz, 25 Ekim 2011, 13:33:17

zxcxz

LPC 1769'u incelemeye başladık. C programlama diline hakim olmadığım için bir soruda takıldım.

Resimde bulunan 2 ledi yakmamız istendi. LPCXpresso'da bulunan LPCX176x_cmsis2_systick örneğini inceledim. Lakin pek bir şey anlamadım. Yardımcı olabilir misiniz acaba ? Teşekkürler..


yamak

#1
İlk olarak SystemInit(); fonksiyonunu main içerisinde çağırın. Daha sonra LPC_GPIO0->FIOSET=20;(2^2+2^4) yazın sonra da işlemciyi de while ya da for ile sonsuz döngüye sokun. Tabi SystemInit(); fonksiyonu için system_lpc17xx kütüphanesini projeye dahil etmeniz gerekiyo.
örnek:
#include <lpc17xx.h>
int main(void)
{
    SystemInit(); //işlemcini clock ayarları yapılıyo
    LPC_GPIO0->FIODIR=20; //p0.2 ve p0.4 pinleri çıkış yapılıyo
    LPC_GPIO0->FIOSET=20; //p0.2 ve p0.4 pinleri set ediliyo.
    while(1)//sonsuz döngü
    {
     }
}

fatihinanc

Alıntı yapılan: yamak - 25 Ekim 2011, 14:51:38
LPC_GPIO0->FIOSET=20;(2^2+2^4)

LPC_GPIO0 ->FIOSET = 4;     // 2^2
LPC_GPIO0 ->FIOCLR = 16;  // 2^4


olması gerekiyor. LED'lerden biri ters çünkü ;)
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

zxcxz

Cevaplarınız için teşekkür ederim. Kod aşağıdaki şekilde mi olacak o zaman ? (Henüz kart elime ulaşmadı, kodu test edemiyorum)

#include <lpc17xx.h>
int main(void)
{
    SystemInit(); //işlemcini clock ayarları yapılıyo
    LPC_GPIO0->FIODIR=20; //p0.2 ve p0.4 pinleri çıkış yapılıyo
    LPC_GPIO0->FIOSET=4;
    LPC_GPIO0->FIOCLR=16;
    while(1)//sonsuz döngü
    {
     }
}


LPC_GPIO1->FIOSET = 0x00000001;


LPC_GPIO1->FIOCLR = 0x00000001;


Şu konudaki örneğe baktım. Üstteki ilk kod 1. biti 1, ikinci kod ise 1. biti 0 mı yapıyor ? FIOSET ve FIOCLR arasındaki fark bu mu ? Tam anlayamadım :)

fatihinanc

Alıntı yapılan: zxcxz - 25 Ekim 2011, 17:46:35

LPC_GPIO1->FIOSET = 0x00000001;


LPC_GPIO1->FIOCLR = 0x00000001;

Üstteki ilk kod 1. biti 1, ikinci kod ise 1. biti 0 mı yapıyor ? FIOSET ve FIOCLR arasındaki fark bu mu ? Tam anlayamadım :)

İlk kod GPIO0.2 pini set ediyor.
İkinci kod ise GPIO0.4 pinini temizliyor.

ARM Cortex M3'lerde 32 bitlik GPIO saklayıcıları -eğer varsa- 32 bitlik GPIO lara karşılık gelir. Yani 32 adet giriş/çıkış ve buna karşılık 32 bit.
Bu pinlerden diyelim ki 5. pini 1 yapmak istiyorsun. O zaman bu 5. bite karşılık gelmektedir. Dolayısiyle 0b10000 = 2^5 = 32 yapar.
2. pini set etmek istersen 0b100 = 2^2 = 4 yapar.
Bu değeri de GPIO bitlerini set etmek istediğin için doğrudan FIOSET'e aktarırısın.

FIOCLR ise pinleri 0 yapmaya yarıyor. Mantığı yukarıdaki ile aynı.

Verilen koda gelirsek;

LPCGPIO->FIOSET = 4;    //0b100 = 2^2 = GPIO0.2 set edildi.
LPCGPIO->FIOCLR = 16; //0b1000 = 2^4 = GPIO0.4 temizlendi.


Bu şekilde 2 LED de yanıyor olarak görünecektir ama pinlerden GPIO0.2 = 1, GPIO0.4 = 0 olacaktır.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)