توصیه شده, آردوینو

تنظیم و خواندن بیت‌ها + شیفت بیت‌ها | قسمت شانزدهم آموزش آردوینو

آردوبنو قسمت شانزدهم

در قسمت پانزدهم از آموزش آردوینو به بررسی گرد کردن اعداد ممیزی، چگونگی استفاده از توابع مثلثاتی و تولید اعداد تصادفی، پرداختیم. در این قسمت قصد داریم درباره تنظیم و خواندن بیت‌ها و همچنین، شیفتِ بیت‌ها صحبت کنیم. در پایان مطلب نیز درباره استخراج بایت‌های High و Low به‌صورت int یا long و تشکیل int یا long از High و Low Byte توضیحاتی ارائه می دهیم.

تنظیم و خواندن بیت‌ها

 اگر شما بخواهید یک بیت خاص را در یک متغیر عددی بخوانید یا تنظیم کنید، می‌توانید از توابع زیر استفاده کنید:

bitSet(x, bitPosition)

تابع bitSet مقدار 1 را در جایگاه bitPosition مربوط به متغیر x مینویسد

bitClear(x, bitPosition)

تابع bitClear مقدار 0 را در جایگاه bitPosition مربوط به متغیر x مینویسد

bitRead(x, bitPosition)

مقدار (0 یا 1) بیت را در bitPosition موجود متغیر x برمی گرداند.

bitWrite(x, bitPosition, value)

مقدار داده شده (0 یا 1) بیت را در bitPosition موجود متغیر x تنظیم می کند. 

bit(bitPosition)

مقدار bit position موجود را برمی‌گرداند: بیت(0) 1، بیت(1) 2، بیت(2) 4 و… است.

در همه این توابع، bitPosition 0 کم‌اهمیت‌ترین بیت است.

در اینجا یک اسکچ وجود دارد که توابع برای تغییر بیت‌های یک متغیر 8 بیتی به نام flags استفاده می کنند. همچنین، از هر یک از هشت بیت به عنوان یک فلگ مستقل استفاده می کند که می تواند روشن و خاموش شود:

این کد هر 10 ثانیه موارد زیر را پرینت می کند:

خواندن و ست (تنظیم) کردن بیت‌ها، امری رایج است و بسیاری از کتابخانه‌های آردوینو از این قابلیت استفاده می‌کنند. مهم ترین کاربردهای عملیات بیت (bit operation) عبارت است از: ذخیره و بازیابی مقادیر باینری (روشن/خاموش (on/off)، درست/نادرست (true/false)، 1/0، high/low و … .

✅نکته مهم

آردوینو ثابت (constant)های true و HIGH را 1 و ثابت‌های false و LOW را 0 تعریف می‌کند.

حالت هشت سوئیچ را می‌توان به‌جای نیاز به هشت بایت یا اعداد صحیح در یک مقدار 8 بیتی بسته بندی کرد. مثال در راه حل این دستور العمل نشان می دهد که چگونه می توان هشت مقدار را به صورت جداگانه در یک بایت تنظیم یا پاک کرد

وقتی که می‌خواهیم هشت وضعیت را ذخیره کنیم، می‌توانیم از یک بایت 8 بیتی استفاده کنیم. این 8 بیت می‌توانند به صورت جداگانه تنظیم یا پاک شوند. این روش معمولاً در برنامه‌نویسی میکروکنترلرها و دستگاه‌های الکترونیکی استفاده می‌شود.

در برنامه‌نویسی، عبارت “فلگ” به مقادیری اشاره دارد که وضعیت یک جنبه خاص از برنامه را ذخیره می‌کنند. در این اسکچ، بیت‌ فلگ‌ها با استفاده از تابع bitRead خوانده می‌شوند و با استفاده از توابع bitSet یا bitClear تنظیم یا پاک می‌شوند.

این توابع دو پارامتر دارند: مورد اول، مقدار خواندن یا نوشتن است (در مثال گفته شده، فلگ‌ها) و مورد دوم، موقعیت بیت (bit position) است که نشان می‌دهد خواندن یا نوشتن کجا باید انجام شود. موقعیت بیت 0 کم اهمیت ترین (راست ترین) بیت است. موقعیت 1 دومین موقعیت از سمت راست است و به همین ترتیب ادامه دارد. بنابراین:

همچنین، تابعی به نام bit وجود دارد که مقدار هر موقعیت بیت (bit position) را برمی‌گرداند:

 

شیفت بیت‌ها

برای انجام عملیات شیفت بیتی که بیت‌ها را در یک بایت (byte)، اینتیجر (int) یا لانگ (long) به چپ یا راست منتقل می‌کند، می‌توانید از عملگر << برای شیفت به چپ و از عملگر >> برای شیفت به راست استفاده کنید. این عملگرها بیت‌های یک مقدار را به تعداد مشخصی به سمت چپ یا راست منتقل می‌کنند.

این فرگمنت متغیر x را برابر با ۶ قرار می‌دهد. سپس بیت‌ها را یک جایگاه به چپ شیفت می‌دهد و مقدار جدید (۱۲) را پرینت می‌کند. بعد از آن، این مقدار، دو جایگاه به راست شیفت داده می‌شود (و در این مثال برابر با ۳ می‌شود):

نحوه عملکرد عملیات شیفت بیتی به این صورت است: وقتی عدد 6 (که در دودویی 0110 است) یک جایگاه به چپ شیفت داده می‌شود مقدار آن ۱۲ می‌شود، زیرا مقدار دودویی به 1100 تبدیل می‌شود که در مبنای دهدهی برابر با ۱۲ است. وقتی 1100 دو جایگاه به راست شیفت داده می‌شود، مقدار آن 0011 می‌شود که در مبنای دهدهی برابر با ۳ است.

جابه‌جایی یک عدد به سمت چپ به تعداد  nبرابر است با مکان، معادل با ضرب‌کردن آن عدد در 2 به توان n است. به همین ترتیب، جابه‌جایی یک عدد به سمت راست به تعداد n برابر است با مکان، معادل با تقسیم‌کردن آن عدد بر 2 به توان n. خلاصه این موارد به شرح زیر می‌باشد:

جابه‌جایی به سمت چپ (شیفت چپ):

تنظیم و خواندن بیت‌ها + شیفت بیت‌ها | قسمت شانزدهم آموزش آردوینو

جابه‌جایی به سمت راست (شیفت راست):

تنظیم و خواندن بیت‌ها + شیفت بیت‌ها | قسمت شانزدهم آموزش آردوینو                                                              

برای مثال، به عبارات زیر توجه کنید:

چیپ کنترلر آردوینو می‌تواند عملیات شیفت بیتی را به طور مؤثرتری نسبت به ضرب و تقسیم انجام دهد. همچنین، ممکن است شما با کدی روبه‌رو شوید که از عملیات شیفت بیتی (bit shift) برای ضرب و تقسیم استفاده می‌کند:

شاید در نگاه اول، عبارت (a << 1) + (b >> 2) شبیه به (a * 2) + (b / 4) نباشد، اما هر دو عبارت کار یکسانی انجام می‌دهند. کامپایلر آردوینو به اندازه‌ای هوشمند است که بتواند تشخیص دهد ضرب یک عدد صحیح در یک ثابت که توانی از دو است، معادل با یک عملیات شیفت می باشد و همان کدی را ایجاد می‌کند که نسخه‌ای از عملیات شیفت استفاده می‌کند. به‌طورکلی، خواندن سورس کدی که دارای عملگرهای ریاضی (Arithmetic Operators) می‌باشد، برای ما آسان‌تر است؛ بنابراین وقتی هدف ضرب و تقسیم است، این سورس کد، بهتر است.

در آردوینو، توابع مختلفی برای کار با بیت‌ها و بایت‌ها وجود دارد که به شما این امکان را می‌دهند که عملیات‌های پایه‌ای را روی بیت‌ها انجام دهید. در اینجا توضیح مختصری در مورد هر یک از این توابع ارائه شده است:

  • lowByte(): کوچک‌ترین بایت (سمت راست‌ترین) یک متغیر را استخراج می‌کند.
  • highByte(): بزرگ‌ترین بایت (سمت چپ‌ترین) در یک کلمه یا دومین بایت کوچک از یک نوع داده بزرگ‌تر را استخراج می‌کند.
  • bitRead(): مقدار بیت موردنظر در متغیر موردنظر را می‌خواند.
  • bitWrite(): برای 1 کردن یا 0 کردن مقدار بیت مورد نظر استفاده می شود.
  • bitSet(): برای 1 کردن مقدار بیت مورد نظر استفاده می شود.
  • bitClear(): بیت موردنظر را پاک می‌کند. به‌عبارت‌دیگر، آن بیت را صفر می‌کند.
  • bit(): مقدار بیت مشخص شده را محاسبه می‌کند یا به‌عبارت‌دیگر، مقدار بیت موردنظر ما را برمی‌گرداند.                                                                       

استخراج بایت‌های High و Low به‌صورت int یا long

اگر شما بخواهید بزرگ‌ترین بایت (چپ‌ترین) یا کوچک‌ترین بایت (راست‌ترین) “یک” در عدد صحیح را استخراج کنید، (به‌عنوان‌مثال، هنگام ارسال مقادیر صحیح به‌عنوان بایت در یک سریال یا خط ارتباطی دیگر) می‌توانید از توابع highByte(i) و lowByte(i) استفاده نمایید؛ به این صورت که از تابعlowByte(i) برای دریافت کوچک‌ترین بایت “یک” در عدد صحیح و از تابع highByte(i) برای دریافت بزرگ‌ترین بایت “یک” در عدد صحیح می‌توانید استفاده کنید.

اسکچ زیر یک مقدار صحیح را به کوچک‌ترین بایت و بزرگ‌ترین بایت تبدیل می‌کند:

در این اسکچ intValue به عنوان نمونه آورده شده است که مقدار یک عدد صحیح را به همراه کوچک‌ترین و بزرگ‌ترین بایت‌های آن (با توضیحات) پرینت می‌کند:

برای استخراج مقادیر بایت از یک متغیر نوع long در آردوینو، ابتدا باید مقدار ۳۲ بیتی long را به دو کلمه (word) ۱۶ بیتی تقسیم کنید و سپس آن‌ها را به بایت‌ها تبدیل کنید، همان‌طور که در کد قبلی نشان داده شد. در زمان نوشتن این مطلب، کتابخانه استاندارد آردوینو تابعی برای انجام این عملیات روی یک متغیر long نداشت، اما شما می‌توانید کد زیر را به اسکچ خود اضافه کنید تا بتوانید این کار را انجام دهید:

این عبارات ماکرو (macro) هستند: highWord یک عملیات شیفت 16 بیتی برای تولید یک مقدار 16 بیتی انجام می دهد و lowWord هم 16 بیت پایین را با استفاده از عملگر بیتی And ماسک می کند.

 

✅نکته

تعداد بیت‌ها در یک int در پلتفرم‌های مختلف متفاوت است. در آردوینو 16 بیت است؛ اما در محیط های دیگر 32 بیت است. کلمه ی (word) که اینجا به یک مقدار 16 بیتی اشاره دارد.

 

این کد مقدار 16909060، 32 بیتی (هگزادسیمال 0x1020304) را به مقادیر بیش تر (High) و کمتر (Low) تشکیل دهنده 16 بیتی خود تبدیل می کند:

این کد مقادیر عددی زیر را پرینت می‌کند:

توجه داشته باشید که 772 در اعشار، 0x0304 در هگزادسیمال است که کلمه مرتبه پایین (low-order word) (16 بیتی) از longValue 0x1020304 می باشد.

 

تشکیل int یا long از High و Low Byte

در ادامه درباره این توضیح خواهیم داد که شما چگونه می‌توانید یک مقدار صحیح 16 بیتی (int) یا 32 بیتی (long) از بایت های جداگانه ایجاد کنید؛ به عنوان مثال، هنگام دریافت اعداد صحیح به عنوان بایت های جداگانه از طریق یک پیوند ارتباطی سریال.

از تابع word(h,l) برای تبدیل دو بایت به یک عدد صحیح آردوینو استفاده کنید. در اینجا کدی آورده شده است که بایت‌های high و low منفرد را به یک عدد صحیح تبدیل می‌کند:

word بایت های high و low را در یک مقدار 16 بیتی جمع می کند. خروجی مقدار صحیح، بایت low، بایت high و بایت هایی است که به یک مقدار صحیح تبدیل می شوند:

آردوینو تابعی برای تبدیل یک مقدار long 32 بیتی به دو کلمه (word) 16 بیتی ندارد، اما شما می‌توانید با افزودن کد زیر به بالای اسکچ خود، قابلیت ()makeLong را اضافه کنید:

کد زیر کامند (دستوری) را تعریف می‌کند که مقدار high را 16 بیت به سمت چپ منتقل می‌کند و مقدار low را به ان اضافه می کند:

خروجی عبارت است از:

✅نکته

word در هنگام کامپایل بردهای 8 بیتی مانند برد آردوینو Uno به 16 بیت اشاره دارد. همچنین، هنگام کامپایل بردهای 32 بیتی، یک word شامل 32 بیت و یک half word شامل 16 بیت می باشد.

 

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *