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

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 01-11-2011, 07:59 PM المشاركة 1   
افتراضي طريقة زيادة عدد مخارج الميكروكونترولر PIC How to increase the number of outputs Twitter FaceBook Google+



طريقة زيادة عدد مخارج الميكروكونترولر PICHow to increase the number of outputs

ما هو مسجل الإزاحة ذو الدخل التسلسلى والخرج التفرعى SIPO ( Serial In - Parallel Out ) وكيفيعمل :
إن عاجلا أم أجلا سوف تحتاج إلى زيادة عدد مخارج الميكروكونترولر PIC .
فى هذه الدراسة سوف نتناول كيفية زيادة عدد مخارج الميكروكونترولر PIC ( سوف نتناول زيادة عدد المداخل فى دراسة أخرى) .
لتحقيق هذا الغرض سوف نستخدم الشرائح المعروفة جيدا تحت مسمى :
SIPO ( Serial In - Parallel Out ) أى "مدخل تسلسلى(متتالى) – مخرج تفرعى(متوازى) " .
كما يوحي اسمها، فإن هذه الرقاقات تقبل إدخال بيانات فى شكل تسلسلى serialوتخرج البيانات فى شكل تفرعى أو متوازى parallel .
يقصد بالشكل التسلسلى " إرسال بيانات البايت byte المكون من 8 بتات (خانات)(8bit) خانة واحدة تلو الأخرى باستخدام خط واحد فقط" .أى يتم استقبال هذه الخانات تسلسليا عن طرق مدخل واحد وتحويلها إلى 8 مخارج ومن هنا تأتى فكرة التحويل من تسلسلى إلى تفرعى .
تتم هذه العملية عن طريق دائرة إلكترونية تسمى "مسجل الإزاحة" Shift Register . حيث تمر البيانات التسلسلية من خلال 8 خلايا ذاكرة متجاورة (متتابعة ) , كل خلية تسع خانة واحدة ( الخلية مكون من فليب فلوب نوع D-flip-flop"الخرج = الدخل عند وجود نبضة التوقيت أو الساعة" ) .
تنتقل بتات (خانات) البيانات من خلية إلى أخرى (بمعنى الإزاحة) . أى أنه عند توصيل البت (الخانة) الأولى إلى مدخل البيانات فإنها تدخل إلى الخلية الأولى (بشروط وجود نبضة الساعة ) وعند توصيل البت (الخانة) الثانية إلى مدخل البيانات فإنها تدخل إلى الخلية الأول وفى نفس الوقت تنتقل (تزاح) محتويات الخلية الأولى إلى الخانة الثانية وهكذا . يتم تنفيذ الإزاحة عن طريق نبضة توقيت أو ساعة بحيث تتم الإزاحة بطريقة "متزامنة" لجميع الخانات .
مخارج الخلايا بدورها يمكن أن توصل إلى خلية مشتركة لإمساكها latch" مزلاج " حيث يمكن إخراجها على الأطراف عن طريق إشارة تمكين . بعض مسجلات الإزاحة لا تحتوى على مرحلة الماسك وتظهر البيانات على المخارج مباشرة .
الدائرة المتكاملة 74595 مسجل إزاحة من النوع الذى يحتوى على مرحلة الماسك , بينما الدائرة المتكاملة 74164 فهى مسجل إزاحة من النوع الذى لا يحتوى على مرحلة ماسك .






جميع أنواع مسجلات الإزاحة من النوع SIPO تستقبل البيانات التسلسلية على طرف حيث تقوم بنقلها على شكل بتات bits عبر خلايا مسجل الإزاحة بإشارة ساعة (توقيت) واحدة ومن ثم فنحن بصدد إرسال البيانات تسلسليا بطريقة متزامنة .
المخطط التالى يوضح طريقة عمل " مسجل إزاحة 4-bit من النوع دخل تسلسلى – خرج تفرعى SIPO " :








تدخل البيانات تسلسليا من طرف مدخل البيانات "Data In" "بت تلو البت " , كل بت ينتقل "يزاح" من خلال الخلايا (فى الشكل كل خلية ذاكرة يمثلها مربع) وذلك عند تحول إشارة الساعة من الحالة المنطقية المنخفضة low إلى الحالة المنطقية المرتفعة high.
وظيفة مرحلة الماسك latch الموجودة بمسجل الإزاحة 74595 هى تخزين البيانات وجعل إتاحة البتات على المخارج فقط بعد الأمر بالتمكين من ذلك, حيث يوجد طرف التمكين المسمى OE "Output Enable " . يمكن حفظ طرف التمكين فى الحالة الفعالة "الحالة المرتفعة" دائما بحيث يتم انتقال البيانات مباشرة إلى المخارج بدون إشارة تمكين (كما لو كانت بدون مرحلة إمساك) .
مسجل الإزاحة 74595 يحتاج أيضا إلى نبضة ساعة ثانية من أجل انتقال البتات من "خلايا مسجل الإزاحة للماسك" إلى المخارج . كما يحتوى على مخرج يسمح لك بتوصيل أكثر من دائرة متكاملة على التتابع
in cascade بحيث يتم قيادتها drive جميعها بنفس خطوط الساعة والبيانات بما يجعل زيادة عدد المخارج "التوسعة" أكثر بساطة .
مسجلات الإزاحة SIPO بدون مرحلة الماسك ( مثل الدائرة المتكاملة 74164) تجعل الخانات متاحة على المخارج بمجرد تحميلها وهو ما قد يسبب مشكلة فى حالة الدوائر التى تتطلب إرسال البيانات فى نفس الوقت وبطريقة دقيقة . فعند إرسال البت الأول والذى يكون متاحا بالفعل على المخارج ( بفرض أن أول بت يساوى الواحد نحصل على خطوط المخارج الحالة 10000000 ) . ثم يأتى البت الثانى ( نفترض أنه صفر) فيتم تحديث الحالة ( فتكون الحالة 01000000) وهكذا , وباستمرار الانتقال حتى إرسال البايت بالكامل بالتأكيد يتسبب ذلك فى الخلل فى الأجهزة التى يجب أن تستقبل جميع البيانات دفعة واحدة . وهذه لا تسبب مشكلة عندما تتعامل مع أجهزة تحتوى هى على آلية التمكين قبل قراءة البتات على الممر التفرعى . على سبيل المثال وحدة العرض LCD التى تعتمد على الميكروكونترولر HD44780 تمتلك طرف للتمكين , فعندما ترسل جميع البيانات ونتأكد من ذلك يتم تمكين هذه البيانات .

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 01-11-2011, 08:00 PM المشاركة 2   
افتراضي


التعامل مع الدائرة المتكاملة 74164 :
الشكل التالى يبين الشكل الخارجى والأطراف :











الأطراف Q0-Q7 هى أطراف المخارج الثمانية .
وعلى عكس انوع SIPO الأخرى فهذه الشريحة تمتلك مدخلان هما A و B ويتم داخليا إجراء عمليه AND لهما لذلك ببساطة سوف نقوم بتوصيلهما معا ليصبحا مدخل واحد .
الطرف CP هو الطرف المستخدم فى إرسال إسارة الساعة clock signal: سوف تنتقل البيانات عند التحول من الحالة المنطقية المنخفضة إلى الحالة المنطقية المرتفعة .
الطرف MR هو طرف التصفير الرئيسى master reset وهو فعال فى الحالة المنخفضة وهذا يعنى أنه يقوم بوظيفته ( تصفير جميع المخارج) عندما يكون فى الحالة المنطقية المنخفضة . لن نحتاج لهذه الوظيفة لذلك سوف يتم توصيل هذا الطرف من خلال مقاومة إلى الطرف الموجب لمنع التصفير من خلال هذا الطرف (بغرض الاستفادة القصوى من الميكروكونترولر ) .


الشكل التالى يبين المخطط المنطقى للشريحة :







يوجد 8 فليب فلوب flip / flop كمسجلات إزاحة والتى تقوم بإزاحة البتات المكونة لبيانات الدخل التسلسلى . الخلية الأولى متصلة بالخرج الأول Q0 (الطرف 3) .

سوف نأخد مثال يوضع العمل بتوصيل ليدات إلى المخارج .

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 01-11-2011, 08:04 PM المشاركة 3   
افتراضي


سوف نأخد مثال يوضع العمل بتوصيل ليدات إلى المخارج .
المخارج تمد بتيار قدره 8mA , لذلك فمن غير المناسب تشغيل (قيادة) أى شىء آخر فيما عدا ترانزستور . ينصح بتوصيل مقاومة تحديد التيار بقيمة 620 أوم حتى يكون التيار أقل من 8mA كما فى الشكل التالى :

يتم توصيل البيانات التسلسلية إلى "المدخل التسلسلى" "serial in" المتصل بالأطراف 1 و 2 فى نفس الوقت , وتوصيل إشارة الساعة "CLOCK"إلى الطرف 8 .

حان وقت البرمجة :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 01-11-2011, 08:14 PM المشاركة 4   
افتراضي


حان وقت البرمجة :
تسلسل البيانات ليس بالصعب . ببساطة نستخدم المعلومات المذكورة أعلاه وتطبيقها بشكل مناسب باستخدام حلقة for loop .
مثال توضيحى :



كود:
unsigned  char shift ; 
for  ( shift = 0 ; shift < 8 ; shift + + ) 
   { 
   value = dat >> shift ; 
   if  ( value &  1 ) 
      { 
      DATE = 1 ; 
      } 
   else 
      { 
      DATE = 0 ; 
      } 
   }

  • المقصود "بالقيمة" value هى قيمة البيانات التى تريد تسلسلها dat ( متغير من نوع char أى بسعة byte ) أثناء معالجتها "لم نكتب data لأنها من ضمن الكلمات المحجوزة واستخدامه يسبب خطأ عند الترجمة ".
  • يتم تشكيل حلقة تتكرر 8 مرات (بعدد البتات المراد نقلها ) باستخدام تعبير for .

كود:
for  ( shift = 0 ; shift < 8 ; shift + + ) 
   { 
……
…….
}

داخل الحلقة يتم عمل إزاحة لجهة اليمين right shiftلعدد من المواقع (الأماكن) يساوى لقيمة المتغير "shift" ( فى بداية الحلقة يكون بصفر أى عدم إزاحة وفى الدورة التالية يكون بواحد والثانية يكون باثنين وهكذا ).
كود:
value = dat >> shift ;

  • بعد ذلك يتم إجراء عملية AND للبايت الناتج مع القيمة "واحد 1 " (أى مع 0b00000001 ) : بهذه الطريقة يتم اختبار البت السابعة هل هى فى الحالة المرتفعة (يتحقق شرط if ) فنجعل DATE بواحد ) أو الحالة المنخفضة فنجعل DATE=0. المتغير DATE يمثل حالة أطراف إرسال البيانات التسلسلية .

كود:
value = dat >> shift ; if ( value & 1 ) { DATE = 1 ; } else { DATE = 0 ;
}
بعد هذه التعليمات وبفرض أن CKهو طرف إرسال إشارة الساعة ( وأنه قد تم إعدادة مسبقا بالصفر ) فببساطة نضع :
كود:
CK = 1 ; CK = 0 ;
أى أن البيانات يتم إرسالها عند التحول من الحالة المنخفضة إلى الحالة المرتفعة لإشارة الساعة .
طرف الساعة بالفعل يكون فى الحالة المنخفضة من البداية ولقد قمنا بجعله فى الحالة المرتفعة لإزاحة البت الموجودة على المدخل (التى وضعناها على الطرف DATA ) ثم إعادته مرة أخرى إلى الصفر للتجهيز للدورة التالية .
بهذه الطريقة نكون قد قمنا بعمل إرسال متزامن للبيانات تسلسليا بقليل من التعليمات البسيطة .

الآن سوف نرى هيكل البرنامج بالكامل :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 01-11-2011, 08:24 PM المشاركة 5   
افتراضي


الآن سوف نرى هيكل البرنامج بالكامل :
  • دعنا نعرف الطرفان المستخدمان فى الاتصال التسلسلى :
كود:
# Define DATE RC7 / / pin used to send the serial data # define CK RC6 / / pin used for clock


سوف نستخدم الميكروكونترولر PIC16F877A .
  • يتم تهيئة هذه الأطراف باصفار للتأكد من وضع البداية
كود:
DATE = 0 ; CK = 0 ;


  • تهيئة هذه الأطراف كمخارج
كود:
Trisc = 0 ;


  • تسهيلا للعمل نعرف الدالة التى تقوم بإجراء الإرسال التسلسلى خلال SIPO والتى من خلالها سوف يتم تمرير دليل argument لعمل أرسال تسلسلى للبيانات " dat" .
اسم الدالة sipo_out والبارامتر dat

كود:
/ / This function serializes the bytes to send it to the DAT 74LS164 void sipo_out ( unsigned char dat ) { static unsigned char value = 0 ; / / value after the shift static unsigned char shift = 0 ; / / shift for ( shift = 0 ; shift < 8 ; shift + + ) { value = dat >> shift ; if ( value & 1 ) { DATE = 1 ; } else { DATE = 0 ; } / / signal clock: CK = 1 ; CK = 0 ; / / The transition from low to high in the shift register shifts the data } }
أخيرا عندما نريد نقل بايت من خلال SIPO نستدعى الدالة ونمرر (نضع) بها البيانات المراد نقلها .
على سبيل المثال :


كود:
sipo_out ( 255 ) ; / / so all the LEDs light up
الآن نقوم بعمل عداد بسيط :

كود:
for ( int a = 0 ; to < 256 ; a + + ) { sipo_out ( a ) ; Delay_Ms ( 100 ) ; }
هذه الحلقة تقوم بالعد من الصفر وحتى 255 وتقوم بتحريك القيمة إلى SIPO , عندئذ سوف نرى الليدات تضىء فى تتابع ثنائى binary sequence , التأخير يساعدنا على مشاهدة إضاءة الليدات بطريقة صحيحة .


التعامل مع مسجل الإزاحة 74595 :


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 01-11-2011 الساعة 08:27 PM
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2024