Ynt: AVR void sıçramaları

Başlatan veliusta, 22 Aralık 2015, 00:35:48

veliusta

int main(void){
while(1){
  MOD_1();
 }
}

void MOD_1(){
 while(1){

 }
  MOD_2();
}

void MOD_2(){
 while(1){

 }
  MOD_3();
}
  diye MOD_10'a kadar gidiyor. Bu tarz bir kod yazdım.

Entegre 2 dk çalıştıktan sonra kendini kilitliyor. Sebebi ne olabilir.

mesaj birleştirme:: 22 Aralık 2015, 14:38:45

Mikrodenetleyici: Atmega8 ve Dahili Osilatörü

Karamel


void MOD_1(){
while(1){

}

  MOD_2();
}

ustadim. microcontroller. kirmizi yaptigim yerde infinite loop a girmesi lazim. birseyler ters gidiyor olmali??

veliusta

#2
Oraya takılmayın.

while döngünün içinde bir void daha var.

while(1){
  BUTON_BASILDI_MI();
}

void BUTON_BASILDI_MI(){
  X++;
X Kaç ise go to MOD_X();
}


mesaj birleştirme:: 22 Aralık 2015, 01:11:03

Sormak istediğim şey şu. Void sıçraması yaparken kaldığın yerin adresini RAM'e yazıyor. Çok fazla sıçrama yaptığından dolayı tüm kaldığın yerleri RAM'a yazıyor olabilir mi? Yetersiz olduğun da kendini resetliyor.

Kabil ATICI

buradaki son mod'dan sonra ne yapıyor? Umarım başa sarmıyorsundur. o zaman stack taşması olur.yani her atlamada geri dönüş adresi stack üzerinde 2 bayt olarak saklanır, ve geri dönüşte bu adres kullanılır. Eğer çok fazla alt program çağrılırsa sonuçta stack yığın taşması oluşur).
Çağrılan her fonksiyon bir alt program olarak çalışır ve alt program bittiğinde çağrıldığı satırın altından devam eder. Ama bu alt program çağrıları stack alanı ile sınırlıdır, sonrasında taşma olur...

Hele ki alt program çağırır sonra goto ile bir yerlere gidersiniz, aha bela geliyorum der...
ambar7

veliusta

evet başa sarıyorum.

void MOD_10(){
while(1){
  BUTON_BASILDI_MI();
  KODLAR;
}
  MOD_1();
}

Kabil ATICI

gerisine gerek yok, yığın taşması kaçınılmaz...
ambar7

veliusta

#6
Nasıl yapacağım. Aklıma başka yöntem gelmedi.

Basit olarak kodlar bunun gibi;

int main(void){


while(1){
  MOD_1();
 }
}

void MOD_1(){
 while(1){
  KODLAR;
  BEKLE();
 }
  if(MOD==0){
    MOD_2();
  }
}

void MOD_2(){
 while(1){
  KODLAR;
  BEKLE();
 }
  if(MOD==0){
    MOD_3();
  }
}

void MOD_100(){
 while(1){
  KODLAR;
  BEKLE();
 }
  if(MOD==0){
    MOD_1();
  }
}

void BEKLE(void){
  for(ZAMAN_DONGUSU=0; ZAMAN_DONGUSU<ZAMAN; ZAMAN_DONGUSU++){
    _delay_ms(3);
    if(BUTON==LOW){
     if(MOD!=10){
       MOD++;
   }
    switch(MOD){
     case 0: MOD_1(); break;
     case 1: MOD_1(); break;
     case 2: MOD_2(); break;
     case 3: MOD_3(); break;
     case 4: MOD_4(); break;
     case 5: MOD_5(); break;
     case 6: MOD_6(); break;
   }
  }
      if(BUTON_2==LOW){
      if(MOD!=0){
       MOD--;
  }
    switch(MOD){
     case 0: MOD_1(); break;
     case 1: MOD_1(); break;
     case 2: MOD_2(); break;
     case 3: MOD_3(); break;
     case 4: MOD_4(); break;
     case 5: MOD_5(); break;
     case 6: MOD_6(); break;
   }
 }
}
}

Kabil ATICI

hangi moda gideceksen bunu ana döngüde yapıyorsun, ama arada gitmek istediğin zaman bir bayrak ile moda gitme durumunu belirtiyorsun. Ana döngüde o bayrak örneğin 1 ise moda gitmek isteğin gerçekleştiriliyor.(mod sıçramasından önce bayrağı sıfırla) Sonuçta yine geri döndüğünde başka bir moda gidilecekse bayrak 1 yapılarak işlem gerçeklenir. Yani her zaman alt programdan döndükten sonra tekrar alt mod çağrılmış oluyor.
MOD ve bayrak  global bir değişken olarak
örneğin
void MOD_2(){
while(1){
  KODLAR;
  BEKLE();
  if(MOD==0){
    MOD=2;
bayrak=1;
  }
}
}

void MOD_100(){
while(1){
  KODLAR;
  BEKLE();

  if(MOD==0){
    MOD=1;
bayrak=1
  }
}
}


tabi burada geri dönüş sıkıntılı olur onun için
while (MOD==0)
{...
kodlar
} yaklaşım daha iyi olur. diğer türlü while içinden çıkmak için zorlama komutlarını kullanman gerekir...kodlar arasında while içinden çıkmayı sağlayacak gerekli değişikliği yapacak komu olduğunu varsayıyorum...
ambar7

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

veliusta


PROTECH_

switch-case yapısı kullanman fonksiyonellik açısından işini görür.
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN