اطلاعیه

Collapse
No announcement yet.

متغییر بیتی در keil

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

    متغییر بیتی در keil

    سلام خدمت آقای تروشه و اساتید دیگر
    لین سوال رو تو بخش lpc مطرح کردم ولی کسی پاسخ نداد
    چند تا سوال درباره lpc 2378 دارم
    1 در این سری از میکروها متغییر بیتی قبول نمیکنه و در صورتی هم که در برنامه متغییر بیتی
    زیادی نیاز باشد تعریف ماکرو درست به نظر نمیرسه
    2 اگه نیاز به یک eeprom داشته باشیم باید چیکار کنیم مثلا فقط مقدار یک متغییر رو تو خودش نگه داره نه بیشتر
    3 دستور ورودی برای یک شرط if رو با چه حالتهایی میشه پیاده کرد(پین میکرو) اگه ممکنه یکی دو نمونه اولیه بذارین
    با تشکر از شما

    #2
    پاسخ : متغییر بیتی در keil

    1- متغیر های بیتی رو شما میتونی براحتی با استفاده از بایت های منفرد یا بیت های یک عدد صحیح پیاده سازی کنی.

    2- برای eeprom شما میتونی دو کار کنی. اول با استفاده از IAP اطلاعات رو داخل فلش قرار بدی. که البته بیش از 10000 بار نمیشه پروگرامش کرد. یا از حافظه 2 کیلئ بایتی RTC که با استفاده از یک باتری اطلاعات رو حفظ میکنه استفاده کنی.

    3- ؟؟؟؟

    دیدگاه


      #3
      پاسخ : متغییر بیتی در keil

      ممنون دوست عزیز
      اگه ممکنه سوال اول رو بیشتر توضیح بدین
      دوم این که سوال سومم را فکر میکنم متوجه نشدین
      منظورم دستور داخل شرط if هست یعنی اگه یک پین یک بشه فلان کار انجام شه
      دستور رو اینطور نوشتم ولی جواب نداد
      if(FIO1PIN0&0x1==0xFE
      دستور العمل
      .....
      }
      ممنون میشم اگه راهنمایی کنین

      دیدگاه


        #4
        پاسخ : متغییر بیتی در keil

        خوب این کد کلا غلطه. چطوری ممکنه عددی با 1 and بشه ولی مقدارش بشه 0xFE؟ چون تمامی بیت هایی که در عدد 1 خاموشه در عدد نهایی صفر میشن. و نتیجه یا صفر هست یا یک. پس میشه:


        if(FIO1PIN0&0x1)
        {
        // FIO1PIN0.0 is 1
        }
        else
        {
        // FIO1PIN0.0 is 0
        }


        یعنی آیا مقدار حاصل غیر صفر هست یا نه؟ (چون فقط یک بیت در عدد ثابتمون قید شده یعنی عدد 1 تنها در صورتی حاصل غیر صفر میشه که اون بیت کذایی وجود داشته باشه یعنی به اصطلاح انسانی عدد فرد باشه).

        یا در حالت کلی:


        #define BV(n) (1<<(n))

        if( FIO1PIN0 & BV(4) )
        {
        // BIT #4 is 1
        }


        if( (FIO1PIN0 & BV(5)) == 0)
        {
        // BIT #5 is 0
        }



        دیدگاه


          #5
          پاسخ : متغییر بیتی در keil

          ممنون دوست خو بم
          اگه محبت کنی ودرباره متغییر بیتی هم یک راهنمایی کنی ممنون میشم

          دیدگاه


            #6
            پاسخ : متغییر بیتی در keil

            من تاجایی که دیدم و یادم هست فقط یک سری میکروهایی مثل 8051 این امکان بیت به بیت کار کردن رو دارن. بعضی کامپایلر ها هم از خودش زبون در وکردن و پای بیت و بیت بازی وسط کشیدن مثل کد ویژن. اما اصلش اینه که شما از متغیر هایی از جنس انواع پایه استفاده کنی و با and و or کردن به مقادیر بیت های متفاوت دسترسی داشته باشی یا بتونی ست و ریستشون کنی. حتی اگه بخوای هم میتونی با استفاده از همین دستورات آرایه هایی از جنس بیت تعریف کنی و مدیریتشون کنی. اما همیشه متوجه این نکته باش که استفاده از یک بیت الزاما به معنی صرفه جویی در حافظه نیست. و اصلا ممکنه درست هم نباشه. بهر حال اگه یک کامپایلر چیز خوبی باشه خودش میتونه این کد های کذایی هشل هفت رو به کد های بهینه شده برای پروسسور مورد استفاده تبدیل کنه. مثلا WinAVR وقتی میبینه دارین دستوری رو روی یک IO استفاده میکنین که نتیجتا فقط یک بیت رو ست یا ریست میکنه و اون IO خودش قابلیت آدرس دهی بیتی رو داره دستورات ست و ریست کردن اون بیت بطور منفرد رو استفاده میکنه. اما شما میتونی متغیر های بیتی رو با استفاده از bit field هم استفاده کنی:



            #define BV(bit) (1<<(bit))
            #define set_bit(var,bit) (var)|=BV(bit)
            #define clr_bit(var,bit) (var)&=~BV(bit)
            #define cpl_bit(var,bit) (var)^=BV(bit)
            #define chk_bit(var,bit) ((var)&BV(bit))

            example:

            int bits;

            set_bit(bits, 0);
            clr_bit(bits, 5);
            if( chk_bit(bits, 5) )
            {
            // bits.5 = 1
            }


            bitfields:

            typedef struct
            {
            unsigned bit0 : 1;
            unsigned bit1 : 1;
            unsigned bit2 : 1;
            unsigned bit3 : 1;
            unsigned bit4 : 1;
            unsigned bit5 : 1;
            unsigned bit6 : 1;
            unsigned bit7 : 1;
            unsigned bit8 : 1;
            unsigned bit9 : 1;
            ....
            }bit32;

            bit32 bits;

            bits.bit0 = 1;

            if( bits.bit5 )
            {
            }


            در هر دو حالت این کامپایلره که زحمت تولید کد و بهینه سازیشو میکشه نه شما. بنا براین برای عمر خودت ارزش قائل شو و اول کدت رو جواب بگیر. اگر جواب نداد به فکر رفع مشکل باش. اینا وظیفه کامپایلره.
            موفق باشی.

            دیدگاه


              #7
              پاسخ : متغییر بیتی در keil

              برای تعریف متغیر بیتی اول کتابخانه RTL.H به برنامه اظافه کنید و بعد متغیر بیتی تعریف کنید .

              دیدگاه


                #8
                پاسخ : متغییر بیتی در keil

                یک رو ش دیگه هم استفاده از ساختار struct هستش

                [FONT=Yekan]struct SYSCLK[/FONT]
                {
                unsigned char clk100 :1;
                unsigned char clk200 :1;
                unsigned char clk400 :1;
                unsigned char clk500 :1;
                unsigned char clk800 :1;
                unsigned char clk1000 :1;
                unsigned char clk1600 :1;
                unsigned char clk2000 :1;
                };
                [LEFT][FONT=Yekan]struct SYSCLK CLKCLK;

                if(CLKCLK.clk100==1)
                {....
                ....}
                [/FONT][/LEFT]

                دیدگاه

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