منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

التحويل بين العشري decimal و الثنائى المكود عشري binary-coded-decimal (BCD)

اذهب الى الأسفل

التحويل بين العشري decimal و الثنائى المكود عشري binary-coded-decimal (BCD) Empty التحويل بين العشري decimal و الثنائى المكود عشري binary-coded-decimal (BCD)

مُساهمة من طرف Admin الأحد سبتمبر 22, 2019 9:20 pm

التحويل بين العشري decimal و الثنائى المكود عشري binary-coded-decimal (BCD)

عند التعامل مع الميكروكونترولر ، ستصادف عددًا لا بأس به من المكونات التي توفر البيانات - أو تتطلب بيانات ثنائية مكودة عشرى BCD .
إذا كنت معتادًا على التحويل بين الثنائي binary والعشري decimal والست عشري hexadecimal ، فهذا أمر واضح إلى حد ما ... ولكن إذا كنت قد بدأت للتو في التعامل باستخدام المتحكمات الدقيقة ، فقد تجد نفسك في حيرة. آمل أن يجعل هذا الموضوع الأمور أكثر وضوحًا.
فى النظام BCD لا يتم فيه تخزين القيمة في ذاكرة الوصول العشوائي RAM بتنسيق ثنائي بسيط ، ولكن بدلاً من ذلك يتم بطريقة نصف ثنائية ونصف عشرية. ما يحدث بالفعل هو أن كل رقم من العدد في شكله العشري يتم تخزينه في عدد محدد من البتات ... عادة ما تكون أربعة أو ثمانية.
على سبيل المثال ، إذا كنت بحاجة إلى تخزين العدد العشري 37 في شكل BCD ، مع تخصيص أربعة بت لكل خانة ، فسيتم ترميزه على النحو التالي:

التحويل بين العشري decimal و الثنائى المكود عشري binary-coded-decimal (BCD) 99262693B2F1435AB1E950DBCC76AF0D

لذلك ، إذا كنت تقرأ هذه البايت من ذاكرة الوصول العشوائي (أو من مكون آخر) وكنت تتوقع الحصول على القيمة العشرية 37 ، فستحصل فعليًا على ... 55. ما عليك فعله هو قراءة البايت ، ثم تحويله مرة أخرى من BCD إلى عشري ، قبل استخدامه. ليست صعبة ، مجرد مربكة بعض الشيء.
لماذا هذا النظام ضروري؟
كان هذا النظام شائع جدا فى أنظمة الكمبيوتر الأقدم بكثير التى تعمل بمجموعات التعليمات البدائية ، ولكن الآن لا تستخدم . من حين لآخر قد ترى أن هذا النظام يستخدم حيث تكون الرياضيات التي تتطلب دقة غير محدودة أكثر أهمية من تركيب الأرقام في تنسيقات بيانات ذات عرض ثابت (مثل في التطبيقات المالية والعلمية). ولكن الأماكن التي نراها أكثر في مجال الإلكترونيات الرقمية ؛ التى غالبا ما تنطوي على الساعات ، أو أنواع أخرى من العروض الرقمية. على سبيل المثال: تقوم معظم آلات حاسبة الجيب القديمة بتخزين الأرقام في تظام BCD ، لأنها تجعل دائرة العرض أبسط بكثير.
دعونا نلقي نظرة على كيفية التحويل من وإلى BCD.

التحويل من BCD إلى العشري
لنفترض أنك قرأت بايت من مكون تقول الداتا شيت أنه بنظام BCD ، مع أربعة بت لكل رقم digit. ربما لم تعلن الداتا شيت صراحة أنه "BCD" - ربما تكون قد أعلنت فقط خانة "العشرات"“tens” بشكل منفصل بدلاً من ذلك:

التحويل بين العشري decimal و الثنائى المكود عشري binary-coded-decimal (BCD) E885C600B3764ED892DE5464DB245688

الشكل يبين مقتطف من الداتا شيت لشريحة الوقت الفعلي DS1307 ، التي تصف تنسيق البيانات للدقائق والثواني. على الرغم من أنها لا تشير صراحةً إلى "BCD" ، إلا أنها توضح أن العشرات مخزّنة في وحدات بتات منفصلة (4-6) والآحاد مخزنة فى البتات (0-3) .
لتحويل هذا إلى قيمة عشرية عادية ، نقوم بفصل الأرقام digits ببعض القناع masking الثنائي البسيط ، وضرب قيمة العشرات في 10 ، ثم أضافتهم (جمعهم) معًا:

الكود:

bcd_value = read_from_somewhere();      // lets say bcd_value = 55, or 0x37
tens = bcd_value >> 4;                  // tens = 3 (by shifting down the number four places)
units = bcd_value & 0x0F;              // units = 7 (the 0x0F filters-out the high digit)
final_value = (tens * 10) + units;      // final_value = 37
 

من المفيد الإشارة هنا إلى أن التمثيل السداسي عشري لقيمة BCD يطابق القيمة النهائية. على سبيل المثال: 37 في النظام العشرى يصبح 0x37 في BCD . إذا كنت تستخدم ثوابت في شفرتك والتى تكون قيم BCD ، فمن المستحسن بشدة استخدامها في شكلها السداسي عشر ، حيث إنها ستوضح ما تفعله شفرتك.

التحويل من عشري إلى BCD
للقيام بذلك ، يجب أن نفصل رقم العشرات tens عن رقم الآحاد units ، ونزحزح shift العشرات لأربعة أماكن ، ثم نجرى عملية OR بينهما معا:


الكود:
orig_value = 35;                // original value we want to encode in BCD
tens = orig_value / 10;          // tens = 3 (by integer division)
units = orig_value % 10;        // units = 5 (by modulus)
bcd_value = (tens << 4) | units; // bcd_value = 53, or 0x35
 (by shifting the tens up four places and binary-OR'ing it with the units)
 
من المعروف أن زحزحة جهة اليسار لمكان واحد تعادل الضرب فى 2 والزحزحة جهة اليسار لأربع أماكن تعادل الضرب فى 16 ، كما أن عملية OR تعادل الجمع (+) ، وبالتالى يكون لدينا الصيغة التالية :


الكود:
unsigned int tmp1, tmp2, minute;
tmp1 = minute / 10;              //Write tens of minute
 tmp2 = minute % 10;              //Write unit of minute
 minute = tmp1 * 16 + tmp2;        //Includes all value

يمكن وضع هذه التحويلات على هيئة دوال كما يلى :

الكود:
 // turns a standard byte into a BCD equivalent
unsigned int DecToBcd(unsigned int val)
{
  return( ((val/10) << 4) | (val%10) );
}

// turns a BCD-encoded byte back into a standard one
unsigned int BcdToDec(unsigned int bcd)
{
  return( ((bcd >> 4) * 10) + (bcd&0x0F) );
}

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الرجوع الى أعلى الصفحة

- مواضيع مماثلة

 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى