اطلاعیه

Collapse
No announcement yet.

نکاتی در برنامه نویسی C (کامپایلر IAR)

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

    #61
    پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

    سوال بسیار خوبی را مطرح کردید. با توجه به نوع صورت مسئله شما که قصد دارید رجیسترهای پورت های مختلف را از طریق یک ساختار از پیش تعیین شده، تعریف کنید و اینکه بتوانید هر پورت را بصورت بیتی و بایتی مقداردهی کنید، می توانید از سه union در داخل struct مانند نمونه کد زیر استفاده کنید (این نمونه کد را در سیمولاتور IAR تست کردم و به خوبی عمل می کند):

    کد:
    typedef struct
    {
     union
     {
     unsigned char in;
     unsigned char in0:1;
     unsigned char in1:1;
     unsigned char in2:1;
     unsigned char in3:1;
     unsigned char in4:1;
     unsigned char in5:1;
     unsigned char in6:1;
     unsigned char in7:1;
     };
    	
     union
     {
     unsigned char dir;
     unsigned char dir0:1;
     unsigned char dir1:1;
     unsigned char dir2:1;
     unsigned char dir3:1;
     unsigned char dir4:1;
     unsigned char dir5:1;
     unsigned char dir6:1;
     unsigned char dir7:1;
     };
     
     union
     {
     unsigned char out;
     unsigned char out0:1;
     unsigned char out1:1;
     unsigned char out2:1;
     unsigned char out3:1;
     unsigned char out4:1;
     unsigned char out5:1;
     unsigned char out6:1;
     unsigned char out7:1;
     };
    	
    } PORT_STRUCT;


    در این شرایط مثلا PortA.dir یا PortA.out یا PortA.in بصورت بایتی هم قابل دسترسی هستند.
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      #62
      پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

      با سپاس از توجه تون
      کد رو توی Atmel Studio تست کردم. بیت های تعریف شده توی union ها رو همه در lsb در نظر میگیره و همه در اصل بیت صفر از رجیستر پورت رو آدرس دهی میکنند. که با اصلاحش به این شکل درست شد. ممنون از راهنماییتون.

      کد:
      typedef struct
      {
      	union
      	{
      		unsigned char in;
      		struct
      		{
      			unsigned char in0:1;
      			unsigned char in1:1;
      			unsigned char in2:1;
      			unsigned char in3:1;
      			unsigned char in4:1;
      			unsigned char in5:1;
      			unsigned char in6:1;
      			unsigned char in7:1;
      		};
      	};
      	
      	union
      	{
      		unsigned char dir;
      		struct
      		{
      			unsigned char dir0:1;
      			unsigned char dir1:1;
      			unsigned char dir2:1;
      			unsigned char dir3:1;
      			unsigned char dir4:1;
      			unsigned char dir5:1;
      			unsigned char dir6:1;
      			unsigned char dir7:1;
      		};
      	};
      	
      	union
      	{
      		unsigned char out;
      		struct
      		{
      			unsigned char out0:1;
      			unsigned char out1:1;
      			unsigned char out2:1;
      			unsigned char out3:1;
      			unsigned char out4:1;
      			unsigned char out5:1;
      			unsigned char out6:1;
      			unsigned char out7:1;
      		};
      	};
      	
      } PORT_STRUCT;

      دیدگاه


        #63
        پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

        برای عملکرد بیتی کد را تست نکرده بودم و همین شکل اخیر صحیح است.
        اوژن: به معنای افکننده و شکست دهنده است
        دانایی، توانایی است-Knowledge is POWER
        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

        دیدگاه

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