STM32F4 for İçerisinde Tanımlanan Değerin Tanımlanmadı Sorunu

Başlatan yagizhanyakali, 12 Kasım 2016, 10:49:25

yagizhanyakali

Merhabalar;

Ben bir program üzerinde çalışıyordum ve başlıkta yazdığım hata ile karşılaştım. İç içe iki for döngüsü oluşturdum. for döngülerinin i ve j değişkenlerini for döngüsü içerisinde int olarak tanımladım. Değişkenleri for döngüsünde if içerisinde yazdığım anda;

main.c(95): error:  #20: identifier "j" is undefined ve
main.c(92): error:  #20: identifier "i" is undefined

hatalarını alıyorum. Bu defa çözüm için i ve j'yi global değişken olarak tanımladım hata vermedi fakat program düzgün çalışmadı. Yazdığım kodu aşağıda sizinle paylaşıyorum yardım ederseniz çok sevinirim iyi günler...

for(int i = 0; i<=1; i++)
    {
   
    for(int j = 0; j<=4; j++)
    {
    if(j==0)
      {
        GPIOA->ODR=0x02;
        GPIOD->ODR = cikis[port_d];
        Delay(5);
      }

      if(j==1)
      {
        GPIOA->ODR=0x04;
        GPIOD->ODR = cikis[port_c];
        Delay(5);
      }
      if(j==2)
      {
        GPIOA->ODR=0x08;
        GPIOD->ODR = cikis[port_b];
        Delay(5);
      }
      if(j==3)
      {
        GPIOA->ODR=0x10;
        GPIOD->ODR = cikis[port_e];
        Delay(5);
      }
}
}

JOKERAS

Kullandığınız derleyici bu şekildeki tanımlamayı kabul ediyormu?
Sentaks hatası olabilir.
Değişkenleri for döngüsü dışında main'in en başında tanımlayıp deneyin.

Global tanımlamayla yerel tanımlama arasındaki fark,Global değişkenler
derleme aşamasında "0" ile initialize edilir.
Aynı zamanda Global değişkenler Pgm'ın her satırında tanınırlar.
Yerel değişkenler ise rastgele değer alır.Sadece tanımlandığı yerde bilinirler.


void main (void) {

    int i, j;

             for(i = 0; i < 2; ++i) {
 
             for(j = 0; j < 5; ++j) {
             
            } // j
      } // i
}// main

Kodda yapmak istediğiniz 2 i çevriminde 5 defa j sorgusu yapmak.
Yazdığınız kod sürekli aynı işlemleri tekrar eder  dönüp durur.

JKramer

Cpp olarak derlemeniz lazım; C'de öyle istediğiniz yerde tanımlama yapamıyorsunuz. Global tanımladığınızda programın istediğiniz gibi çalışmaması ayrı bir durum.

muhittin_kaplan

for içinde tanımladığını i yi for için kullanamazsınız

for i .... diyebilmeniz için daha önceden i yi tanımlamalısınız.

int i;
for i.....

şeklinde

baran123

Sorunu tam olarak anlamadım.
Galiba yapmak istediğin şu şekilde bir şey. Bu kod bende derleniyor.
Senin for(int i = 0; i<=1; i++) ifadesini yazabilmen için yani for içinde değişken oluşturabilmen için derleyicinin C99 olması gerekiyor.
Emblocks IDE ile kullandım ve GCC ile derledim.
#include "stm32f4xx_conf.h"

int main(void)
{
    while(1)
    {
        for(int i = 0; i<=1; i++)
        {
            for(int j = 0; j<=4; j++)
            {
                if(j==0)
                {
                    GPIOA->ODR=0x02;
                }

                if(j==1)
                {
                    GPIOA->ODR=0x04;
                }
                if(j==2)
                {
                    GPIOA->ODR=0x08;
                }
                if(j==3)
                {
                    GPIOA->ODR=0x10;
                }
            }
        }
    }
}

yagizhanyakali

Önerdiğiniz çözümleri denedim fakat sonuç alamadım. Aşağıda sizinle tüm kodları paylaşacağım. Amacım tarama yöntemiyle 4 display üzerine 9999'a kadar saymak. IAR derleyecisinde deneyince sorun çıkmıyor program hatasız çalışıyor. Fakat ben bunu Keil ile yapmak istiyorum. İki derleyicinin arasında neden böyle fark oluyor anlamış değilim. Buyrun her iki derleyiciye yazdığım kodları ayrı ayrı paylaşıyorum bakarsanız sevinir.

enum fonksiyonu IAR'de var fakat Keilda oda hata verdiği için onuda değiştirmek zorunda kaldım.

IAR Derleyicisinin kodları
#include "main.h"

GPIO_InitTypeDef GPIO_InitStructure;
static __IO uint32_t TimingDelay;

void Delay(__IO uint32_t n_ps);

void Init_GPIO(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD , ENABLE);


GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;


GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; 	
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;     
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;     
GPIO_Init(GPIOA, &GPIO_InitStructure);



}


enum Durum
{
  Bekle,
  Say
};


int cikis[10];
int port_e=0;
int port_b=0;
int port_c=0;
int port_d=0;

int main(void)
{
  int yon = 0;
  int rakam = 0;
  
  cikis[0] = 0x0077;
  cikis[1] = 0x0041;
  cikis[2] = 0x003B;
  cikis[3] = 0x006B;
  cikis[4] = 0x004D;
  cikis[5] = 0x006E;
  cikis[6] = 0x007E;
  cikis[7] = 0x0043;
  cikis[8] = 0x007F;
  cikis[9] = 0x006F;
  
  if (SysTick_Config(SystemCoreClock / 1000))
  { 
    
    while (1);
  }
  
  enum Durum Vaziyet=Say;
  
  Init_GPIO(); 
  
  
  while (1)
  { 
    if (Vaziyet==Say)
    {
      port_d=rakam%10;
      port_c=(rakam/10)%10;
      port_b=(rakam/100)%10;
      port_e=(rakam/1000)%10;
  
    }
    Delay(1);
    for(int i = 0; i<=1; i++)
    {
   
    for(int j = 0; j<=4; j++)
    {
    if(j==0)
      {
        GPIOA->ODR=0x02;
        GPIOD->ODR = cikis[port_d];
        Delay(5);
      }

      if(j==1)
      {
        GPIOA->ODR=0x04;
        GPIOD->ODR = cikis[port_c];
        Delay(5);
      }
      if(j==2)
      {
        GPIOA->ODR=0x08;
        GPIOD->ODR = cikis[port_b];
        Delay(5);
      }
      if(j==3)
      {
        GPIOA->ODR=0x10;
        GPIOD->ODR = cikis[port_e];
        Delay(5);
      }
    
   
    if(yon==0)
    {
      if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
          {
            yon=1;
            Delay(10); 

          }
    }
  else if(yon==1)
    {
 
      if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
          {
            yon=2;
            Vaziyet=Say;
            Delay(10);
          }
    }
    else if(yon==2)
    {
      if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
          {
            yon=3;
            Delay(10);
          }
    }
    else if(yon==3)
    {
      if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
          {
            yon=0;
            Vaziyet=Say;
            Delay(10);
          }
    }
    }
    }
    if(yon==0)
    {
        if(rakam==9999)
        {
          rakam=0;
        }
      else
        {
          rakam++;
        }

    }

    if(yon==2)
    {
      if(rakam==0)
        {
          rakam=9999;
        }
      else
        {
          rakam--;
        }
    }
   
    
    if(yon==1 || yon==3)
    {

      if (Vaziyet==Say)
      {
        Vaziyet=Bekle;
      }
    }

   
  }
}

void Delay(__IO uint32_t nTime)
{ 
  TimingDelay = nTime;

  while(TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  { 
    TimingDelay--;
  }
}

#ifdef  USE_FULL_ASSERT

void assert_failed(uint8_t* file, uint32_t line)
{ 
  while (1)
  {
  }
}
#endif


Keil derleyicisinin kodları
#include "stm32f4xx.h"                  // Device header


GPIO_InitTypeDef GPIO_InitStructure;
static __IO uint32_t TimingDelay;

void Delay(__IO uint32_t n_ps);

void Init_GPIO(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD , ENABLE);


GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;


GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; 	
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;     
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;     
GPIO_Init(GPIOA, &GPIO_InitStructure);



}



int cikis[10];
int port_e=0;
int port_b=0;
int port_c=0;
int port_d=0;

int i,j;
int say=1;
int bekle=0;
int vaziyet;
int main(void)
{
  int yon = 0;
  int rakam = 0;
  
  cikis[0] = 0x0077;
  cikis[1] = 0x0041;
  cikis[2] = 0x003B;
  cikis[3] = 0x006B;
  cikis[4] = 0x004D;
  cikis[5] = 0x006E;
  cikis[6] = 0x007E;
  cikis[7] = 0x0043;
  cikis[8] = 0x007F;
  cikis[9] = 0x006F;
  
  if (SysTick_Config(SystemCoreClock / 1000))
  { 
    while (1);
  }
  
  
  Init_GPIO(); 
  
  
  while (1)
  { 
    if (vaziyet==say)
    {
      port_d=rakam%10;
      port_c=(rakam/10)%10;
      port_b=(rakam/100)%10;
      port_e=(rakam/1000)%10;
  
    }
    Delay(1);
    for(i = 0; i<=1; i++)
    {
   
    for(j = 0; j<=4; j++)
    {
    if(j==0)
      {
        GPIOA->ODR=0x02;
        GPIOD->ODR = cikis[port_d];
        Delay(5);
      }

      if(j==1)
      {
        GPIOA->ODR=0x04;
        GPIOD->ODR = cikis[port_c];
        Delay(5);
      }
      if(j==2)
      {
        GPIOA->ODR=0x08;
        GPIOD->ODR = cikis[port_b];
        Delay(5);
      }
      if(j==3)
      {
        GPIOA->ODR=0x10;
        GPIOD->ODR = cikis[port_e];
        Delay(5);
      }
    
   
    if(yon==0)
    {
      if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
          {
            yon=1;
            Delay(10); 

          }
    }
  else if(yon==1)
    {
 
      if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
          {
            yon=2;
            vaziyet=say;
            Delay(10);
          }
    }
    else if(yon==2)
    {
      if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
          {
            yon=3;
            Delay(10);
          }
    }
    else if(yon==3)
    {
      if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
          {
            yon=0;
            vaziyet=say;
            Delay(10);
          }
    }
    }
    }
    if(yon==0)
    {
        if(rakam==9999)
        {
          rakam=0;
        }
      else
        {
          rakam++;
        }

    }

    if(yon==2)
    {
      if(rakam==0)
        {
          rakam=9999;
        }
      else
        {
          rakam--;
        }
    }
   
    
    if(yon==1 || yon==3)
    {

      if (vaziyet==say)
      {
        vaziyet=bekle;
      }
    }

   
  }
}

void Delay(__IO uint32_t nTime)
{ 
  TimingDelay = nTime;

  while(TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  { 
    TimingDelay--;
  }
}

Klein

Proje opsiyonlarına gir
C/C++  sekmesine git.
Misc Controls  kutucuğuna   "--C99"  yaz. (tırnak işaretleri olmadan)

yagizhanyakali

Alıntı yapılan: Klein - 13 Kasım 2016, 08:20:31
Proje opsiyonlarına gir
C/C++  sekmesine git.
Misc Controls  kutucuğuna   "--C99"  yaz. (tırnak işaretleri olmadan)

Dediğinizi yaptım build ederken hata vermedi bu defa fakat program yine çalışmadı. Yazdığım kodlar hatalı diyeceğim ama kodları kopyalayıp IAR ye yapıştırıp deniyorum sorunsuz çalışıyor. Bundan önceki bütün projelerimi Keil ile yaptım ama bu olmadı ilginç. Başka aklınıza gelen çözüm yolu var mı ?

Bu arada ilk başta IAR'de de çalışmadı USART kütüphanesi olan bir örnek açmışım. Normal SysTick örneğini açınca çalışmaya başladı. Yani sadece gpio ve rcc kütüphaneleri mevcutsa çalışıyor.

Klein

void TimingDelay_Decrement(void)  Fonksiyonunu çağırdığın yeri göremedim.
Muhtemelen SysTick kesmesinde çağırıyorsun.
SysTick kesme rutini çalışıyor mu?

yagizhanyakali

Alıntı yapılan: Klein - 13 Kasım 2016, 10:21:35
void TimingDelay_Decrement(void)  Fonksiyonunu çağırdığın yeri göremedim.
Muhtemelen SysTick kesmesinde çağırıyorsun.
SysTick kesme rutini çalışıyor mu?

Evet IAR'de SysTick kesmesi çalışıyor. Acaba Keil'de çalışmamasının sebebi bu olabilir mi ? Nasıl bir çözüm yolu izlemeliyim ?

Keil'da yukarıda gönderdiğim kodda son satırda dediğiniz fonksiyonu çalıştırdım farklı bir şekilde mi kullanmalıyım ?

Klein

TimingDelay_Decrement() fonksiyonunu  Kesme içerisinden çağırmıyorsanız kodunuzun çalışmaması normal.  Delay fonksiyonu içinde sonsuz döngüye girer kalırsınız.
Tick kesmesi içinden çağırmanız gerek.  Ya da keskin bir zamanlama ihtiyacı yoksa  delay fonlsiyonunda biraz değişiklikle  fonksiyonu bağımsız hale getirirsiniz.

yagizhanyakali

Alıntı yapılan: Klein - 13 Kasım 2016, 10:41:44
TimingDelay_Decrement() fonksiyonunu  Kesme içerisinden çağırmıyorsanız kodunuzun çalışmaması normal.  Delay fonksiyonu içinde sonsuz döngüye girer kalırsınız.
Tick kesmesi içinden çağırmanız gerek.  Ya da keskin bir zamanlama ihtiyacı yoksa  delay fonlsiyonunda biraz değişiklikle  fonksiyonu bağımsız hale getirirsiniz.

Evet dediğiniz gibi sorun tamamen Delay metodunu Keil'da yanlış uygulamammış. Çözümü internette ufak bir araştırma ile buldum. Buraya bulduğum çözümü yazıyorumki bu konuda takılan başka biri daha olursa faydalansın. Aşağıdaki gibi delay fonksiyonunu tanımlayarak sorunu çözdüm.

uint16_t delay_cnt=0;
void SysTick_Handler(void)
{
	if(delay_cnt>0)
	{
		delay_cnt--;
	}
}
void Delay(uint16_t delay)
{
	delay_cnt=delay;
	while(delay_cnt);
}
int main()
{
SysTick_Config(SystemCoreClock / 1000);

Delay(10); // Delay fonksiyonun kullanımı.
}


İlginiz ve önerileriniz için çok teşekkür ederim...