قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 31-07-2015, 06:53 AM المشاركة 9   
افتراضي



توليد التمثيل النقطى (الصورة النقطية) Bitmaps :

الآن يأتى السؤال الصعب عن كيفية توليد الصور النقطية لكل الأحرف النصية التى نريد أن تكون معتمدة بواسطة الشاشة الخاصة بنا .
الإسلوب المباشر والواضح هو أن تأخذ ورقة رسم بيانى وقلم رصاص ، وترسم الأحرف وتستنتج البتات الثمانية لكل حرف.
الإسلوب الثانى والأسهل نوعا ما ، هو العثور على البرنامج الذى يمكنه القيام بذلك نيابة عنك . هذا بالتأكيد خيار جيد . يوجد العديد من التطبيقات المتاحة على شبكة الإنترنت والتى بها شبكة من المربعات ، يمكنك فقط نقر المربعات التى تريد تشغيلها ، وسوف يقوم البرنامج بتوليد الصور النقطية نيابة عنك .
الإسلوب الثالث ، والأكثر انتشارا ، هو أن تقترض عمل شخص آخر ، ربما يوصف هذا النهج بالكسل ، ولكنك بحاجة إلى التركيز أكثر على جانب البرمجة بدلا من الجلوس لعدة أيام لتوليد الصور النقطية .
سوف نستخدم الخط 8x8 لأنه يمكن أن يعطى تفاصيل أكثر لنقط الحرف فيصبح واضحا bold ، بحيث يمكن قراءته جيدا من مسافة بعيدة .
فيما يلى الصور النقطية الكاملة لعدد 96 حرف ، كل حرف مكون من 8 بايت فى شكل مصفوفة ثنائية الأبعاد تحتوى على 96 صف و 8 أعمدة font[96][8] .
الحرف الأول هو "الفراغ" space ويقابله العدد العشرى 32 فى جدول حروف أسكى . وبالتالى فإن هذا الجدول يكون مزاحا بقيمة 32 عن أكواد أسكى للحروف . وبالتالى ، فإن الحرف الذى نريد عرضه يكون موجودا فى هذا الجدول عند " قيمة أسكى للحرف مطروحا منها 32 " . على سبيل المثال ، الحرف “A” قيمة أسكى له هى “65” ، لذلك فإن الصورة النقطية له فى الجدول سوف نجدها عند العنصر الذى ترتيبه “65-32=33” الثالث والثلاثين من مصفوفة الخطوط فى البعد الذى يمثل الصف . وبالتالى فإن عرض الثمانى بايتات من المصفوفة font[33][] سوف يعطينا الحرف “A” .

كود:
{0x3e,0x7e,0xc8,0xc8,0x7e,0x3e,0x00,0x00}, // A
الآن ، علينا عمل ملف باسم font.h ونسخ الكود بكامله فيه . سوف نقوم بتضمين include هذا الملف فى البرنامج .

كود:
// defines 8x8 ASCII characters 0x20-0x7F (32-127)
unsigned const char font[96][8] = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, //
{0x00,0x60,0xfa,0xfa,0x60,0x00,0x00,0x00}, // !
{0x00,0xe0,0xe0,0x00,0xe0,0xe0,0x00,0x00}, // "
{0x28,0xfe,0xfe,0x28,0xfe,0xfe,0x28,0x00}, // #
{0x24,0x74,0xd6,0xd6,0x5c,0x48,0x00,0x00}, // $
{0x62,0x66,0x0c,0x18,0x30,0x66,0x46,0x00}, // %
{0x0c,0x5e,0xf2,0xba,0xec,0x5e,0x12,0x00}, // &
{0x20,0xe0,0xc0,0x00,0x00,0x00,0x00,0x00}, // '
{0x00,0x38,0x7c,0xc6,0x82,0x00,0x00,0x00}, // (
{0x00,0x82,0xc6,0x7c,0x38,0x00,0x00,0x00}, // )
{0x10,0x54,0x7c,0x38,0x38,0x7c,0x54,0x10}, // *
{0x10,0x10,0x7c,0x7c,0x10,0x10,0x00,0x00}, // +
{0x00,0x05,0x07,0x06,0x00,0x00,0x00,0x00}, // ,
{0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00}, // -
{0x00,0x00,0x06,0x06,0x00,0x00,0x00,0x00}, // .
{0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,0x00}, // /
{0x7c,0xfe,0x9a,0xb2,0xfe,0x7c,0x00,0x00}, // 0
{0x42,0x42,0xfe,0xfe,0x02,0x02,0x00,0x00}, // 1
{0x46,0xce,0x9a,0x92,0xf6,0x66,0x00,0x00}, // 2
{0x44,0xc6,0x92,0x92,0xfe,0x6c,0x00,0x00}, // 3
{0x18,0x38,0x68,0xc8,0xfe,0xfe,0x08,0x00}, // 4
{0xe4,0xe6,0xa2,0xa2,0xbe,0x9c,0x00,0x00}, // 5
{0x3c,0x7e,0xd2,0x92,0x9e,0x0c,0x00,0x00}, // 6
{0xc0,0xc6,0x8e,0x98,0xf0,0xe0,0x00,0x00}, // 7
{0x6c,0xfe,0x92,0x92,0xfe,0x6c,0x00,0x00}, // 8
{0x60,0xf2,0x92,0x96,0xfc,0x78,0x00,0x00}, // 9
{0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00}, // :
{0x00,0x05,0x37,0x36,0x00,0x00,0x00,0x00}, // ;
{0x10,0x38,0x6c,0xc6,0x82,0x00,0x00,0x00}, // <
{0x28,0x28,0x28,0x28,0x28,0x28,0x00,0x00}, // =
{0x00,0x82,0xc6,0x6c,0x38,0x10,0x00,0x00}, // >
{0x40,0xc0,0x8a,0x9a,0xf0,0x60,0x00,0x00}, // ?
{0x7c,0xfe,0x82,0xba,0xba,0xf8,0x78,0x00}, // *
{0x3e,0x7e,0xc8,0xc8,0x7e,0x3e,0x00,0x00}, // A
{0x82,0xfe,0xfe,0x92,0x92,0xfe,0x6c,0x00}, // B
{0x38,0x7c,0xc6,0x82,0x82,0xc6,0x44,0x00}, // C
{0x82,0xfe,0xfe,0x82,0xc6,0xfe,0x38,0x00}, // D
{0x82,0xfe,0xfe,0x92,0xba,0x82,0xc6,0x00}, // E
{0x82,0xfe,0xfe,0x92,0xb8,0x80,0xc0,0x00}, // F
{0x38,0x7c,0xc6,0x82,0x8a,0xce,0x4e,0x00}, // G
{0xfe,0xfe,0x10,0x10,0xfe,0xfe,0x00,0x00}, // H
{0x00,0x82,0xfe,0xfe,0x82,0x00,0x00,0x00}, // I
{0x0c,0x0e,0x02,0x82,0xfe,0xfc,0x80,0x00}, // J
{0x82,0xfe,0xfe,0x10,0x38,0xee,0xc6,0x00}, // K
{0x82,0xfe,0xfe,0x82,0x02,0x06,0x0e,0x00}, // L
{0xfe,0xfe,0x60,0x30,0x60,0xfe,0xfe,0x00}, // M
{0xfe,0xfe,0x60,0x30,0x18,0xfe,0xfe,0x00}, // N
{0x38,0x7c,0xc6,0x82,0xc6,0x7c,0x38,0x00}, // O
{0x82,0xfe,0xfe,0x92,0x90,0xf0,0x60,0x00}, // P
{0x78,0xfc,0x84,0x8e,0xfe,0x7a,0x00,0x00}, // Q
{0x82,0xfe,0xfe,0x98,0x9c,0xf6,0x62,0x00}, // R
{0x64,0xe6,0xb2,0x9a,0xde,0x4c,0x00,0x00}, // S
{0xc0,0x82,0xfe,0xfe,0x82,0xc0,0x00,0x00}, // T
{0xfe,0xfe,0x02,0x02,0xfe,0xfe,0x00,0x00}, // U
{0xf8,0xfc,0x06,0x06,0xfc,0xf8,0x00,0x00}, // V
{0xfe,0xfe,0x0c,0x18,0x0c,0xfe,0xfe,0x00}, // W
{0xc6,0xee,0x38,0x10,0x38,0xee,0xc6,0x00}, // X
{0xe0,0xf2,0x1e,0x1e,0xf2,0xe0,0x00,0x00}, // Y
{0xe6,0xce,0x9a,0xb2,0xe2,0xc6,0x8e,0x00}, // Z
{0x00,0xfe,0xfe,0x82,0x82,0x00,0x00,0x00}, // [
{0x80,0xc0,0x60,0x30,0x18,0x0c,0x06,0x00}, // "\"
{0x00,0x82,0x82,0xfe,0xfe,0x00,0x00,0x00}, // ]
{0x10,0x30,0x60,0xc0,0x60,0x30,0x10,0x00}, // ^
{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}, // _
{0x00,0x00,0xc0,0xe0,0x20,0x00,0x00,0x00}, // `
{0x04,0x2e,0x2a,0x2a,0x3c,0x1e,0x02,0x00}, // a
{0x82,0xfc,0xfe,0x22,0x22,0x3e,0x1c,0x00}, // b
{0x1c,0x3e,0x22,0x22,0x36,0x14,0x00,0x00}, // c
{0x0c,0x1e,0x12,0x92,0xfc,0xfe,0x02,0x00}, // d
{0x1c,0x3e,0x2a,0x2a,0x3a,0x18,0x00,0x00}, // e
{0x12,0x7e,0xfe,0x92,0xc0,0x40,0x00,0x00}, // f
{0x19,0x3d,0x25,0x25,0x1f,0x3e,0x20,0x00}, // g
{0x82,0xfe,0xfe,0x10,0x20,0x3e,0x1e,0x00}, // h
{0x00,0x22,0xbe,0xbe,0x02,0x00,0x00,0x00}, // i
{0x02,0x23,0x21,0xbf,0xbe,0x00,0x00,0x00}, // j
{0x82,0xfe,0xfe,0x08,0x1c,0x36,0x22,0x00}, // k
{0x00,0x82,0xfe,0xfe,0x02,0x00,0x00,0x00}, // l
{0x3e,0x3e,0x30,0x18,0x30,0x3e,0x1e,0x00}, // m
{0x3e,0x3e,0x20,0x20,0x3e,0x1e,0x00,0x00}, // n
{0x1c,0x3e,0x22,0x22,0x3e,0x1c,0x00,0x00}, // o
{0x21,0x3f,0x1f,0x25,0x24,0x3c,0x18,0x00}, // p
{0x18,0x3c,0x24,0x25,0x1f,0x3f,0x21,0x00}, // q
{0x22,0x3e,0x1e,0x22,0x38,0x18,0x00,0x00}, // r
{0x12,0x3a,0x2a,0x2a,0x2e,0x24,0x00,0x00}, // s
{0x00,0x20,0x7c,0xfe,0x22,0x24,0x00,0x00}, // t
{0x3c,0x3e,0x02,0x02,0x3c,0x3e,0x02,0x00}, // u
{0x38,0x3c,0x06,0x06,0x3c,0x38,0x00,0x00}, // v
{0x3c,0x3e,0x06,0x0c,0x06,0x3e,0x3c,0x00}, // w
{0x22,0x36,0x1c,0x08,0x1c,0x36,0x22,0x00}, // x
{0x39,0x3d,0x05,0x05,0x3f,0x3e,0x00,0x00}, // y
{0x32,0x26,0x2e,0x3a,0x32,0x26,0x00,0x00}, // z
{0x10,0x10,0x7c,0xee,0x82,0x82,0x00,0x00}, // {
{0x00,0x00,0x00,0xee,0xee,0x00,0x00,0x00}, // |
{0x82,0x82,0xee,0x7c,0x10,0x10,0x00,0x00}, // }
{0x40,0xc0,0x80,0xc0,0x40,0xc0,0x80,0x00}, // ~
{0x1e,0x3e,0x62,0xc2,0x62,0x3e,0x1e,0x00}, //
};

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 31-07-2015, 07:08 AM المشاركة 10   
افتراضي


تدريب رقم 3 : استخدام ملف الخط font.h لعرض أى حرف من اختيارنا :

كود:
/******************************************************
LED Matrix Display , MIKROC ,Using arrays and ASCII FONT
Display one fixed character : A
Rows scanning = PORTB connected to anodes ,
Data connected to PORTC , cathodes

*******************************************************/
//Define Matrix Character Information as 8 byte array
#include "font.h"
char row_select[8]={1,2,4,8,16,32,64,128};
char i ;
 void main ()
{
TRISB=0;
TRISC=0;
PORTB=0;
PORTC=0;

   while(1)
   {
	for(i=0 ; i<8 ; I++)
	{
	PORTB=row_select[i]; //select row as array element
	PORTC=~font['A'-32][i];//send data to port C as array element
	delay_ms(5); // short delay
   }
      }
}
نتائج المحاكاة :



اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 31-07-2015, 03:34 PM المشاركة 11   
افتراضي ثالثا : معالجة البيانات بمسجلات الإزاحة والليد ماتريكس Shift Registers and LED Matrix


ثالثا : معالجة البيانات بمسجلات الإزاحة والليد ماتريكس Shift Registers and LED Matrix
مسجلات الإزاحة يمكن أن تأخذ بيانات تسلسلية (متتالية) بت تلو البت (بت واحد فى كل مرة) ، وتقوم بإزاحة هذه البتات مثل السير الناقل ، وتعطى النتيجة فى شكل خرج متوازى على أطرافها ، ولذلك فهى تسمى مسجلات إزاحة دخل تسلسلى خرج متوازى .



أهم ميزة لهذه المسجلات أنه يمكن توصيلها معا على التتابع cascaded لعمل سلسلة طويلة طويلة تسمى "سلسلة ديزى" daisy chain (عنقودية ، ملضومة مثل العنقود) .
كل ما تحتاجه هذه السلسلة هو ثلاثة أسلاك من أجل المدخلات ، سلك (خط) من أجل تطبيق بت البيانات data bit ، والثانى من أجل بت الساعة clock bit لزحزحة بت البيانات بالتزامن مع الساعة (الشكل التسلسلى) ، والثالث من أجل بت المزلاج latch bit ، وهى نبضة تعطى عندما يتم إرسال كافة البيانات ، وهذه النبضة تجعل البيانات تظهر على أطراف الخرج فى الشكل المتوازى .
يوجد العديد من مسجلات الإزاحة المتاحة ، لكن الأكثر استخداما هى الدائرة المتكاملة 74HC595 . على سبيل المثال ، إذا تم توصيل اثنين من مسجلات الإزاحة هذه على التتابع ، فسوف نكون قادرين على أن نرسل 16 بت من البيانات باستخدام ثلاثة خطوط فقط من خطوط الدخل / الخرج الرقمى ، والتى لا تشكل مشكلة كبيرة على الميكروكونترولر حتى الصغير منها .

عملية مسح الصفوف Scanning Rows :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 31-07-2015, 03:40 PM المشاركة 12   
افتراضي عملية مسح الصفوف Scanning Rows :


عملية مسح الصفوف Scanning Rows :
الآن القضية هى اختيار الصفوف ، لأن لدينا 8 صفوف وعلينا اختيار صف واحد فى كل مرة ، فلدينا العديد من الخيارات ، وسوف نستعرض بعضها :
1- استخدام الدائرة المتكاملة CD4017 :
وهى عداد عشرى ، فهى تأخذ خط دخل/خرج واحد لنبضات الساعة الخاصة بها CLK ، وتقوم بتحديد مخارجها بالحالة المرتفعة مخرج تلو الآخر بعد كل نبضة ساعة ، بعد 10 نبضات ساعة سوف تبدأ الدورة من جديد بالخرج الأول .
لكن ، هناك مشكلتين ، المشكلة الأولى أن لها 10 مخارج ونريد إعادة توقيتها مرة أخرى إلى خط المخرج الأول بعد 8 مخارج فقط ، حسنا ، يمكننا إعطاء نبضتين إضافيتين بعد الثمانى نبضات ، وهذا لا يشكل مشكلة كبيرة .
المشكلة الثانية ، عند بداية إمدادها بالقدرة الكهربية ، تكون المخارج فى حالة غير معروفة ، فلا يمكننا أبدا معرفة كيفية جعل المخرج الأول مرتفعا . لحسن الحظ يوجد طرف إعادة التعيين Reset(MR) ، والذى عندما يتم توقيته (تفعيله) سوف يعيد الدائرة المتكاملة إلى حالة الصفر ، وهو ما يكون مناسب بالنسبة لنا ، وبالتالى فسوف نستخدم خطى دخل/خرج واحد للساعة والآخر للإعادة ، ويمكن استخدام الثمانى مخارج Q0-Q7 لاختيار الصفوف بشكل فردى .



لكن ، ماذا لو قررنا فى وقت لاحق استخدم صفين من ليد ماتريكس 8x8 لعمل شاشة عريضة 16x32 ؟ يمكن لأحدنا أن يفكر فى توصيل دائرتين متكاملتين CD4017 على التتابع ، وهذا مقبول ، ولكن عندما يتم توقيت المرة الحادية عشرة فإن الدائرة المتكاملة التالية سوف تحصل على نبضة وتخطو خطوة إلى الأمام ، لكن الشريحة الأولى سوف يتم إعادة تعيينها مرة أخرى لاختيار الصف الأول ، وبالتالى سوف يكون لدينا صفين مختارين ونحصل على سلوك غير مرغوب فيه . لذلك فإن هذا الخيار يكون غير جيد إذا كنا نريد توسيع التصميم .

2- استخدام دائرة متكاملة لحل الشفرة من 3 إلى 8 خط (الدائرة المتكاملة 74HC138 ) :
ثمة خيار آخر وهو استخدام دائرة متكاملة لحل الشفرة 3 إلى 8 خط . هذه الدائرة المتكاملة تأخذ ثلاثة مدخلات رقمية ، والرقم الثنائى الذى يتم وضعه على هذه الخطوط الثلاثة سوف يحدد الخرج المقابل . على سبيل المثال ، إذا وضع الرقم الثنائى “101” ، وحيث أن هذا الرقم الثنائى يناظر الرقم العشرى “5” فسوف يتم اختيار الخرج “Y5” . هذه الشريحة ، على وجه الخصوص ، تقوم بتحديد الطرف المختار بالحالة المنخفضة ، وجميع الأطراف الأخرى بالحالة المرتفعة ، وهو ما يعتبر ترتيب جيد للتشغيل باستخدام 8 ترانزستورات نوع PNP (الجهد المنخفض على قاعدة هذا النوع يؤدى إلى توصيله) ، كما أنه يمكننا إيجاد دائرة متكاملة لحل شفرة 3 إلى 8 خط بمخارج مرتفعة فى الحالة الفعالة والتى يمكن استخدامها مباشرة لتشغيل صفوف الشاشة .
بالمثل الدائرة المتكاملة 74HC154 ، وهى لحل شفرة 4 إلى 16 خط (بت) . فهى يمكن أن تقبل رقم ثنائى مكون من 4 بت على مداخلها الأربعة لاختيار واحد من مخارجها الستة عشر .









3- استخدام مسجلات إزاحة على التتابع Using Cascaded Shift Registers :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 31-07-2015, 03:42 PM المشاركة 13   
افتراضي 3- استخدام مسجلات إزاحة على التتابع Using Cascaded Shift Registers :



3- استخدام مسجلات إزاحة على التتابع Using Cascaded Shift Registers :
الخيار الأخير هو استخدام مسجل إزاحة آخر لاختيار الصف . نظرا لأنه يتم اختيار صف فى كل مرة يتم فيها إرسال بيانات الأعمدة ، فليس هناك حاجة لتشغيل مسجلات الإزاحة بشكل منفرد ، ويمكننا توصيلها معا على التتابع ، ووضع نبضات الساعة (توقيت البيانات) على مسجل الإزاحة الأول ، وإرسال 3 بايت (24 بت) ، على سبيل المثال ، أول 2 بايت تحتوى على بيانات الأعمدة والبايت الأخير يحتوى على بتات اختيار الصف . بهذه الطريقة فإننا سوف نحتاج فقط إلى 3 خطوط دخل/خرج من الميكروكونترولر لتشغيل الشاشة بالكامل ، حتى إذا قمت بإضافة المزيد من الوحدات لجعل الشاشة أطول، فقط كل ما عليك هو إضافة المزيد من مسجلات الإزاحة ، لكن لا زلت تحتاج فقط إلى 3 خطوط دخل/خرج وهى : البيانات Data والساعة Clock و المزلاج Latch .
إذا تم استخدام هذا التكوين ، فإنه لاختيار صف row فإنه سوف يتم تحديد البت المقابلة بمسجل الإزاحة الخاص بالصفوف بواحد “1” (أنود مشترك)، ولاختيار عامود فسوف يتم تحديد بت مسجل الإزاحة الخاص بالأعمدة بصفر “0” (كاثود مشترك) . عند استخدام مسجل الإزاحة 74HC595 فإن خطوط الدخل/الخرج الخاصة به لديها القدرة على تداول التيار الكافى لصف كامل به 16 ليد فى حالة تشغيل . يمكنك إضافة ترانزستورات تقوية من أجل الصفوف إذا كنت بحاجة إلى إضافة المزيد من الوحدات معا وهو ما يحتاج إلى المزيد من القدرة لإضاءة العديد من الليدات فى نفس الصف . عموما إضافة الترنزستور تحسن درجة السطوع .
فيما يلى مثال لشاشة تحتوى على وحدتين ليد ماتريكس 8x8 . لاحظ أن مخطط الدائرة للشاشة فقط وأنه لا يتضمن أى ميكروكونترولر ، حتى يبقى الخيار متروك لك .



فى المخطط أعلاه ، يظهرالليد ماتريكس كوحدتين منفصلتين ، فى حين أنهما فى الواقع يمكن أيضا أن يكونان وحدة واحدة ذات لونين ، ولكننا سوف نعتبرهما كوحدتين منفصلتين ، والصفوف ذات الأنودات المشتركة متصلة مع بعضها على التوازى ، لتشكل 8 صفوف ، فى حين أن الأعمدة ذات الكاثودات المشتركة تكون منفصلة عن بعضها البعض ، لتشكل 16 عامود .

فهم المزيد عن مسجل الإزاحة 74HC595 :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 31-07-2015, 03:47 PM المشاركة 14   
افتراضي فهم المزيد عن مسجل الإزاحة 74HC595 :


فهم المزيد عن مسجل الإزاحة 74HC595 :
حيث أن شاشتنا سوف تعتمد بشكل كبير على مسجلات الإزاحة ، فإنه من المناسب مراجعة قليل من المعلومات حول هذا العنصر . يمكن اعتبار مسجلات الإزاحة على أنها محولات بيانات من تسلسلى إلى متوازى ، فهى تأخذ دخل البيانات تسلسليا على خط بيانات واحد ، وتظهر النتائج على خرجها كبايت كامل .








مسجل الإزاحة 74HC595 بداخله سلسلة من 8 مواقع ذاكرة "تسمى مسجلات الإزاحة shift registers والتى يمكن أن تمرر البتات المرسلة من خلال أول موقع ذاكرة إلى الموقع التالى ، تماما مثل عملية "الدفع" push ، فعند وصول بت جديدة إلى الموقع الأول يتم زحزحة جميع البتات بخطوة إلى المستوى التالى نتيجة لتطبيق نبضة على طرف الساعة .
المزلاج (القفل) latch هو ذاكرة خاصة ، والتى عند تفعيلها تأخذ لقطة (نسخة) من ذاكرات مسجلات الإزاحة وتظهرها على ثمانى مخارج . بعد ذلك ، إذا تغيرت قيم ذاكرات مسجلات الإزاحة فإن هذا التغيير لا ينعكس على أطراف الخرج حتى يتم تفعيل المزلاج مرة أخرى . وهذه تعتبر آلية جيدة ، لأنها لن تظهر البتات المزاحة على المخارج إلا عندما ينتهى إرسال البيانات التى نرغب فى أن تنعكس على المخارج .
ذاكرة المزلاج لديها خرج تحكم إضافى يسمى "تمكين الخرج" output enable . عندما يكون هذا الخط منخفضا فإن ذاكرة المزلاج تعكس آحاد 1s أوتعكس أصفار 0s على المخارج ، وعندما يكون هذا الخط مرتفعا فإن أطراف المخارج تكون عمليا مفصولة عن الذاكرة ، ولا تكون واحد ولا صفر . ببساطة يقال أنها فى الحالة الثالثة ، والتى تسمى "محايدة" . سوف نقوم بتوصيل هذا الطرف ، فى جميع مسجلات الإزاجة ، بشكل دائم إلى الأرضى ، بحيث يتم تمكين الخرج بشكل دائم ( إذا أردنا التحكم فى السطوع الكامل للشاشة من خلال البرمجيات يمكنك توصيل هذا الطرف بخرج فى شكل تعديل عرض النبضة PWM للتحكم فى شدة الإضاءة ، وهذا من شأنه يحتاج إلى خط دخل / خرج آخر من الميكروكونترولر ) .
الطرف RST هو طرف إعادة التعيين reset ، عندما يعطى نبضة صغيرة من المنطق “0” سوف يقوم بتحديد جميع مسجلات الأزاحة بأصفار ، سوف نقوم بتوصيل مثل هذا الطرف بالمنطق “1” بشكل دائم لأننا لا نرغب فى إعادة تعيين مسجلات الإزاحة .
الآن جاء دور طرف البيانات التسلسلية DS ، فبغض النظر عن البيانات المقدمة ، سواء واحد أو صفر ، فسوف تأخذ طريقها إلى موقع الذاكرة الأول فى مسجلات الإزاحة . يحدث ذلك عندما يتم إعطاء خط ساعة الإزاحة SHIFT CLOCK نبضة تتحول من الصفر إلى الواحد وتعود مرة أخرى إلى الصفر . هذه النبضة سوف تقوم أيضا بزحزحة محتويات مسجلات الإزاحة الأخرى إلى المستويات التالية بخطوة . كل هذه الإزاحات سوف تجرى داخل مسجلات الإزاحة والنتائج سوف لن تظهر على أطراف المخارج . عندما يكتمل ملو (حشو) البيانات اللازمة ، فإن تطبيق نبضة ، تنتقل من الصفر إلى الواحد وتعود مرة أخرى إلى الصفر ، على طرف ساعة المزلاج LATCH CLOCK سوف تؤدى إلى نسخ بيانات مسجلات الإزاحة إلى أطراف الخرج والحفاظ عليها (مزلاج) هناك بغض النظر عن ما يحدث فى مسجلات الإزاحة .



إزاحة البيانات إلى مسجل الإزاحة التالى :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 31-07-2015, 03:49 PM المشاركة 15   
افتراضي إزاحة البيانات إلى مسجل الإزاحة التالى :


إزاحة البيانات إلى مسجل الإزاحة التالى :
الآن عرفنا كيف يتم إزاحة البيانات داخل مسجل الإزاحة 74HC595 ، فكيف يتم تشكيل سلسلة منها ، بحيث يمكن إزاحة بتات البيانات إلى مسجل الإزاحة التالى ، وهذا من شأنه سوف يكون فعال فى تحويل مسجل الإزاحة 8 بت إلى مسجل إزاحة 16 أو 24 أو حتى 32 بت .




http://fathallaabdelaziz.forumarabia.com/


مسجل الإزاحة يحتوى على 8 مخارج من Q0 إلى Q7 وخرج إضافى Q7’ . هذا الخرج غير موصل إلى المزلاج ولكنه امتداد مباشر لمسجلات الإزاحة الداخلية . لذلك عندما يتم نقل الثمانى بتات فإن الإزاحة فى البت التاسعة سوف تتسبب فى ظهور بت على الطرف Q7’ ، والتى يمكن تغذيتها مباشرة إلى طرف البيانات التسلسلية DS لمسجل الإزاحة التالى . يمكن توصيل أطراف ساعة الإزاحة SHIFT CLOCK و ساعة المزلاج LATCH CLOCK معا وتوقيتها فى وقت واحد . بهذه الطريقة يمكن إنشاء سلسلة غير منتهية بتوصيل مسجلات الإزاحة 74HC595 معا للحصول على مخارج متوازية طويلة .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 31-07-2015, 05:26 PM المشاركة 16   
افتراضي رابعا : إعداد الميكروكونترولر : إنشاء دالة زحزحة البيانات إلى الخارج SH_OUT :


رابعا : إعداد الميكروكونترولر : إنشاء دالة زحزحة البيانات إلى الخارج SH_OUT :

كل ما تحتاجه من الميكروكونترولر هو ثلاثة خطوط دخل / خرج : خط من أجل البيانات data ، وخط من أجل ساعة مسجل الإزاحة ، وخط من أجل ساعة المزلاج (الماسك) . يمكنك استخدام أى ميكروكونترولر ، هنا سوف نستخدم الميكروكونترولر PIC16F877A . وسوف يتم توصيل طرف البيانات التسلسلية DS إلى الطرف RC0 , وطرف ساعة مسجل الإزاحة CLK إلى الطرف RC1 ، وطرف ساعة المزلاج إلى الطرف RC2 .


إنشاء دالة زحزحة البيانات إلى الخارج SH_OUT :

كود:
void SH_OUT (unsigned char d)
{
short j;
for(j=0;j<8;j++) 					// Shift out 8 bits
{
PORTC.B0= d & 1 ; 				// test least significant bit if it is 1
PORTC.B1=1;	PORTC.B1=0; 	// clock
d=d >> 1; 				// shift bits to right by 1 to get next bit
}
}

شرح الدالة SH_OUT () :
كيف تقوم هذه الدالة بإرسال البتات من البايت !!

فى البداية يتم تعريف دالة باسم SH_OUT تقبل (تمرر) بايت واحد ( مثل الصفر و 255 أو أى توليفة أخرى بينهما ) فى شكل متغير محلى يسمى “d” نوع unsigned char لأننا نريد أن نستخدم جميع البتات الثمانية .
بعد ذلك نريد أن نزحزح بتات هذا البايت ، بت تلو البت ، إلى الخارج بدءا من البت ذات القيمة الأدنى bit 0 للمتغير d . يمكن القيام بذلك بعمل اختبار لهذه البت ، إذا ما كانت بواحد أو كانت بصفر ، وذلك عن طريق أجراء عملية AND المنطقية للبايت مع العدد واحد 1(0000001) . وتكون الإجابة (النتيجة) بواحد إذا كانت البت ذات القيمة الأدنى للمتغير d بواحد وبصفر إذا كانت البت بصفر .

كود:
PORTC.B0= d & 1 ;
نقوم بوضع نتيجة هذا الاختبار فى بت البيانات PORTC.B0 ، ثم بعد ذلك نعطى نبضة ساعة لمسجل الإزاحة فى شكل مستوى مرتفع ثم مستوى منخفض على الطرف PORTC.B1 . وهذا من شأنه نقل (وضع) البت الأولى إلى موقع الذاكرة الأول لسلسة سجلات الإزاحة .

كود:
PORTC.B1=1;	PORTC.B1=0;
نحن بحاجة إلى تكرار نفس العملية للبت الثانى للمتغير d ، وهو البت bit 1 ، لذلك نقوم بإزاحة المتغير d إلى اليمين ببت واحدة d >> 1 ، وهذا من شأنه تحريك بتات المتغير d بمكان واحد والآن البت الثانية bit 1 أصبحت فى مكان البت الأدنى قيمة ، وتكرار العملية السابقة يؤدى إلى دفع البت الثانية فى سلسلة مسجلات الإزاحة .

كود:
d=d >> 1;
نقوم بتكرار هذه العملية 8 مرات بغرض زحزحة البايت بكامله للخارج .

كود:
short j;
for(j=0;j<8;j++) 					// Shift out 8 bits
{
PORTC.B0= d & 1 ; 				// test least significant bit if it is 1
PORTC.B1=1;	PORTC.B1=0; 	// clock
d=d >> 1; 				// shift bits to right by 1 to get next bit
}

بعد استدعاء هذه الدالة عدد من المرات يساوى عدد البايتات المراد زحزحتها إلى الخارج ، يتم تطبيق نبضة مزلاج latch على طرف ساعة المزلاج ST_CLOCK وهذا من شأنه نقل بيانات 24 بت إلى أطراف خرج مسجلات الأزاحة الثلاثة وبالتالى إلى وحدات شاشة العرض .



التدريب الرابع : إنشاء واستخدام دالة الزحزحة إلى الخارج :



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 04:39 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)