KEIL'de bit-bit çalışmak.

Başlatan LukeSkywalker, 08 Şubat 2011, 19:20:10

LukeSkywalker

KEIL ile ARM7 çekirdekli LPC210x işlemciler için çalışmaya başladım. Fakat bir registerın herhangi bir bitine ulaşmak istediğimde mikroC de yaptığım gibi ulaşamıyorum. Mesela SCS.GPIO0M dediğim zaman hata veriyor. Fakat mikroC'de direkt olarak ADCON0.F2 gibi ulaşabiliyorduk registerlara. Keil de böyle bir imkan yok mu?

mufitsozen

Alıntı yapılan: maytere - 08 Şubat 2011, 19:20:10
KEIL ile ARM7 çekirdekli LPC210x işlemciler için çalışmaya başladım. Fakat bir registerın herhangi bir bitine ulaşmak istediğimde mikroC de yaptığım gibi ulaşamıyorum. Mesela SCS.GPIO0M dediğim zaman hata veriyor. Fakat mikroC'de direkt olarak ADCON0.F2 gibi ulaşabiliyorduk registerlara. Keil de böyle bir imkan yok mu?

microc de buyuk ihtimalle include dosyalarindaki bir tanimdan dolayi kullanabiliyordunuz.

herhangi bir alana, bit-bit erismek icin standard c dilinde bit-fields diye bir bahis vardir. Bu her nekadar tam olarak belirli bir standard degilsede (her computer icin kucuk farklar olabilir) ARM icin sizde bir tanim yapip, 8, 16 yada 32 bit alanlara erisim sagliyabilirsiniz.

order of bit-fields bahsinde ARM icin kullanilan bit siralamasi aciklanmakta. Ama isterseniz sizde kucuk bir deneme programi yazarak bu bit siralanmasini kontrol edebilirsiniz or:

typedef struct
            {
             unsigned int bit_0 : 1;        // Byte 1, Bit 0
             unsigned int bit_1 : 1;        // Byte 1, Bit 1
             unsigned int bit_2 : 1;        // Byte 1, Bit 2
             unsigned int bit_3 : 1;        // Byte 1, Bit 3
             unsigned int bit_4 : 1;        // Byte 1, Bit 4
             unsigned int bit_5 : 1;        // Byte 1, Bit 5
             unsigned int bit_6 : 1;        // Byte 1, Bit 6
             unsigned int bit_7 : 1;        // Byte 1, Bit 7
             unsigned int bit_8 : 1;        // Byte 0, Bit 0
             unsigned int bit_9 : 1;        // Byte 0, Bit 1
             unsigned int bit_10: 1;        // Byte 0, Bit 2
             unsigned int bit_11: 1;        // Byte 0, Bit 3
             unsigned int bit_12: 1;        // Byte 0, Bit 4
            unsigned int bit_13: 1;        // Byte 0, Bit 5
            unsigned int bit_14: 1;        // Byte 0, Bit 6
             unsigned int bit_15: 1;        // Byte 0, Bit 7
           }bit_st;
 
           bit_st x;

bilahare x.bit_12 diyerek ornegin 12inci bite erisebilirsiniz.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

LukeSkywalker

#2
Hocam eyvallah sağol. Biliyorum SRC register'ı nın diğer bitleri okuma yazmaya kapalı fakat ben onu örnek olarak verdim. Sizin verdiğiniz örnekteki gibi yapacak olursak her register için bu tanımlamaları yapmak zorunda kalacağız zannedersem. MikroC'de adamlar tek tek uğraşmış tüm PIC'lerin registerlarını tanıtmak için o zaman. Adamlar derleyiciden kazandığı paraları hak ediyor, biz ücretsiz kullanıyoruz o ayrı..

mufitsozen

Alıntı yapılan: maytere - 09 Şubat 2011, 00:09:47
Hocam eyvallah sağol. Biliyorum SRC register'ı nın diğer bitleri okuma yazmaya kapalı fakat ben onu örnek olarak verdim. Sizin verdiğiniz örnekteki gibi yapacak olursak her register için bu tanımlamaları yapmak zorunda kalacağız zannedersem. MikroC'de adamlar tek tek uğraşmış tüm PIC'lerin registerlarını tanıtmak için o zaman. Adamlar derleyiciden kazandığı paraları hak ediyor, biz ücretsiz kullanıyoruz o ayrı..

Hazir siz bu tanimlari kullanmaya baslamisken, mesela bir LPC210x.h dosyasi yapsaniz ve bunlari tanimlasaniz, forumada ne guzel bir katki olurdu.

her register diyorsunuz ama, ornegin 30 register varsa bir-iki gunde yapilirdi. Cokda makbule gecerdi (ben KEIL ile ARM7 çekirdekli LPC210x kullanmiyorum ama kullananlar icin)


Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

LukeSkywalker

Hocam tamam haklısınızda yüzlerce mikrodenetleyici var PIC ailesinde. Adamlar hepsi için ayrı ayrı yapmışlar bu işi.

mufitsozen

Alıntı yapılan: maytere - 09 Şubat 2011, 13:07:13
Hocam tamam haklısınızda yüzlerce mikrodenetleyici var PIC ailesinde. Adamlar hepsi için ayrı ayrı yapmışlar bu işi.

Hocam sende haklisin ama, ben sana hepsi icin degil, sadece kullandigin icin yapsan demistim.  ;)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

LukeSkywalker

Zaten başladım uğraşmaya. Ama bitecek gibi durmuyor pek işlerden dolayı...

LukeSkywalker

Bir de tabi 32 bit registerların çoğunluğu ve her bitin ismini yazmaya çalışıyorum...

nonstradam

Merhaba;
bir register a hem bit hemde integer olarak erişmek istiyorum. yukarıda sadece bit erişiminden bahsedilmiş.
mesela değişken.bit0 dediğimde 0. bitine değişken.word dediğimde bu bitlerden oluşan register ın tamamına erişmek istiyorum nasıl yaparım...

nonstradam

typedef union
{
  __IO uint16_t all;
  	struct {
  		__IO uint16_t b0:1;	
  		__IO uint16_t b1:1;	
  		__IO uint16_t b2:1;	
  		__IO uint16_t b3:1;	
  		__IO uint16_t b4:1;	
  		__IO uint16_t b5:1;	
  		__IO uint16_t b6:1;	
  		__IO uint16_t b7:1;	
  		__IO uint16_t b8:1;	
  		__IO uint16_t b9:1;	
  		__IO uint16_t b10:1;	
  		__IO uint16_t b11:1;	
  		__IO uint16_t b12:1;	
  		__IO uint16_t b13:1;	
  		__IO uint16_t b14:1;	
  		__IO uint16_t b15:1;	
    }bit;
}T_uint16_BitType;

T_uint16_BitType led_buff;


led_buff.all=0xFFFF dediğimde tamamına erişmiş oluyorum.
led_buff.bit.b0 = 0 dediğimde sadece 0. biti sıfır yapmış oluyorum.
ilginize teşekkürler iyi çalışmalar...


aykerme

değişkenin bellibir bitine ulaşmak için bütün register ları için tanımlamalar yapacağınıza
13. biti set etmek için,
degisken |= (1 << 13);
14. biti reset etmek için
degisken &= ~(1 << 14);

yapmanız daha az zamanınızı alacaktır.

z

Interrupt rutinlerinde de sözkonusu portlara erişim yapılıyorsa, proje kritik ise,  yazılımsal manüplasyon yapacaksan bu komutun hemen üstüne intterrupt disable ve hemen altına da interrupt enable yapan komutları eklemek zorundasın.

Aksi takdirde bit banding donanımından yararlanmak zorundasın.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

nonstradam

Alıntı yapılan: z - 12 Temmuz 2012, 11:56:51
Interrupt rutinlerinde de sözkonusu portlara erişim yapılıyorsa, proje kritik ise,  yazılımsal manüplasyon yapacaksan bu komutun hemen üstüne intterrupt disable ve hemen altına da interrupt enable yapan komutları eklemek zorundasın.

Aksi takdirde bit banding donanımından yararlanmak zorundasın.


Hocam söylemek istediğini tam olarak anlayamadım. interrupt ta kullanıyorum bu değişkenleri. bit banding dediğiniz donanım nedir.

z

Her ne kadar çipinizi belirtmemiş olsanızda;

Bitbanding'in ARM CM3 işlemci üreten tüm firmaların standart donanımı olup olmadığını bilmiyorum. Çipinizde  var olup olmadığını dokumanlarına bakarak anlayabilirsiniz.

Forumda bitbanding  üzerine uzun uzun tartışmıştık. 

Bit banding, kısaca Bellek - I/O alanı - Çevre Birimi gibi alanlarda herhangi bir bitin değerini not and-or gibi lojik işlemlere gerek kalmadan nokta atışı ile tek hamlede ve interrupt ile yarıda kesilme korkusu olmadan (atomik) değiştirmeye yada okumaya imkan veren donanımdır.

https://www.picproje.org/index.php/topic,35794.msg259148.html#msg259148

Bana e^st de diyebilirsiniz.   www.cncdesigner.com