ARM nedir....?

Başlatan Andromeda, 11 Ekim 2011, 11:40:40

yamak

Dspicler daha cok sinyal isleme gibi konularda kendini gosteriyo 1msps adc hizlari olanlar var ama arm cekirdekli islemcilerde adc hizi bu kadar fazla degil mesela lpc1768 inki 200ksps. Ama cevre birimlerinin zengiligi ve cevre birimleri bircok sekjlde ozellestirebilme bakimindan arm cekirdekli mcu lar daha fazla on plandadir.

buzkırıcı

Alıntı yapılan: yamak - 11 Ekim 2011, 15:33:46
Yukarıdaki iki kod arasındaki farklılıklar kullanılan kütüphaneden kaynaklanıyo.Kütüphanenin içeriğine bakarsanız ne demek istediğimi anlarsınız.Mesela LPC17xx.h kütühanesinde her çevrebirimini ait registerlar bir struct içinde toplanmış.Mesela gpio portları için konuşursak:
2.portun 3. pinini high yapacaksan LPC_GPIO2->FIOSET=1<<3 deriz 0.portun 4. pinini aktif yapacaksan GPIO0->FIOSET=1<<4; deriz görüldüğü gibi gpıolar LPC_GPIO struct ı içinde toplanmış. Aşağıda daki kodlarda lpc17xx.h kütüphanesi içindeki gpıo struct ına aittir.
typedef struct
{
  union {
    __IO uint32_t FIODIR;
    struct {
      __IO uint16_t FIODIRL;
      __IO uint16_t FIODIRH;
    };
    struct {
      __IO uint8_t  FIODIR0;
      __IO uint8_t  FIODIR1;
      __IO uint8_t  FIODIR2;
      __IO uint8_t  FIODIR3;
    };
  };
  uint32_t RESERVED0[3];
  union {
    __IO uint32_t FIOMASK;
    struct {
      __IO uint16_t FIOMASKL;
      __IO uint16_t FIOMASKH;
    };
    struct {
      __IO uint8_t  FIOMASK0;
      __IO uint8_t  FIOMASK1;
      __IO uint8_t  FIOMASK2;
      __IO uint8_t  FIOMASK3;
    };
  };
  union {
    __IO uint32_t FIOPIN;
    struct {
      __IO uint16_t FIOPINL;
      __IO uint16_t FIOPINH;
    };
    struct {
      __IO uint8_t  FIOPIN0;
      __IO uint8_t  FIOPIN1;
      __IO uint8_t  FIOPIN2;
      __IO uint8_t  FIOPIN3;
    };
  };
  union {
    __IO uint32_t FIOSET;
    struct {
      __IO uint16_t FIOSETL;
      __IO uint16_t FIOSETH;
    };
    struct {
      __IO uint8_t  FIOSET0;
      __IO uint8_t  FIOSET1;
      __IO uint8_t  FIOSET2;
      __IO uint8_t  FIOSET3;
    };
  };
  union {
    __O  uint32_t FIOCLR;
    struct {
      __O  uint16_t FIOCLRL;
      __O  uint16_t FIOCLRH;
    };
    struct {
      __O  uint8_t  FIOCLR0;
      __O  uint8_t  FIOCLR1;
      __O  uint8_t  FIOCLR2;
      __O  uint8_t  FIOCLR3;
    };
  };
} LPC_GPIO_TypeDef;


Peki hocam bu örnekte yazılmış olan "LPC_PINCON->PINSEL4 = ( 0 << 20);"   "LPC_GPIO0->FIODIR=0x000000FF;" buradaki ile aynı işimi görüyor. Ben bu Pınsel4 kısmını anlayamadım. Ben yeni başladım ARm ye ALttaki kodları yorumlamaya çalışıyodum.Biraz yardımcı olurmusunuz?

#include "LPC17xx.H"                    /* LPC17xx definitions                */

volatile unsigned long SysTickCnt;      /* SysTick Counter                    */
  
void SysTick_Handler (void) {           /* SysTick Interrupt Handler (1ms)    */
  SysTickCnt++;
}	  

void Delay (unsigned long tick) {       /* Delay Function                     */
  unsigned long systickcnt;

  systickcnt = SysTickCnt;
  while ((SysTickCnt - systickcnt) < tick);
}

int main (void) {                       // Main Program                       
  SystemInit();
  //SysTick_Config(SystemFrequency/1000 - 1); // Generate interrupt each 1 ms   

	
    LPC_PINCON->PINSEL4 = ( 0 << 20);  // set pin P0.20 as GPIO Pin 0       
	LPC_GPIO0->FIODIR = (1 << 20);     // set pin P0.20 as output (Output = 1, Input = 0)   
	
	    
  
  for (;;) {                            /* Loop forever                       */

	  LPC_GPIO0->FIOPIN |=  (1<< 20);  		 //Turn On  LED - set pin P0.20 to HIGH 
       Delay(100);                       // Delay 500ms                        
        LPC_GPIO0->FIOPIN &= ~(1<< 20);  	 //Turn On  LED - set pin P0.20 to LOW 
         Delay(500);                     // Delay 500ms                        */
  }
}
İmza Atmayı bilmem Parnak Bassam olur mu?

yamak

Bu kodlar çalışıyo mu? GPIO0 ın 20. pinine ait konfigrasyonlar pinsel1 den yapılıyo fakat yukarıda pinsel4 kullanılmış bir de "SysTick_Config(SystemFrequency/1000 - 1);" yazan satır yorum haline getirilmiş bu kod çalışmazsa delay de çalışmaz. Şimdi gelelim asıl sorunuza FIODIR ilgili porta ait istenilen pinlerİ çıkış yapmaya yarıyo.Mesela gpıo0 ın 6. pinini çıkış yapmak istersen LPC_GPIO0->FIOPIN=1<<6; yazarsın.PINSEL ile ilgili pinin hangi çevre birimi tarafından kullanılması gerektiğini belirliyosun. Mesela GPIO0.20 için örnek verecek olursak. LPC_PINCON->PINSEL1|=0<<8|0<<9; yapılırsa normal giriş çıkış portu olarak kullanılır yani gpio. Eğer LPC_PINCON->PINSEL1|=1<<8|1<<9; dersek i2c nin clock giriş çıkışı olarak  olarak kullanmış oluruz.

buzkırıcı

Hocam bu kod çalışıyor :) Keil derliyo lpc1769 ledi yakıp söndürüyor. LPC_PINCON->PINSEL1|=0<<8|0<<9; buradaki kodun ne olduğunu anladım ama 0<<8 0<<9 buradaki mantığı nedir?
İmza Atmayı bilmem Parnak Bassam olur mu?

yamak

#19
Bit kaydırma işlemi yapılıyo orda. Mesela 1<<2=4 dür yani 1 i 2 bit sola kaydırdım.Bir de bişey soracam  "SysTick_Config(SystemFrequency/1000 - 1);" bu komutu neden yorum haline getirdin. Yani başına // karakterlerin neden koydun.

buzkırıcı

hocam aslında o komut yorum halinde değildi ilk derlediğimde .hex i başarılı şekilde oluşturmuştu. SystemFrequency de keil hata veriyodu yaklaşık 1 hafta önce bende yorum haline getirdim program derledi ama kite atıp denemedim. Hala aynı problem mevcut .hex i çıkarmıyor.

https://www.picproje.org/index.php/topic,35833.msg255923.html#msg255923 burada yazmış olduğunuz SystemCoreClock i değiştirdim ve .\Flash\Blinky.axf: Error: L6218E: Undefined symbol SystemCoreClock (referred from blinky.o). bu hatayı verdi. Teşekkürler.
İmza Atmayı bilmem Parnak Bassam olur mu?

buzkırıcı

#include <LPC17xx.h>
#include "system_LPC17xx.c"
volatile unsigned long SysTickCnt;      /* SysTick Counter                    */
  
void SysTick_Handler (void) {           /* SysTick Interrupt Handler (1ms)    */
  SysTickCnt++;
}	  

void Delay (unsigned long tick) {       /* Delay Function                     */
  unsigned long systickcnt;

  systickcnt = SysTickCnt;
  while ((SysTickCnt - systickcnt) < tick);
}	
int main(void)
{  
 SystemInit();
  
	   SysTick_Config(SystemCoreClock/1000 - 1); // Generate interrupt each 1 ms   
  


    LPC_PINCON->PINSEL0 = 0 << 8 | 0 << 9  |0 << 10 |0 << 11 |0 << 12 |0 << 13 |0 << 14 | 0 << 15 | 0 << 16 |0 << 17 |0 << 18 |0 << 19;  // Bacakları Gpıo olarak ayarladık      
	LPC_GPIO0->FIODIR = 1 << 4 | 1 << 5 |1 << 6 |1 << 7 |1 << 8 |1 << 9;      // set pin P0.20 as output (Output = 1, Input = 0)   
	 
  for (;;) {                                            

	LPC_GPIO0->FIOSET =0x00000010;  		
       Delay(100);                                              
        LPC_GPIO0->FIOCLR =0x00000010;  	
         
	LPC_GPIO0->FIOSET =0x00000020;  		
       Delay(100);                                             
        LPC_GPIO0->FIOCLR =0x00000020;  	
         
		 LPC_GPIO0->FIOSET =0x00000040;  		
       Delay(100);                                              
        LPC_GPIO0->FIOCLR =0x00000040;  	
         
		 LPC_GPIO0->FIOSET =0x00000080;  		
       Delay(100);                                              
        LPC_GPIO0->FIOCLR =0x00000080;  	
         
		 LPC_GPIO0->FIOSET =0x00000100;  		
       Delay(100);                                              
        LPC_GPIO0->FIOCLR =0x00000100;  	
        
		 LPC_GPIO0->FIOSET =0x00000200;  		
       Delay(100);                                              
        LPC_GPIO0->FIOCLR =0x00000200;                                              
  }
	   
}


Ben bunu yazdım gecikme kısmını da örneklerden aldım. program çalışıyor. ama set ve clr ederken çok meşakketli oldu her pin içinhexleri buldum falan daha kısa bir yolu yokmudur?  Gecikme kısmını SysTick gibi şeyler olmadan nasıl yazarız? Bu arada SysTick ne demek?
İmza Atmayı bilmem Parnak Bassam olur mu?

yamak

SysTick timer benzeri bir çevre birimi. Ayarlarmaları yaptığında o ayarlardaki zamana göre kesme oluşturur. Ayrıca pin değerlerini bulmakta zorlanıyosun windows calculator ın programcı modunu kullanabilirsin.

buzkırıcı

LPC_GPIO0->FIOPIN |=  (1<< 20);

örnekte böle yapmış, ledi yakıyor
LPC_GPIO0->FIOPIN &= ~(1<< 20);

Buda ledi söndürüyor. Ben tek tek bitleri buldum hex. çevirdim Örnekteki ledi yakıp söndürme mantığı nedir?
İmza Atmayı bilmem Parnak Bassam olur mu?

JKramer

| --> VEYA  --> + (Toplama)

0 | 0 -->  0 VEYA 0 --> 0+0 = 0
0 | 1 -->  0 VEYA 1 --> 0+1 = 1
1 | 0 -->  1 VEYA 0 --> 1+0 = 1
1 | 1 -->  1 VEYA 1 --> 1+1 = 1

& --> VE --> x (Çarpma)

0 & 0 -->  0 VE 0 --> 0x0 = 0
0 & 1 -->  0 VE 1 --> 0x1 = 0
1 & 0 -->  1 VE 0 --> 1x0 = 0
1 & 1 -->  1 VE 1 --> 1x1 = 1

1<<20 : 1'i 20 kez sola kaydır.

LPC_GPIO0->FIOPIN |=  (1<< 20);
ile
LPC_GPIO0->FIOPIN = (LPC_GPIO0->FIOPIN) | (1<< 20);
aynı şey.

buzkırıcı

Peki
LPC_GPIO0->FIOPIN &= 1<< 20);
buradaki "~" işaretide terslememi yapıyor?
İmza Atmayı bilmem Parnak Bassam olur mu?

haydarpasamikro

~ operatörü bit tersleme yapar. Mesela:
x sayısı 0000 0001 olsun.
~x ise  1111 1110 olur.

~(1<<20) ise 1 uzuntamsayı olarak değerlendirilip 20 bit sola kaydırılır ve bu uzuntamsayı bitleri terslenir.Yani

(1<<20) işlemi
0000 0000 0001 0000 0000 0000 0000 0000
ardından ~ işlemi
1111 1111 1110 1111 1111 1111 1111 1111

sonra &= işlemi ile AND yapılarak sadece 20.bit sıfırlanmış olur. Diğer bitler konumları korunmuş olur.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

haydarpasamikro

x sayısı 0000 0001 olsun.
~x ise  1111 1110 olur.

~(1<<20) ise 1 uzuntamsayı olarak değerlendirilip 20 bit sola kaydırılır ve bu uzuntamsayı bitleri terslenir.Yani

(1<<20) işlemi
0000 0000 0001 0000 0000 0000 0000 0000
ardından ~ işlemi
1111 1111 1110 1111 1111 1111 1111 1111

sonra &= işlemi ile AND yapılarak sadece 20.bit sıfırlanmış olur. Diğer bitler konumları korunmuş olur.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

yusufburak

afedersiniz :S ARM ile FPGA arasındaki ilişki nedir acaba ?
Öğretici aranıyor :)

berat23

Alıntı yapılan: yusufburak - 12 Mart 2013, 15:16:03
afedersiniz :S ARM ile FPGA arasındaki ilişki nedir acaba ?

yok. sadece içinde arm olan fpga ler var.