اطلاعیه

Collapse
No announcement yet.

نحوه نوشتن کلید به عنوان ورودی در c

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    نحوه نوشتن کلید به عنوان ورودی در c

    سلام
    من با سی یک پروژه نوشتم که میخام از دو کلید به عنوان ورودی استفاده کنم و با یکی عرض پالس را زیاد کنم و با دیگری عرض پالس را کم کنم
    مشکلی که دارم اینه که اگر دستم را روی کلید بزارم چند مرحله افزایش میده و یک بار افزایش نمیده
    سوال
    چه جوری میشه با هز بار زدن کلید فقط یک بار اون دستور اجرا بشه

    #2
    پاسخ : نحوه نوشتن کلید به عنوان ورودی در c

    سلام دایی جان
    به این کار می گن دیبانسینگ نرم افزاری.
    و هر مهندسی که با میکرو کار می کنه باید این روتین کلید خونی رو نوشته داشته باشه تا همیشه در پروژه های مختلف ازش استفاده کنه.
    روش کار به این صورته:
    یک متغیر char به نام b_cntr1 تعریف می کنیم و مقدارشو صفر میزاریم.
    وقتی به روتین کلید خونی رسیدیم:
    کلید شماره 1 رو می خونیم و اگه فعال بود به مقدار متغیر b_cntr1 یکی اضافه می کنیم و اگر b_cntr1 به عدد 100 رسید فرمان کلید را اجرا می کنیم. اگه هم کلید فعال نبود b_cntr1 را صفر می کنیم.
    این روش می تونه برای برداشتن دست از روی کلید هم استفاده بشه.
    عدد 100 که گذاشتم بسته به سرعت میکرو و لرزش های دست داره و با تجربه دستت میاد چند بزاری.
    با این روش از شر بانس کلیدها رها میشی. من که سالیان سال دارم ازش استفاده می کنم و هیچوقت نشده کلیدی رو دوبار بخونم.
    با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

    دیدگاه


      #3
      پاسخ : نحوه نوشتن کلید به عنوان ورودی در c

      نوشته اصلی توسط ahmadmn
      سلام دایی جان
      به این کار می گن دیبانسینگ نرم افزاری.
      و هر مهندسی که با میکرو کار می کنه باید این روتین کلید خونی رو نوشته داشته باشه تا همیشه در پروژه های مختلف ازش استفاده کنه.
      روش کار به این صورته:
      یک متغیر char به نام b_cntr1 تعریف می کنیم و مقدارشو صفر میزاریم.
      وقتی به روتین کلید خونی رسیدیم:
      کلید شماره 1 رو می خونیم و اگه فعال بود به مقدار متغیر b_cntr1 یکی اضافه می کنیم و اگر b_cntr1 به عدد 100 رسید فرمان کلید را اجرا می کنیم. اگه هم کلید فعال نبود b_cntr1 را صفر می کنیم.
      این روش می تونه برای برداشتن دست از روی کلید هم استفاده بشه.
      عدد 100 که گذاشتم بسته به سرعت میکرو و لرزش های دست داره و با تجربه دستت میاد چند بزاری.
      با این روش از شر بانس کلیدها رها میشی. من که سالیان سال دارم ازش استفاده می کنم و هیچوقت نشده کلیدی رو دوبار بخونم.
      این روش خوبی ولی اگه شما دستتون رو خیلی بیشتر (مثلا چند ثانیه )نگه داری این متغیر چند بار به100 میرسه.
      و چند بار کلید خونده میشه.فکر می کنم ایشون نمی خواد تا وقتی دست رو از روی کلید برنداشتی بیشتر از یک واحد به متغییر اضافه شه.برای این کار چاره ای دارید؟چون منم دنبالش گشتم ولی چیزی پیدا نکردم.
      [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

      دیدگاه


        #4
        پاسخ : نحوه نوشتن کلید به عنوان ورودی در c

        دایی جان گلم
        من گمون می کردم باقی راه رو خودتون میرید! :biggrin:
        کافیه یه متغیر بیتی به نام key_pressed تعریف کنید. هروقت کانتر دیبانس به 100 رسید این متغیر 1 بشه. واگه 1 شد دیگه منتظر ول شدن کلید باشه با همون روش که برای فشردن گفتم.
        با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

        دیدگاه


          #5
          پاسخ : نحوه نوشتن کلید به عنوان ورودی در c

          سلام
          ممنون از دوستان
          ایا روش دیگری هست؟؟؟

          دیدگاه


            #6
            پاسخ : نحوه نوشتن کلید به عنوان ورودی در c

            با تشکر از جناب استاد دایی که بسیار راهنمایی خوبی کردند
            روش که زیاده هر کسی برنامه رو یه جوری مینویسه دیگه
            مثلا شما میتونی چک کنی که کلید فشار داده شده یا نه بعد اگه فشار داده شده بود یه حلقه بذاری تا یه کار بیخود انجام بده مثلا
            if (pin a.1==0)
            count++;
            while(pin a.1==0)
            {
            a++;
            {
            حالا این حلقه تا جایی که دستتو از کلید برنداری تو خودش می چرخه و فقط مقدار a رو زیاد می کنه
            یا یه همچین چیزی
            شاید برنامه که من نوشتم بی اشکال نباشه اما یه ایده هست دیگه
            در ضمن از جناب دایی هم تشکر نکردی که جوابتون رو با حوصله دادند
            Don't hesitate to ask any question ..

            دیدگاه


              #7
              پاسخ : نحوه نوشتن کلید به عنوان ورودی در c

              سلام
              ممنون از همه دوستان
              من هز چه امتحان کردم نشد
              اینم برنامه
              خواهشا تغیرات لازم را انجام دهید
              افزایش دور موتور دی سی با پی دبلیو ام هست
              دو تا کلید وصل کردم


              #include <mega8.h>
              #include <delay.h>
              #define xtal 1000000

              int x ;
              int m ;
              int n ;
              int T ;
              int z ;


              void main(void)

              {

              x=0 ;


              DDRB=0xFF;

              PORTC=0x03;
              DDRC=0xFC;



              while (1)
              {





              m= 200 ;

              n=200 ;
              loop:

              ;

              x=PINC ;

              x=x&0b00000011 ;


              T=m+n ;

              PORTB.0=1 ;

              delay_ms(n) ;

              PORTB.0=0 ;

              delay_ms(m) ;





              if (x==0b00000010 )

              {


              n=n+20;
              m=m-20 ;





              if(n>400)
              {
              n=20 ;

              }

              if(m<0)
              {
              m=400 ;



              }


              }



              while(x==0b00000010)


              {

              }

              if(x==0b00000001)
              {


              m=m+20 ;
              n=n-20;

              if(m>400)
              {
              m=0 ;

              }

              if(n<0)
              {
              n=400 ;

              }






              }


              if(x==0b00000011)
              {




              }


              goto loop ;


              }

              }

              دیدگاه


                #8
                پاسخ : نحوه نوشتن کلید به عنوان ورودی در c

                سلام
                اینهم فایل شبیه سازی شده پروتیوس

                http://www.speedyshare.com/files/22571136/pwm1.rar

                دیدگاه


                  #9
                  پاسخ : نحوه نوشتن کلید به عنوان ورودی در c

                  با سپاس از دایی های گلم
                  تعارفات رو کمتر کنیم بهتره :biggrin:
                  یک نکته در مورد پاسخ دایی سیا:
                  در یک برنامه اصولی به هیچ وجه نباید میکرو را مشغول یا منتظر نگه داریم. قراره این روتین کلید خونی بعدها هم استفاده بشه پس باید اصول برنامه نویسی رعایت بشه.
                  انتظار در یک حلقه یعنی اتلاف وقت و توانایی میکرو. و اه یه روز یه برنامه واقعی داشته باشید می بینید که میکرو اصلا نباید معطل بشه چون از کارای دیگه باز می مونه.
                  حتی دستور delay در برنامه های حرفه ای جزو دستورات ممنوعه است! همچنین دستور goto که ساختار برنامه رو برهم میزنه.
                  و اما برنامه کلید خونی:
                  راستش سالهاست که برام پیش نیومده پایه های میکرو خالی بمونه تا کلید بهش وصل کنم و بخونم! همشه کلیدها رو با روش مالتی پلکس می خونم. یعنی چندین کلید رو فقط با یک پایه میکرو می خونم.
                  حتی گاهی اون یک پایه رو هم ندارم! و باید با همون پورت SPI که داره واسه مدارات دیگه چیز میفرسته همزمان کلیدخونه کنم.
                  پس روتین های کلید خونی من بسایر پیچیده اند و بدرد دایی bnmo نمی خوره.
                  مثل این:
                  کد:
                      //*****************************************************************************************
                      if(wait_release)
                        {
                        if((dig_cntr+1)==current_key)
                          {
                          if(!KEYINP)
                            {      
                            if(++deb_cntr==DEB_LIMIT)
                              {
                              wait_release=0;
                              deb_cntr=0;
                              set_mode_timer=0;
                  			      calb_mode_timer=0;
                              exp_cntr=1;
                              wait_release_cntr=0;
                              };        
                            }
                          else
                            { 
                            if(wait_release_cntr!=0)
                              {
                              if(--wait_release_cntr==exp_cntr)
                                {
                                wait_release=0;
                                if(exp_cntr<200) exp_cntr=exp_cntr+20;
                                deb_cntr=DEB_LIMIT-1;
                                }
                              }
                            };
                          }    
                        }
                      else
                        {
                        if(KEYINP)
                          {
                          if((dig_cntr+1)==current_key)           
                            {
                            if(++deb_cntr==DEB_LIMIT)
                              {
                              //****************************************************** 
                              switch (current_key) 
                                {
                                case 1: //UP key
                                  switch (set_mode) 
                                    {
                                    case 0: //default mode 
                                      calb_mode_timer=KEY_HOLD_TIME;
                                      if(cur_disp_mode==DISP_MAX) cur_disp_mode=DISP_NORMAL; else cur_disp_mode=DISP_MAX; 
                                    case 1: //param disp mode
                                      if(++par_index>=PAR_CUNT) par_index=0;
                                    break; 
                                    case 2: //param set mode
                                      if(param[par_index]<param_max[par_index])
                                        {
                                        param[par_index]++;
                                        wait_release_cntr=205;
                                        }
                                        else param[par_index]=param_min[par_index]; 
                                      
                                    break;
                                    } 
                                break;
                                case 2: //DN key
                                  switch (set_mode) 
                                    {
                                    case 0: //default mode  
                                      if(cur_disp_mode==DISP_MIN) cur_disp_mode=DISP_NORMAL; else cur_disp_mode=DISP_MIN;
                                    break;
                                    case 1: //param disp mode
                                      if(par_index>0) par_index--; else par_index=PAR_CUNT-1;
                                    break;
                                    case 2: //param set mode
                                      if(param[par_index]>param_min[par_index])
                                        {
                                        param[par_index]--;
                                        wait_release_cntr=205; 
                                        }
                                        else param[par_index]=param_max[par_index]; 
                                    break;
                                    } 
                                break;
                                case 3: //Set key
                                  switch (set_mode) 
                                    {
                                    case 0: //default mode 
                                       set_mode_timer=KEY_HOLD_TIME;
                                       if(cur_disp_mode==DISP_HOLD) cur_disp_mode=DISP_NORMAL; else cur_disp_mode=DISP_HOLD;
                                    break;
                                    case 1: //param disp mode
                                       set_mode++;
                                    break;
                                    case 2: //param set mode
                                      eeparam[par_index]=param[par_index];
                                      set_mode--;
                                    break;
                                    } 
                                break;
                                case 4: //Zero key 
                                  switch (set_mode) 
                                    {
                                    case 0: //default mode 
                                      ZERO_ADC=1;
                                    break;
                                    case 1: //param disp mode 
                                      not_auto_calibrated=1;
                                      set_mode--;
                                    break;
                                    case 2: //param set mode
                                      param[par_index]=eeparam[par_index];
                                      set_mode--;
                                    break;
                                    } 
                                break;
                                }; 
                              //******************************************************
                              wait_release=1;
                              deb_cntr=0;
                              if(exp_cntr==1) buz_timer=100;
                              };  
                            }
                          else
                            {
                            current_key=(dig_cntr+1);
                            deb_cntr=0;     
                            };          
                          };
                        };
                      };
                    //********************************************************************

                  روتین بالا برای خوند بی نهایت کلیداست. اما در اینجا 4 کلید باهاش خونده شده. هر کلید هم چندین کار انجام میده. کلید up و down هم داره که میشه واسه کم و زیاد کردن ازش استفاده کرد. دقیقا مثل کلید های منو در موبایله. دیبانس فشردن و رها کردن هم داره. کلید زماندار هم داره یعنی اگه روی کلید چند ثانیه دستتونو نگه دارید شروع می کنه به شمارش یا کم و زیاد کردن سریع. جالب اینجاست که میکرو وارد روتین کلید خونی میشه و بدون اینکه توش گیر کنه ازش خارج میشه و میره سراغ کارای دیگه.

                  سرتونو درد آوردم تا فقط کمی با برنامه نویسی واقعی که توی عمل استفاده میشه آشنا بشید :biggrin:

                  اینم برنامه ای برای دایی bnmo تا دو کلید up و down را که به پایه های 0 و 1 از پورت C وصل شده و با فشردن 1 میشن:

                  کد:
                  unsigned char deb_cntr_up,deb_cntr_down,wait_release_up,wait_release_down;
                  
                  while (1) 
                    {
                    if(wait_release_up)
                      {
                      if((PINC & 0b00000001) ==0)
                        {
                        if(++deb_cntr_up==50)
                          {
                          wait_release_up=0;
                          deb_cntr_up=0;
                          };        
                        }  
                      else
                        {
                        deb_cntr_up=0;
                        };          
                      }
                    else
                      {
                      if((PINC & 0b00000001) ==1)
                        {
                        if(++deb_cntr_up==50)
                          {
                          //place yor code here fo runing up key functin
                          wait_release_up=1;
                          deb_cntr_up=0;
                          }  
                        else
                          {
                          deb_cntr_up=0;
                          };          
                        };
                      };
                    //*************************************************************
                    if(wait_release_down)
                      {
                      if((PINC & 0b00000010) ==0)
                        {
                        if(++deb_cntr_down==50)
                          {
                          wait_release_down=0;
                          deb_cntr_down=0;
                          };        
                        }  
                      else
                        {
                        deb_cntr_down=0;
                        };          
                      }
                    else
                      {
                      if((PINC & 0b00000010) ==2)
                        {
                        if(++deb_cntr_down==50)
                          {
                          //place yor code here fo runing down key functin
                          wait_release_down=1;
                          deb_cntr_down=0;
                          }  
                        else
                          {
                          deb_cntr_down=0;
                          };          
                        };
                      };
                    //*************************************************************
                    };

                  دوتا جا برات گذاشتم تا اونجا به مقدار PWM اضفه یا کم کنی.


                  با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                  دیدگاه

                  لطفا صبر کنید...
                  X