Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

main uzunluğu

Başlatan enselms, 08 Mart 2016, 16:58:51

enselms

herkese iyi günler pic16f1516da iç içe menü tasarlıyodumda bi uyarı aldım main function çok uzun diyor bunun için ne önerirsiniz acaba

dursuncemal

hangi derleyiciyi kulaniyorsunuz? kodun tamani 16f1516 nin kapasitesini asmis olabilirmi?
:=

vitruvius

Kodu ve mesajı görmekte fayda var.

tekosis

ana fonksiyonu uzatmamak için alt fonksiyonlar ile çalışmak lazım. kontrolü de daha kolay olur
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

enselms

ilginiz için teşekkür derleyici olarak ccs cyi kullanıyorum kod çalışmayınca eski haline döndürdüm 1000 satırlık bi main fuction var normalde %25 rom kullanırken yeni bir if döngüsü oluşturduğumda dediğim hatayı veriyor. kullandığım malzemeler 7segment be buton olduğu için düzgün çalışması için
         while(input(menu)==0){
         output_high(display_4); 
      output_a(digit[birler]);
      delay_ms(2);  
      output_low(display_4);
      delay_ms(2);
      output_high(display_3); 
      output_a(digit[onlar]);
      delay_ms(2);  
      output_low(display_3);
      delay_ms(2);        
      output_high(display_2); 
      output_a(digit[yuzler]);
      delay_ms(2);  
      output_low(display_2);
      delay_ms(2); 
      output_high(display_1); 
      output_a(digit[binler]);
      delay_ms(2);  
      output_low(display_1);
      delay_ms(2);

bu koddan yaklaşık 20 tane kullanıyorum böyle bi while döngüsünü nasıl bi fonksiyona dökebilirim

alexsi

#5
Timerda 7 segmentleri sürmeniz daha mantıklı ana döngüde gecikme profesyonelce yaklaşım olmaz. Her delay_ms dediğinizde main döngüsünün, döngü zamanını uzatırsınız. Yani şu mantıkta olması lazım, ne kadar zamanda segmenti sürecekseniz o kadar kez interrupt zamanı oluştuktan sonra segmenti sürersiniz sonra segment değerini 1 arttırarak bir sonraki segmenti sürecek segment bilgisini alırsınız. süre istediğiniz kez oluşmadıysa boş geçersiniz. Mainde delay ms yazdığınızda o kadar süre main süre dolmasını bekler bu da istenmeyen bir durumdur. Eğer uygulamadaki kodunuzun arttığını düşünürseniz sizin yazdığınız şekilde işin içinden bir süre sonra çıkılmayacaktır. Bu anlatılan mantıkta kodunuzu revize etmeniz daha mantıklı..

Genel tavsiyem şu dur;
Yazacağınız kodu atomlara ayrın . en küçük yapacağınız on off fonksiyonu için on'u alt program, off'u alt program yapma olarak çalışmanız daha optimize kod yazmanızı sağlayacaktır. Direk registerlar ile değilde flaglar ile kontrol yapma mantığını benimseyerek kod yazın.
http://www.kontrolarge.com/ Bildiklerimiz öğrendiklerimiz kadardır. Ya bilmediklerimiz ..?

enselms

yardımlarınız için teşekkürler bi çözüm ürettim kodumu buraya atıyorum belki sizede yardımcı olur.
#include <16F1516.h>
#device ADC=16

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG
#use delay(internal=16000000)

#use fast_io(b)


 #define   display_1              pin_b4     
 #define   display_2              pin_b5     
 #define   display_3              pin_b6      
 #define   display_4              pin_b7      
 #define   menu                   pin_b0 //b3     
 #define   up_menu                pin_b1 //b2     
 #define   down_menu              pin_b2  //b1    
 #define   geri                   pin_b3 //b0
unsigned int16 birler = 3;
unsigned int16  onlar = 5;
unsigned int16 yuzler=4;
unsigned int16 binler=1;

const int digit[30]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F,0x77, 0x31,
0x6D, 0x78, 0x15, 0x79, 0x54, 0x3E, 0x5C, 0x5E, 0x73,0x76,0x38,0x6E,0x39,0x30,0x2A,0x5B,0x06,0x00};
int8 k=0,a=0;

 void Sayi_hesap();
#INT_TIMER0
void  TIMER0_isr(void) 
{
   set_timer0(255);
            output_high(display_4); 
      output_a(digit[birler]);
      delay_ms(2);  
      output_low(display_4);
      delay_ms(2);
      output_high(display_3); 
      output_a(digit[onlar]);
      delay_ms(2);  
      output_low(display_3);
      delay_ms(2);        
      output_high(display_2); 
      output_a(digit[yuzler]);
      delay_ms(2);  
      output_low(display_2);
      delay_ms(2);
      output_high(display_1);
      
      output_a(digit[binler]);
      delay_ms(2);  
      output_low(display_1);
      delay_ms(2);
}
   
void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_bit);      //16,3 ms overflow

   set_timer0(255);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   set_tris_a(0x00);
   set_tris_b(0x0F);
   output_low(display_1);
   output_low(display_2);
   output_low(display_3);
   output_low(display_4);
   output_b(0x00);
   while(TRUE)
   {   
      if(k==0)
      {
         if(input(menu)==0){
         k=1;
         while(input(menu)==0){}
         }
         }
      if(k==1)
      {
        if(input(menu)==0){
           k=0;
           while(input(menu)==0){ }
      }
        if(input(geri)==0)
        {
          k=2;
          while(input(geri)==0){}
        }
        if(input(down_menu)==0)
        {
           binler++;
           if(binler==10)
           binler=0;
              while(input(down_menu)==0){}
        }
        if(input(up_menu)==0){
         binler--;
           if(binler==-1)
              binler=9;
        while(input(up_menu)==0){}
         }
   }
   if(k==2)
   { 
 
        if(input(menu)==0){
           k=0;
           while(input(menu)==0){}
         }
        if(input(geri)==0)
        {
           k=3;
           while(input(geri)==0){}
        }
        if(input(down_menu)==0)
        {
           yuzler++;
           if(yuzler==10)
              yuzler=0;
              while(input(down_menu)==0){}
        }
        if(input(up_menu)==0){
        yuzler--;
           if(yuzler==-1)
           yuzler=9;
        while(input(up_menu)==0){}
}

   }
   if(k==3)
   {

        if(input(menu)==0){
           k=0;
         while(input(menu)==0){}
}

        if(input(geri)==0)
        {
           k=4;
           while(input(geri)==0){}

        }
        if(input(down_menu)==0)
        {
           onlar++;
           if(onlar==10)
              onlar=0;
              while(input(down_menu)==0)
         {}
         }
        if(input(up_menu)==0){
        onlar--;
           if(onlar==-1)
              onlar=9;
        while(input(up_menu)==0)
         {}
        }
   }              
   if(k==4)
   {


        if(input(menu)==0){
           k=0;
        while(input(menu)==0){}
}

        if(input(geri)==0)
        {
           k=1;
        while(input(geri)==0){ }
        }
        if(input(down_menu)==0)
        {
           birler++;
           if(birler==10)
              birler=0;
              while(input(down_menu)==0){}
         }
        if(input(up_menu)==0){
        birler--;
           if(birler==-1)
              birler=9;
              while(input(up_menu)==0){ } 
         }
         }
 

}
}