إذا كنت بحـاجـة إلى زيادة عدد المداخل و المخارج الخاصـة بالأردوينـو أو المتحكم الدقيق فأنت تبحـث عن مسجل الإزاحـة Shift Register. مسجل الإزاحة هو عبارة عن شريحة الكترونية تسمح بزيادة عدد المدخلات (inputs) أو المخرجات (outputs) الخاصة بمتحكم دقيق (microcontroller).
يتم ذلك من خلال تحويل البيانات بين الشكلين التسلسلي (serial) والمتوازي (parallel). حيث يقوم المعالج الدقيق (microprocessor) بالاتصال بمسجل الإزاحة باستخدام المعلومات التسلسلية، بينما يقوم مسجل الإزاحة بجمع أو إخراج المعلومات بشكل متوازي (عبر عدة منافذ).
تأتي مُسجلات الإزاحة في شكلين رئيسيين:
في الغالب يتم استخدام مُسجلات الإزاحة بغرض توفير المنافذ الموجودة على المتحكم الدقيق. فكل مُتحكم دقيق له عدد محدود من المنافذ من أجل المدخلات والمخرجات الرئيسية. إذا كان هناك أحد المشاريع بحاجة للتحكم بـ 16 ديود مضيء فسيطلب ذلك استخدام 16 منفذ من منافذ الدخل/الخرج الخاصة بالمتحكم الدقيق. في حال لم يكن لديك 16 منفذ مُتاح فهنا تأتي أهمية مُسجلات الإزاحة. فباستخدام اثنين من مُسجلات الإزاحة متصلين على التوالي يُمكننا التحكم بالديودات المضيئة الـ 16 من خلال أربعة منافذ دخل/خرج فقط. هذا يُشكل فرق كبير. ويمكن توفير المزيد من المنافذ عن طريق توصيل المزيد من مُسجلات الإزاحة معاً.
مثــال على مسجـل الإزاحـة 74hc165
يحتاج مُسجل الإزاحة ذو الثمانية بتات (8 bit) لأربعة خطوط اتصال مع المُتحكم الدقيق. واحد من أجل الساعة (Clock) لتوقيت نقل البيانات، واحد لتمكين الساعة، واحد لتحميل/ تخزين/ إزاحة (loading/latching/shifting) البتات، وواحد من أجل النقل التسلسلي للبيانات.
قم بتوصيل منفذ الساعة (CLK) بالمنفذ 12، ومنفذ تمكين الساعة (clock enable) (CE) بالمنفذ 9. تقوم الساعة بتحديد التردد الذي يتم عبره إزاحة البتات، بينما خط تمكين الساعة يسمح لإشارة الساعة بالانتشار عبر دائرة الإزاحة.
قم بتوصيل منفذ الإزاحة/التحميل (SH/LD) بالمنفذ 8. انتقال منفذ التحميل إلى الحالة المنخفضة low يأمر مُسجل الإزاحة بإمساك الحالة الحالية لمنافذ الدخل الثمانية (من A حتى H). يُمكن توصيل المنافذ A-H بأي نوع من المدخلات مثل الأزرار أو المفاتيح أو دائرة ترانزستور رقمية. وإذا أردت اختبارها يُنصح بأن تقوم بتوصيلها مباشرة بمصدر الطاقة أو بالأرضي (ground) للتأكد من أن كل شيء يسير على ما يرام. في هذا المثال سنقوم بتوصيل إحداها بزر باستخدام مقاوم رفع (pull up resistor) وتوصيل الباقي بمصدر الطاقة أو بالأرضي.
قم بتوصيل منفذ الخرج التسلسلي (SER_Out) بالمنفذ رقم 11. هذا المنفذ هو حيث يتم استقبال المعلومات التسلسلية من مُسجل الإزاحة. كذلك قم بتوصيل منفذ الدخل التسلسلي (SER_IN) بالأرضي. إذا كنت تريد توصيل عدة مُسجلات إزاحة معاً فيجب أن تقوم بتوصيل منفذ الدخل التسلسلي للمُسجل بمنفذ الخرج التسلسلي لمُسجل الإزاحة السابق له. أما المُسجل الأول في السلسلة فيجب أن يبقى منفذ الدخل الخاص به مُتصلاً بالأرضي، بينما يتم توصيل منفذ الخرج التسلسلي لآخر مُسجل ضمن السلسلة بالمُعالج الدقيق بدلاً من توصيله بمُسجل إزاحة آخر.
لا تنسى توصيل منفذي الطاقة (2-6V) والأرضي أيضاً. بعد أن قمنا بتوصيل كل شيء دعونا نلقي نظرة على البرنامج المُستخدم.
// HARDWARE CONNECTIONS
// Connect the following pins between your Arduino and the 74HC165 Breakout Board
// Connect pins A-H to 5V or GND or switches or whatever
const int data_pin = 11; // Connect Pin 11 to SER_OUT (serial data out)
const int shld_pin = 8; // Connect Pin 8 to SH/!LD (shift or active low load)
const int clk_pin = 12; // Connect Pin 12 to CLK (the clock that times the shifting)
const int ce_pin = 9; // Connect Pin 9 to !CE (clock enable, active low)
byte incoming; // Variable to store the 8 values loaded from the shift register
// The part that runs once
void setup()
{
// Initialize serial to gain the power to obtain relevant information, 9600 baud
Serial.begin(9600);
// Initialize each digital pin to either output or input
// We are commanding the shift register with each pin with the exception of the serial
// data we get back on the data_pin line.
pinMode(shld_pin, OUTPUT);
pinMode(ce_pin, OUTPUT);
pinMode(clk_pin, OUTPUT);
pinMode(data_pin, INPUT);
// Required initial states of these two pins according to the datasheet timing diagram
digitalWrite(clk_pin, HIGH);
digitalWrite(shld_pin, HIGH);
}
// The part that runs to infinity and beyond
void loop() {
incoming = read_shift_regs(); // Read the shift register, it likes that
// Print out the values being read from the shift register
Serial.println("\nThe incoming values of the shift register are: ");
Serial.print("ABCDEFGH : ");
print_byte(incoming); // Print every 1 and 0 that correlates with A through H
//Serial.println(incoming,BIN); // This way works too but leaves out the leading zeros
delay(2000); // Wait for some arbitrary amount of time
}
// This code is intended to trigger the shift register to grab values from it's A-H inputs
byte read_shift_regs()
{
byte the_shifted = 0; // An 8 bit number to carry each bit value of A-H
// Trigger loading the state of the A-H data lines into the shift register
digitalWrite(shld_pin, LOW);
delayMicroseconds(5); // Requires a delay here according to the datasheet timing diagram
digitalWrite(shld_pin, HIGH);
delayMicroseconds(5);
// Required initial states of these two pins according to the datasheet timing diagram
pinMode(clk_pin, OUTPUT);
pinMode(data_pin, INPUT);
digitalWrite(clk_pin, HIGH);
digitalWrite(ce_pin, LOW); // Enable the clock
// Get the A-H values
the_shifted = shiftIn(data_pin, clk_pin, MSBFIRST);
digitalWrite(ce_pin, HIGH); // Disable the clock
return the_shifted;
}
// A function that prints all the 1's and 0's of a byte, so 8 bits +or- 2
void print_byte(byte val)
{
byte i;
for(byte i=0; i<=7; i++)
{
Serial.print(val >> i & 1, BIN); // Magic bit shift, if you care look up the <<, >>, and & operators
}
Serial.print("\n"); // Go to the next line, do not collect $200
}
الطائــف - المملكــة العربيــة السعــوديـة
المختــرع المجنــون © جميـــع الحقــوق محفوظــة