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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:335
قديم 12-12-2019, 09:33 AM المشاركة 1   
افتراضي مسجلات الإزاحة Shift Registers ومسجل الإزاحة 74HC595 والربط مع الأردوينو Twitter FaceBook Google+



مسجلات الإزاحة Shift Registers ومسجل الإزاحة 74HC595 والربط مع الأردوينو
مسجلات الإزاحة Shift Registers :
مقدمة :




ما هو مسجل الإزاحة What is Shift Register :
مسجلات الإزاحة هي دوائر منطقية متسلسلة (متتابعة) sequential logic circuits ، قادرة على تخزين ونقل البيانات. وهي مكونة من قلابات (فليب فلوب) Flip Flops والتي ترتبط (تتصل) بطريقة تجعل خرج فليب فلوب بمثابة دخل فليب فلوب آخر ، اعتمادًا على نوع مسجلات الإزاحة التي يتم إنشاؤها.



D-Flip Flop shift Register

مسجلات الإزاحة هي في الأساس نوع من السجلات register التي لديها القدرة على نقل transfer ("إزاحة " shift ) البيانات. السجلات عبارة عن أجهزة تخزين عامة يتم إنشاؤها عن طريق توصيل عدد معين من الفليب فلوب معًا في سلسلة ، كما أن كمية البيانات (عدد البتات) التي يمكن تخزينها بواسطة السجل تتناسب دائمًا مع عدد الفليب فلوب ، حيث إن كل فليب فلوب قادر على تخزين بت واحد فقط في كل مرة. عندما يتم توصيل فليب فلوب في السجل بطريقة تجعل خرج فليب فلوب ، يصبح دخل لآخر ، عندئذ يتم إنشاء مسجل الإزاحة.


D Flip-Flop

الفليب فلوب (القلاب) Flip Flops هي أجهزة لها عمل مشابهة لعمل المزلاج latch . يمكن أن يشار إليها على أنها هزاز ثنائى الاتزان bistable vibrator والذي يمكن أن ينتقل بين حالتين (0 أو 1) ويكون قادرًا على تخزين البيانات بالبت. تتم قراءة البيانات الجديدة في الفليب فلوب مع كل دورة ساعة والبيانات السابقة ترسل إلى الخرج . ومع ذلك ، يعتمد هذا على نوع القلاب FF ، حيث تختلف العلاقة بين المدخلات والمخرجات ودورة الساعة باختلاف القلاب . هناك أنواع مختلفة القلابات ، ولكن الأكثر شيوعًا في إنشاء مسجلات الإزاحة هي القلابات D (Delay)-flip flops .
عمل القلابات D flip flops والذى يجعلها مرغوبة جدًا لمسجلات الإزاحة ، هو أنه كلما كان هناك تغيير في ساعة القلاب D (إما حافة صاعدة أو هابطة ، اعتمادًا على مواصفات flip flop) ، تصبح البيانات في الخرج "Q" هي نفس البيانات الموجودة في الدخل "D". سيبقى الخرج "Q" من القلاب عند هذه القيمة حتى دورة الساعة التالية ، حيث سيتغير مرة أخرى إلى القيمة (مرتفعة High أو منخفضة low ، 1 أو 0) عند الدخل .



D Flip Flop Truth Table

أنواع مسجلات الإزاحة Types of Shift Registers
يتم تصنيف مسجلات الإزاحة إلى أنواع بشكل رئيسي حسب طريقة تشغيلها ، سواء كانت متسلسلة serial أو متوازية parallel .
هناك ستة (6) أنواع أساسية من مسجلات الإزاحة مدرجة أدناه على الرغم من إمكانية تقسيم بعضها إضافيا على أساس اتجاه تدفق البيانات إما إزاحة إلى اليمين أو إزاحة إلى اليسار.
1. مسجل إزاحة "دخل تسلسلى خرج تسلسلى " Serial in – Serial out Shift Register (SISO)
2. مسجل إزاحة "دخل تسلسلى خرج متوازى " Serial In – Parallel out shift Register (SIPO)
3. مسجل إزاحة "دخل متوازى خرج متوازى " Parallel in – Parallel out Shift Register (PIPO)
4. مسجل إزاحة "دخل متوازى خرج متسلسل " Parallel in – Serial out Shift Register (PISO)
5. مسجل إزاحة ثنائى الاتجاه Bidirectional Shift Registers
6. عدادات Counters
سوف يقتصر الحديث على النوع الثانى الذى يندرج تحته مسجل الإزاحة 74HC595 .

مسجل الإزاحة "دخل متسلسل خرج متوازى" Serial in – Parallel out Shift Register
يستخدم هذا النوع من مسجلات الإزاحة لتحويل البيانات من بيانات تسلسلية إلى بيانات متوازية . تأتي البيانات في صورة بت واحدة تلو الأخرى في كل دورة ساعة ويمكن إما أن يتم إزاحتها واستبدالها أو قراءتها في كل خرج . هذا يعني أنه عند قراءة البيانات ، تصبح كل قراءة بت متاحة في وقت واحد على خط الخرج الخاص بها (Q0 - Q3 لمسجل إزاحة 4 بت الموضح أدناه).
مسلسل مكون من 4 بتات - سجل التحويل الموازي للخارج موضح في الصورة أدناه.


Serial in – Parallel out Shift Register
يظهر أدناه جدول يوضح كيف يتم نقل (إزاحة) البيانات فى مسجل إزاحة "دخل متسلسل خرج متوازى" 4 بت ، مع بيانات الدخل 1001.




مثل جيد لمسجل إزاحة دخل متسلسل خرج متوازى ، مسجل الإزاحة 74HC164 ، وهو مسجل إزاحة 8 بت.
يتميز مسجل الإزاحة هذا بأن له مدخلين للبيانات التسلسلية (DSA و DSB) ، وثمانية مخارج بيانات متوازية (Q0 إلى Q7). يتم إدخال البيانات بشكل تسلسلي من خلال DSA أو DSB ويمكن استخدام أي من المدخلين كتمكين نشط فى الحالة المرتفعة active HIGH enable من أجل المدخل الآخر . يتم نقل (إزاحة) البيانات عند التحول من الحالة المنخفضة إلى الحالة المرتفعة LOW-to-HIGH على دخل نبضة الساعة clock (CP) . تطبيق الحالة المنخفضة LOW على مدخل الإعادة الرئيسي (MR) (الدائرة الصغيرة تعنى أنه فعال فى الحالة المنخفضة) يمسح السجل ويجبر جميع المخارج على الحالة المنخفضة LOW ، بشكل مستقل عن المدخلات الأخرى. وتشمل المدخلات الثنائيات المشبك. وهذا يتيح استخدام مقاومات الحد الحالية لواجهة المدخلات إلى الفولتية التي تتجاوز VCC.



74HC164 Functional Diagram


احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )
اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:335
قديم 12-12-2019, 09:45 AM المشاركة 2   
افتراضي


مسجل الإزاحة 74HC595 :
مسجل إزاحة 8 بت ، دخل تسلسلى ، خرج تسلسلى أو متوازى ، مع مخارج بمزالج (اقفال) latches ، ثلاثية الحالة .
الدائرة المتكاملة 74HC595 عبارة عن مسجل إزاحة shift register 8- بت دخل تسلسلى ، خرج تسلسلى أو متوازى ، ومسجل تخزين storage register بمخارج ثلاثية الحالة . يحتوي كل من مسجل الإزاحة ومسجل التخزين على ساعات clocks منفصلة. يحتوي الجهاز على مدخل تسلسلي (DS) ومخرج تسلسلي (Q7S) لتمكين التوصيل المتتابع (المتتالى) cascading ومدخل إعادة رئيسى MR غير متزامن asynchronous . تطبيق الحالة المنخفضة LOW على الطرف MR ينتج عنه إعادة تعيين reset مسجل الإزاحة . يتم نقل (إزاحة) البيانات عند الانتقال (التحول) من الحالة المنخفضة إلى الحالة المرتفعة LOW-to-HIGH على دخل ساعة مسجل الإزاحة SHCP . يتم نقل البيانات الموجودة في مسجل الإزاحة إلى مسجل التخزين عند الانتقال من الحالة المنخفضة إلى الحالة المرتفعة LOW-to-HIGH على مدخل ساعة مسجل التخزين STCP. تظهر البيانات الموجودة في مسجل التخزين عند المخارج عندما يكون مدخل تمكين المخارج (OE) فى الحالة المنخفضة LOW . تؤدي الحالة المرتفعة HIGH على الطرف OE إلى ظهور المخرجات في حالة معاوقة مرتفعة ، حالة إيقاف OFF-state (الحالة الثالثة) . لا يؤثر عمل الدخل OE على حالة المسجلات.

المخطط الوظيفى Functional diagram:




الرمز المنطقى Logic symbol :


وصف الأطراف :
المداخل INPUTS:
• الطرف DS (Pin 14) : مدخل البيانات التسلسلية Serial Data Input .
يتم نقل (إزاحة) البيانات الموجودة على هذا الطرف إلى مسجل الإزاحة التسلسلي 8 بت .

مداخل التحكم CONTROL INPUTS:
• الطرف SHCP (Pin 11) : مدخل ساعة مسجل الإزاحة Shift Register Clock Input .
يؤدي الانتقال transition من الحالة المنخفضة إلى الحالة المرتفعة low− to−high على هذا المدخل إلى إزاحة البيانات الموجودة على طرف المدخل التسلسلي إلى داخل سجل الإزاحة ذي 8- بت.
• الطرف MR (Pin 10) : مدخل إعادة مسجل الإزاحة Shift Register Reset Input ، فعال فى الحالة المنخفضة Active−low ، غير متزامن Asynchronous .
الحالة المنخفضة lowعلى هذا الطرف تؤدى إلى إعادة تعيين جزء سجل الإزاحة فقط من هذا الجهاز . لا يتأثر جزء مسجل التخزين (المزلاج) 8 بت.
• الطرف STCP (Pin 12) : مدخل ساعة مزلاج التخزين Storage Latch Clock Input .
يؤدي الانتقال من الحالة المنخفضة إلى الحالة المرتفعة على هذا المدخل إلى إمساك latch بيانات مسجل الإزاحة (إخراج بيانات مسجل الإزاحة إلى أطراف الخرج) .
• الطرف OE (Pin 13) : مدخل تمكين الخرج . فعال فى الحالة المنخفضة Active−low .
الحالة المنخفضة low على هذا الدخل تسمح بعرض البيانات من المزالج latches إلى المخارج . تؤدي الحالة المرتفعة high على هذا الدخل إلى إجبار المخرجات (Q0 – Q7) إلى في حالة المعاوقة المرتفعة high−impedance state (الحالة الثالثة) . لا يتأثر الخرج التسلسلي بوحدة التحكم هذه.

المخارج OUTPUTS :
• الأطراف Q0 – Q7 (Pins 15, 1, 2, 3, 4, 5, 6, 7) : مخارج بمزلاج latch outputs ، لها 3- حالات 3−state ( منخفض – مرتفع – معاوقة مرتفعة ) ، غير معكوسة Noninverted .
• الطرف Q7S (Pin 9) : مخرج البيانات التسلسلية Serial Data Output ، غير معكوس .
هذا هو خرج المرحلة الثامنة من سجل الإزاحة 8- بت. هذا الخرج ليس له القدرة على الثلاث حالات.

المخطط المنطقى Logic diagram :



الوصف الوظيفى Functional description :



المخطط الزمنى (التوقيت) Timing diagram :




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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:335
قديم 12-12-2019, 11:40 AM المشاركة 3   
افتراضي


التدريب الأساسى :
كيف يعمل مسجل الإزاحة 74HC595 وربطه مع الاردوينو :
كيف يعمل مسجل الإزاحة 74HC595 ؟

يحتوي 595 على سجلين (مسجلين) (يمكن اعتبارهما "حاويات ذاكرة") ، يحتوي كل منها على 8 بتات فقط من البيانات. أول واحد يسمى سجل الإزاحة Shift Register . يقع سجل الإزاحة عميقًا داخل دوائر IC ، ويقبل الدخل بهدوء.

كلما طبقنا نبضة الساعة clock على 595 ، يحدث شيئان:
• تنتقل البتات الموجودة في Shift Register خطوة واحدة إلى اليسار. على سبيل المثال ، يقبل Bit 7 القيمة التي كانت موجودة سابقًا في bit 6 ، بينما تحصل bit 6 على قيمة bit 5 إلخ.
• تقبل البت bit 0 في مسجل الإزاحة Shift Register القيمة الحالية على طرف البيانات DATA. عند الحافة الصاعدة لنبضة الساعة ، إذا كان طرف البيانات فى الحالة المرتفعة high ، يتم دفع 1 في سجل الإزاحة. خلاف ذلك ، يكون 0.

عند تمكين طرف Latch (فى الحالة المنخفضة) ، يتم نسخ محتويات سجل الإزاحة Shift Register في السجل الثاني ، ويسمى سجل التخزين Storage أو سجل المزلاج Latch . كل بت من سجل التخزين متصل بأحد أطراف الخرج Q0-Q7 الخاصة بالدائرة المتكاملة ، ولذلك بشكل عام ، عندما تتغير القيمة في "سجل التخزين" ، تتغير المخرجات كذلك.
يمكنك فهم هذا بشكل أفضل مع الرسم التوضيحي الموضح أدناه.



برنامج إضاءة 8 ليد على التتابع ، ليد تلو الآخر :
الدائرة الكهربية :




البرنامج :


كود:
int latchPin = 5;	// Latch pin of 74HC595 is connected to Digital pin 5
int clockPin = 6;	// Clock pin of 74HC595 is connected to Digital pin 6
int dataPin = 4;	// Data pin of 74HC595 is connected to Digital pin 4

byte leds = 0;		// Variable to hold the pattern of which LEDs are currently turned on or off

void setup() 
{
  // Set all the pins of 74HC595 as OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}

void loop() 
{
  leds = 0;	// Initially turns all the LEDs off, by giving the variable 'leds' the value 0
  updateShiftRegister();
  delay(500);

  for (int i = 0; i < 8; i++)	// Turn all the LEDs ON one by one.
  {
    bitSet(leds, i);		// Set the bit that controls that LED in the variable 'leds'
    updateShiftRegister();
    delay(500);
  }
}

/*
 * updateShiftRegister() - This function sets the latchPin to low, then calls the Arduino function 'shiftOut' to shift out contents of variable 'leds' in the shift register before putting the 'latchPin' high again.
 */
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

شرح البرنامج :
أول شيء نقوم به هو تعريف 3 أطراف التحكم : latch و clock و data للدائرة المتكاملة 595 . سنقوم بتوصيلها بأطراف الاردوينو 5 و 6 و 4 على الترتيب .

كود:
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;

بعد ذلك ، يتم تعريف متغير يسمى ‘leds’ . سيتم استخدام هذا المتغير لحفظ النمط الذي يتم فيه تشغيل أو إيقاف تشغيل الليدات حاليًا. يمثل نوع البيانات ‘byte’ الأعداد التي تستخدم ثمانية بتات. يمكن تشغيل كل بت أو إيقاف تشغيلها ، لذلك فهو مثالي لتتبع أي من الليدات الثمانية الخاصة بنا تعمل on أو متوقفة off .

كود:
// Variable to hold the pattern of which LEDs are currently turned on or off
byte leds = 0;

في الدالة ‘setup‘ : نقوم ببساطة بتهيئة الأطراف الثلاثة لتكون مخارج رقمية.

كود:
void setup() 
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}
الدالة loop : في البداية تقوم بإيقاف تشغيل جميع الليدات ، عن طريق تعيين كل البتات الخاصة بالمتغير 'leds' على 0. ثم تقوم باستدعاء الدالة المعرفة بمعرفة المستخدم والتي تسمى updateShiftRegister() والتي سترسل نموذج 'leds' إلى سجل الإزاحة بحيث تكون جميع الليدات فى حالة إيقاف off . سنتعرف على كيفية عمل هذه الدالة لاحقًا.
يتوقف البرنامج لمدة نصف ثانية ، ثم يبدأ العد من 0 إلى 7 باستخدام حلقة "for" والمتغير "i". في كل مرة ، تستخدم الدالة bitSet() لتعيين set البت (جعله بواحد) الذي يتحكم في ليد معين في المتغير'leds'. ثم يتم إستدعاء الدالة updateShiftRegister() بحيث تتغير حالة الليدات وفقًا لما هو موجود في المتغير ‘leds’ .
ثم هناك تأخير لمدة نصف ثانية قبل زيادة "i" ويضيء الليد التالى .


كود:
void loop() 
{
  leds = 0;
  updateShiftRegister();
  delay(500);

  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    updateShiftRegister();
    delay(500);
  }
}

تقوم الدالة updateShiftRegister() ، أولاً وقبل كل شيء بتعيين طرف المزلاج latch Pin على الحالة المنخفضة LOW ، ثم تستدعي الدالة shiftOut() قبل وضع طرف المزلاج على الحالة المرتفعة HIGH مرة أخرى.
لحسن الحظ ، يوفر الاردوينو Arduino دالة مساعدة خصيصًا لسجلات الإزاحة التي تسمى shiftOut() ، والتي تتيح لنا ببساطة إزاحة البتات في استدعاء واحد.
تأخذ الدالة shiftOut() أربعة بارامترات ؛ أول اثنين هما الأطراف المستخدمة فى البيانات Data والساعة Clock على التوالي. يحدد البارامتر الثالث نهاية البيانات التي تريد البدء بها. سنبدأ بالبايت أقصى اليمين ، والذي يشار إليه باسم "بت الأقل أهمية" (LSB).
البارامتر الأخير هو البيانات الفعلية المراد إزاحتها إلى سجل الإزاحة ، وهى في هذه الحالة ‘leds’ .


كود:
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

بمجرد تحميل الكود إلى Arduino ، سترى أن الإخراج يظهر كما يلي:





إذا كنت ترغب في إيقاف تشغيل أحد الليدات بدلاً من تشغيله ، يمكنك استدعاء دالة Arduino مماثلة وهى bitClear() للمتغير 'leds'. سيؤدي ذلك إلى تعيين هذا البت المعين من ‘leds’ على الصفر وستحتاج فقط إلى استدعاء الدالة updateShiftRegister() لتحديث الليدات الفعلية.


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:335
قديم 12-12-2019, 12:07 PM المشاركة 4   
افتراضي


الدالة shiftOut() :
الوصف :

تنقل (تزحزح) Shift out بيانات بايت Byte ، بت Bit واحد في كل مرة. تبدأ من إما البت الأقصى أهمية MSB (أي أقصى اليسار) أوالبت الأدنى أهمية LSB (أقصى اليمين) . تتم كتابة كل بت فى دورها إلى طرف البيانات data pin ، وبعد ذلك يتم تفعيل طرف الساعة clock pin (يتم رفعه high ، ثم خفضه low) للإشارة إلى توفر البت.
ملاحظة - إذا كنت تتفاعل مع جهاز تزامنه (ساعته) بواسطة حواف صاعدة ، فستحتاج إلى التأكد من خفض طرف الساعة قبل استدعاء الدالة shiftOut() ، على سبيل المثال باستدعاء الدالة digitalWrite(clockPin, LOW) .

الصيغة :

كود:
shiftOut(dataPin, clockPin, bitOrder, value)

البارامترات :
البارامتر dataPin : الطرف pinالذى سوف يتم عليه إخراج كل بت ( نوع int).
البارامتر clockPin : الطرف يتم تبديله بمجرد تعيين طرف البيانات dataPin إلى القيمة الصحيحة (نوع int ) .
البارامتر bitOrder : ترتيب البتات المزاحة ، وهى إما "البت الأقصى أهمية أولا" MSBFIRST أو " البت الأدنى أهمية أولا" LSBFIRST .
البارامتر value : البيانات المراد إزاحتها (بايت byte ) .

العائد :
لا شىء .

مثال1 : إنشاء عداد رقمى ثنائى من 0 إلى 255 باستخدام 8 ليدات ، باستخدام مسجل إزاحة واحد لتوسعة مخارج الاردوينو

الدائرة الكهربية :



كود:
//**************************************************************//
//  Name    : shiftOutCode, Hello World                         //
//  Notes   : Code for using a 74HC595 Shift Register           //
//          : to count from 0 to 255                            //
//****************************************************************

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

void setup() {
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  //count up routine
  for (int j = 0; j < 256; j++) {
    //ground latchPin and hold low for as long as you are transmitting
    digitalWrite(latchPin, LOW);

    shiftOut(dataPin, clockPin, LSBFIRST, j);

    //return the latch pin high to signal chip that it
    //no longer needs to listen for information
    digitalWrite(latchPin, HIGH);
    delay(1000);
  }
}

يجب بالفعل تهيئة (تكوين) كل من dataPin و clockPin كمخارج بواسطة استدعاء الدالة pinMode() .
تتم كتابة الدالة shiftOut لإخراج 1 بايت (8 بت) ، لذلك إخراج قيم أكبر من 255 يتطلب عملية من خطوتين (مرتين) ، كما يلى :

كود:
// Do this for MSBFIRST serial
int data = 500;
// shift out highbyte
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));
// shift out lowbyte
shiftOut(dataPin, clock, MSBFIRST, data);

// Or do this for LSBFIRST serial
data = 500;
// shift out lowbyte
shiftOut(dataPin, clock, LSBFIRST, data);
// shift out highbyte
shiftOut(dataPin, clock, LSBFIRST, (data >> 8));


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:335
قديم 12-12-2019, 12:21 PM المشاركة 5   
افتراضي


إضاءة متتابعة فى الاتجاهين 8 ليد :
يوضح هذا المثال كيفية تشغيل 74HC595 واحد باستخدام مخارج لتشغيل ليدات ، إضاءة ليد تلو الآخر . يتم التحكم في اتجاه التشغيل من خلال المتغير dir بينما يتم تعيين القيمة الفعلية إلى المتغير d. إذا تم اكتشاف بت مرتفعة high في أي من طرفي البايت عندئذ يتم تغيير الاتجاه. وبهذه الطريقة ، يتم السير يسارًا ويمينًا عبر البايت. بعد كل إزاحة يتم إخراج القيمة إلى 74HC595 باستخدام الدالة shiftOut ، و MSB أولاً.
ملاحظة: تعمل الدالة shiftOut على بايت واحد فقط.



كود:
// Demonstration code for 74HC595 8 bit output
int RCLKPin = 3;   // pin 12 on the 74hc595 latch ST_CP
int SRCLKPin = 6;  // pin 11 on the 74hc595 shift register clock – SH_CP
int SERPin = 4;    // pin 14 on the 74hc595 data - DS
unsigned int d;    // Data to be sent to the shift reg.
int dir =0;        // Direction of walking.

void setup() {
  pinMode(RCLKPin, OUTPUT);    // Set 595 control PIN sto output.
  pinMode(SRCLKPin, OUTPUT);
  pinMode(SERPin, OUTPUT);

  d=1;
}

void loop() {

    delay(100);
    digitalWrite(RCLKPin, LOW);//Latch Low 
    shiftOut(SERPin, SRCLKPin, MSBFIRST, 0x00ff & d);//Shift Out
    digitalWrite(RCLKPin, HIGH);//Latch High
    
    if (!dir) d<<=1; else d>>=1; // Shift

    if (d&0x80) dir=1;           // Set direction.
    if (d&0x01) dir=0;
}
إضاءة متتابعة فى الاتجاهين 16 ليد :
هذا المثال لبرنامج يوسع المثال السابق لتشغيل اثنين 74HC595 لإنشاء مسجل إزاحة 16 بت واستخدام المخارج لتشغيل ليدات . مرة أخرى ، يتم إنشاء مسير خطوة ، لكن في هذه المرة يستخدم الكود عددًا صحيحًا بدون إشارة unsigned integer لتخزين القيمة التي تتيح 16 بت من المخارج . لاحظ كيف يجب استخدام الدالة shiftOut مرتين لإخراج قيمة 16 بت (والتي يجب أيضًا تقسيمها إلى قطعتين باستخدام إزاحة البت bit shifting لأن shiftOut لا يمكنه التعامل إلا مع 8 بتات من البيانات في كل مرة).




كود:
 
// Demonstration code for 74HC595 16 bit output
int RCLKPin = 3;   // pin 12 on the 74hc595 latch - nSS
int SRCLKPin = 6;  // pin 11 on the 74hc595 shift register clock - SCK
int SERPin = 4;    // pin 14 on the 74hc595 data - MOSI
unsigned int d;    // Data to be sent to the shift reg.
int dir =0;        // Direction of walking 1.

void setup() {
  pinMode(RCLKPin, OUTPUT);    // Set 595 control PIN sto output.
  pinMode(SRCLKPin, OUTPUT);
  pinMode(SERPin, OUTPUT);

  d=1;
}

void loop() {

    delay(100);
    digitalWrite(RCLKPin, LOW);

    shiftOut(SERPin, SRCLKPin, MSBFIRST, (0xff00 & d)>>8); // shift out high byte
    shiftOut(SERPin, SRCLKPin, MSBFIRST, 0x00ff & d); // shift out low byte

    digitalWrite(RCLKPin, HIGH);

    if (!dir) d<<=1; else d>>=1; // Shift

    if (d&0x8000) dir=1;           // Set direction.
    if (d&0x0001) dir=0;
}

مسجل إزاحة 32 بت لتشغيل 16 ليد إضاءة متتابعة وتشغيل 2 سفن سيجمنت لعرض الأرقام من 0 إلى 99 :





هذا المثال لبرنامج يوسعالمثال السابق مع الحفاظ على التشغيل الأصلي ولكنه أيضا يقود وحدتى عرض سفن سيجمنت . وحدات العرض السفن سيجمنت هي مجرد ترتيبات (تنسيق) لليدات يتم استخدامها لعرض الأرقام. في الداتا شيت ، يتم تعيين حرف لكل ؛ هذه الأحرف هى "a" إلى "g" و "dp" (للفاصلة العشرية). لتسهيل عملية الترميز ، من الأفضل تعيين 'a'-'g' إلى b0-b6 من المخارج وتعيين dp إلى الخرج b7.
في هذا المثال ، يتم الاحتفاظ السير خطوة كما كان من قبل ولكن الآن يتم مزيد من إستدعاء دالة إزاحة 8 بت shiftOut . لاحظ كيف يتم إزاحة كل شيء بشكل صحيح للوصول إلى أدنى 8 بت من أجل الدالة shiftOut.
ملحوظة :
حتى بالنسبة إلى 32 خرج (أو أكثر) ، لا تزال بحاجة إلى 3 أطراف تحكم فقط!

كود:
// Demonstration code for 74HC595 16 bit output and 2x7 segment displays
int RCLKPin = 3;   // pin 12 on the 74hc595 latch - nSS
int SRCLKPin = 6;  // pin 11 on the 74hc595 shift register clock - SCK
int SERPin = 4;    // pin 14 on the 74hc595 data - MOSI
unsigned long d;   // Data to be sent to the shift reg.
int dir,num;       // Direction of walking 1, output number.

// Define an array to translate number to 7segment
char segment[10] = { // segment bit pos: dp g f e d c b a
  0x3f, // zero
  0x06, // one
  0x5b, // two
  0x4f, // three
  0x66, // four
  0x6d, // five
  0x7c, // six
  0x07, // seven
  0x7f, // eight
  0x67  // nine
};

void setup() {
  pinMode(RCLKPin, OUTPUT);    // Set 595 control PINs to output.
  pinMode(SRCLKPin, OUTPUT);
  pinMode(SERPin, OUTPUT);

  d=1;
  num = 0;
}

void loop() {
unsigned char lnum,rnum;

    if(num++>99) num=0;
    lnum = num / 10;
    rnum = num % 10;

    digitalWrite(RCLKPin, LOW);

    shiftOut(SERPin, SRCLKPin, MSBFIRST, segment[lnum]);
    shiftOut(SERPin, SRCLKPin, MSBFIRST, segment[rnum]);
    shiftOut(SERPin, SRCLKPin, MSBFIRST, (0xff00 & d)>>8);
    shiftOut(SERPin, SRCLKPin, MSBFIRST, 0x00ff & d);

    digitalWrite(RCLKPin, HIGH);

    if (!dir) d<<=1; else d>>=1; // Shift

    if (d&0x8000) dir=1;           // Set direction.
    if (d&0x1) dir=0;

    delay(200);
}


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 12-12-2019 الساعة 05:37 PM

عبدالفتاح حبيب
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2012
المشاركات: 109
نشاط [ عبدالفتاح حبيب ]
قوة السمعة:0
قديم 12-12-2019, 07:16 PM المشاركة 6   
افتراضي الرجستورز


السلام عليكم شرح ممتاز عمل متالق بس نريد حصص اكثر وبرامج اكثر مختلفة كى تكتمل الفكرة بشكل اوضح وفقق الله وشكرا

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً F.Abdelaziz ( شكر العضو على هذه المشاركة )

Hussain800
:: مهندس متميز ::
تاريخ التسجيل: Apr 2012
المشاركات: 638
نشاط [ Hussain800 ]
قوة السمعة:0
قديم 14-12-2019, 09:43 PM المشاركة 7   
افتراضي


السلام عليكم ورحمة الله وبركاته
بارك الله فيك اخى فتح الله على هده الهدية التى طالما كنت انتظرها من زمان وبطريقة شرحك
من افضل طرق شرح مسجل الازاحة وبالامثلة. والله كنت انتظر هدا الشرح من زمان لمسجل الازاحة لهدا النوع74HC595
جزاك الله خيرا وانشاء الله فى ميزان حسناتك
والله الموفق

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً F.Abdelaziz ( شكر العضو على هذه المشاركة )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:335
قديم 24-12-2019, 08:06 PM المشاركة 8   
افتراضي


[B]الاردوينو وموديول سفن سيجمنت مكون من أربع وحدات عرض ومسجلات الإزاحة 74HC595 :

وحدة العرض مكونة من أربعة أرقام digit . توفر هذه الوحدة شاشة مثالية للبيانات الرقمية أو السداسية عشرية. يمكن عرض الأرقام من 0 إلى 9 بما في ذلك العلامة العشرية ، والحروف من A إلى F. يمكن أيضًا التحكم في كل شريحة على حدة إذا كنت ترغب في ذلك.
يحتوي الموديول على أربعة سجلات إزاحة 74HC595 – واحد لكل تحكم فى رقم.

الدائرة الكهربية :





البرنامج :

كود:
// Demonstration Arduino sketch for four digit, seven segment display with enclosure
// https://pmdway.com/collections/7-segment-numeric-leds/products/four-digit-seven-segment-display-module-and-enclosure

int latchPin = 13;   // connect to LCK pin
int clockPin = 12;   // connect to CLK pin
int dataPin = 11;    // connect to SDI pin

int LED_SEG_TAB[]={
  0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x01,0xee,0x3e,0x1a,0x7a,0x9e,0x8e,0x01,0x00};
//0     1    2     3    4    5    6    7    8    9   dp   .    a    b    c    d    e    f   off
//a,b,c,d,e,f,g,dp >> for LSBFIRST >> dp>>Q7, g>>Q6, >>…a>>Q0

void setup() 
{
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}


void displayNumber(int value, boolean leadingZero)
// break down "value" into digits and store in a,b,c,d  
{
  int a,b,c,d;
  a = value / 1000;//Digit1 or thousands
  value = value % 1000;
  b = value / 100;//Didit2 or hundreds
  value = value % 100;
  c = value / 10; // Digit3 or tens
  value = value % 10;
  d = value;//Digit4 or ones

  if (leadingZero==false) // removing leading zeros
  {
    if (a==0 && b>0)                  
{
      	a = 18;
    	} 
    if (a==0 && b==0 && c>0)          
{
     	 a = 18; 
      	b = 18;
    	}
    if (a==0 && b==0 && c==0)         
{
      	a = 18; 
      	b = 18; 
      	c = 18;
    	}
    if (a==0 && b==0 && c==0 && d==0) 
{
      	a = 18; 
      	b = 18; 
      	c = 18; 
      	d = 18;
    	}
  }

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[d]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[c]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[a]);  
  digitalWrite(latchPin, HIGH);
}

void allOff() // turns off all segments
{
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, 0);  
  shiftOut(dataPin, clockPin, LSBFIRST, 0);  
  shiftOut(dataPin, clockPin, LSBFIRST, 0);  
  shiftOut(dataPin, clockPin, LSBFIRST, 0);  
  digitalWrite(latchPin, HIGH);
}

void loop() 
{
  for (int z=900; z<=1100; z++)
  {
    displayNumber(z, false);
    delay(10);
  }
  delay(1000);

  for (int z=120; z>=0; --z)
  {
    displayNumber(z, true);
    delay(10);
  }
  delay(1000);

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[14]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[13]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[12]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[11]);  
  digitalWrite(latchPin, HIGH);
  delay(1000); 

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[16]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[15]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[14]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[13]);  
  digitalWrite(latchPin, HIGH);
  delay(1000);

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[0]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[1]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[2]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[3]+1);  
  digitalWrite(latchPin, HIGH);
  delay(1000);
  
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[7]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[6]+1);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[5]);  
  shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[4]);  
  digitalWrite(latchPin, HIGH);
  delay(1000);
} 



طريقة العمل :
• فى البداية ، نعرف أطراف الخرج الرقمية المستخدمة في المزلاج latch والساعة clock والبيانات data فى السطور :

كود:
int latchPin = 13;   // connect to LCK pin
int clockPin = 12;   // connect to CLK pin
int dataPin = 11;    // connect to SDI pin

• ثم ننشىء مصفوفة تحتوي على قيم والتى يتم إرسالها إلى سجلات الإزاحة في الموديول لعرض الأرقام والحروف الممكنة. على سبيل المثال ، العنصر الأول – 0xfc – سوف يفعل الشرائح لعرض الرقم “0” ، والعنصر 0x7a للحرف C ، وهلم جرا.
• كما أنشأنا دالة ، بمعرفة المستخدم ، والتى تستخدم لإرسال العدد ككل whole number بين “0” و “9999” إلى الشاشة . للقيام بذلك ، ببساطة استخدم الدالة بالصيغة :

كود:
 void displayNumber(value, true/false);

حيث value هي العدد number المطلوب عرضه (أو المتغير الذي يحتوي على العدد ) – والبارامتر الثانى هو true أو false . يتحكم هذا البارامتر فيما إذا كان لديك صفر بادئة leading zero معروضة (أصفار على الشمال) – true تعنى نعم وجود أصفار على اليسار ، و false تعنى عدم وجود أصفار على اليسار ا.
على سبيل المثال ، لعرض "0123" ، ستستخدم:

كود:
displayNumber(123, true);

والنتيجة :




أو لعرض 500” استخدم :

كود:
displayNumber(500, false);

وتكون النتيجة :



لإيقاف تشغيل جميع الأرقام ، تحتاج إلى إرسال أصفار إلى كل بت في سجل الإزاحة ، ويتم ذلك عن طريق الدالة الآتية :

كود:
allOff();

ماذا عن العلامة العشرية؟
لتشغيل العلامة العشرية لرقم معين ، أضف 1 إلى القيمة التي يتم إرسالها إلى رقم معين. على سبيل المثال ، لعرض 87.65 ، تستخدم:

كود:
 digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[5]);
 shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[6]);
 shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[7]+1); // added one for decimal point
 shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[8]);
 digitalWrite(latchPin, HIGH);

والنتيجة تكون :




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



وتتوافق مخارج كل مسجل إزاحة مع ترتيب الشرائح من اليسار إلى اليمين. لذلك المخارج 0~7 تطابق A~G ثم الفاصلة العشرية.
على سبيل المثال ، لإنشاء الرقم سبعة بعلامة عشرية ، تحتاج إلى تشغيل الشرائح A, B, C , DP والتي تتوافق مع مخرجات مسجل الإزاحة 0،1،2،8.
وبالتالي فإن البايت المراد إرساله إلى سجل الإزاحة سيكون 0b11100001(أو 225 بالأرقام العشرية أو or 0xE1 بالسداسي عشري).
في كل مرة تريد فيها تغيير العرض ، تحتاج إلى إعادة رسم re-draw الأرقام الأربعة (أو أكثر إذا تستخدم أكثر من موديول متصلة) - بحيث يتم إرسال أربعة بايت من البيانات لكل تغيير العرض. تتم معالجة (عنونة) addressed الأرقام من اليمين إلى اليسار ، لذا فإن إرسال البايت الأول مخصص للرقم الأخير - والبايت الأخير مخصص للرقم الأول.
هناك ثلاث مراحل لتحديث الشاشة.
• وضع Set خط ساعة المزلاج latch على الحالة المنخفضة low .
• إزاحة للخارج Shift out أربعة بايت من البيانات من المتحكم الخاص بك .
• وضع خط ساعة المزلاج هلى الحالة المرتفعة high .
على سبيل المثال ، باستخدام الكود:

كود:
   digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, 0b10000000); // digit 4
  shiftOut(dataPin, clockPin, LSBFIRST, 0b01000000); // digit 3
  shiftOut(dataPin, clockPin, LSBFIRST, 0b00100000); // digit 2
  shiftOut(dataPin, clockPin, LSBFIRST, 0b00010001); // digit 1
  digitalWrite(latchPin, HIGH);

تكون النتيجة :



لاحظ كيف تتطابق البايتات الثنائية مع خريطة الأرقام وموضعها. على سبيل المثال ، كان البايت الأول مرسل للرقم الرابع ، وتم تشغيل الشريحة A. وهذا كل ما في الأمر - عرض أنيق وبسيط.

إضافة رد

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

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

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


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

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