أنت هنا:إصنعها»العقول الإلكترونية»المتحكم AVR ـ»البرمجة في bascom-AVR ـ»برمجة الأنظمة المدمجة ببيئة bascom avr – الدرس 3

برمجة الأنظمة المدمجة ببيئة bascom avr – الدرس 3

كتبه البرمجة في bascom-AVR ـ 9328 1
آخر تعديل في الجمعة, 11 كانون1/ديسمبر 2020 17:56
برمجة الأنظمة المدمجة ببيئة BASCOM-AVR – الدرس 3
قيم الموضوع
(4 أصوات)

هذه المحاضرة تشرح تعليمات الإزاحة والدوران وتقدم مثالاً تطبيقياً عليها. ثم تقدم القواطع في متحكمات AVR وأنواعها وتشرع في القواطع الخارجية ومبدأ عملها ولمحة عن المسجلات الداخلية للقواطع الخارجية. ثم تقدم تطبيقاً عملياً لاستثمار القواطع الخارجية في متحكمات AVR وبرمجتها في البيئة BASCOM-AVR ومحاكاتها في البيئة Proteus. وأخيراً طريقة توصيل لوحة مفاتيح مصفوفية ومنهجية المسح.

 {jumi [*3]}


تسميات

إنتبه إلى أنه قد اعتمدنا التسميات التالية خلال هذه السلسلة:

  • متحكم (مصغر) عوض Microcontroller

  • زوج عوض bit

  • ثمن عوض byte بالإنجليزية و octet بالفرنسية

تجد جميع مصطلحات مقالات هذه السلسلة في قاموس المصطلحات التابع لها.

 


ملفات المقال

يمكنك تحميل ما يلي للاستفاذة أكثر من المقال:

Session_05_PPTX

Session_05_codes

 


محاضرة المقال

{jumi [*3]} 


الإزاحة (Shifting)

تستخدم تعليمات الإزاحة والدوران بهدف إزاحة زوج واحد أو أكثر - من ثمن أو أكثر – إلى اليمين أو إلى اليسار؛ وهناك فرق بين عملية الإزاحة وعملية الدوران لقيمة ما حيث:

  • في الإزاحة كل زوج يخرج (من اليمين أو اليسار) يدخل مكانه صفر. مثال ذلك: إذا تم إزاحة القيمة B11111111& ثمان مرات إلى اليمين أو اليسار فستصبح القيمة عندها B00000000&.

مثال: A = &B11011011

Shift A ,Right, 1

0

1

1

0

1

1

0

1

Shift A ,Right, 4

0

0

0

0

1

1

0

1

 


التدوير (Rotating)

  • في الدوران كل زوج يخرج (من اليمين أو اليسار) يدخل من الطرف الآخر – أي يتم تدوير القيمة. مثال ذلك: إذا تم تدوير القيمة B11111111& ثمان مرات إلى اليمين أو اليسار فستبقى القيمة على حالها. وإذا تم تدوير القيمة B00001111& أربع مرات إلى اليمين أو اليسار فستصبح B11110000&.

مثال: A = &B11011011

Rotate A ,Right, 1

1

1

1

0

1

1

0

1

Rotate A ,Right, 4

1

1

0

1

1

1

0

1

 


تعليمات الإزاحة والتدوير في Bascom

شرح التعليمة

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

إزاحة زوج من متغير (var) إلى اليمين أو اليسار وعدد خانات الإزاحة محددة بـ [, shift]

Shift var ,Right/Left [, shift]

تدوير زوج من متغير (var) إلى اليمين أو اليسار وعدد خانات الدوران محددة بـ [, shift]

Rotate var ,Right/Left [, rotate]

 

التجربة الحادية عشرة

استخدم المفاتيح اللحظية S1-S2 (PIND.3, PIND.2)iعلى اللوحة التعليمية لإزاحة وتدوير قيمة تظهر على الصمامات الضوئية الثمانية (LEDs) الموصولة بالبوابة PORTC.

الشكل 1: توصيل الثنائيات والمفاتيح مع المتحكم للتجربة 11

 

البرنامج Exp.11.bas في بيئة BASCOM-AVR:

' ******************************************************************************
' * Title : Exp.11.bas *
' * Target MCU : ATMega128A *
' * Author : Walid Balid *
' * IDE : BASCOM AVR 2.0.7.3 *
' * Peripherals : DIP-Switch *
' * Description : Shift/Rotate *
' ******************************************************************************
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'-----------------------[Definitions]
$regfile="m32def.dat"
$crystal= 8000000
'-----------------------
'-----------------------[GPIO Configurations]
ConfigPortc=Output: Leds AliasPortc

ConfigPind.2 =Input: Sw_1 AliasPind.2 :Portd.2 = 1 'PU Internal Resistor
ConfigPind.3 =Input: Sw_2 AliasPind.3 :Portd.3 = 1
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'--->[Main Program]
Leds
=&B11011011
Do
Debounce Sw_1 , 0 , Shift_r ,Sub
Debounce Sw_2 , 0 , Shift_l ,Sub
Loop
End
'---<[End Main]
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'--->[Shift LEDs to Right]
Shift_r
:
Shift Leds ,Right, 1
'Rotate Leds , Right , 1
Return
'---<
'--->[Shift LEDs to Left]
Shift_l
:
Shift Leds ,Left, 1
'Rotate Leds , Left , 1
Return
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 


القواطع في متحكمات AVR

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

  1. الطريقة التقليدية (Polling):
    يمكن أن نطلق على هذه الطريقة القاطعة البرمجية (Software Interrupts) وتتم بالفحص الدوري لحالة القطب (IfSw = 0 Then) من أجل اكتشاف تغير حالة المفتاح ويتم هذا بشكل برمجي، وبالتالي سوف يشغل المتحكم في عملية الفحص الدوري المتكرر للتحقق من حالة المفتاح بشكل دائم، الأمر الذي سيؤدي إلى ضياع في قدرة المعالجة للمتحكم واستهلاك في الطاقة.

  2. طريقة القاطعة (Interrupt):
    يمكن أن نطلق على هذه الطريقة قاطعة الكيان الصلب (Hardware Interrupts) وتتم من خلال آلية مستقلة مبنية ضمن المتحكم تقوم على قاطعة المتحكم عندما تتحقق الحالة المطلوبة فقط، وبالتالي لن ينشغل المتحكم بتفحص المفاتيح من أجل معرفة فيما إذا تغيرت حالة المفتاح أم لا، وإنما عندما تتغير الحالة المنطقية للمفتاح على قطب القاطعة سوف يتم قاطعة المتحكم ويقفز إلى برنامج خدمة القاطعة الخارجية المتعينة من أجل تنفيذها.

الشكل 2: تمثيل عملية القاطعة والقفز من البرنامج الرئيسي إلى برنامج القاطعة والعودة إلى البرنامج الرئيسي

 


مصادر القواطع في متحكمات AVR

تمتلك العائلة AVR مجموعة كبيرة من مصادر القاطعة المختلفة، وتمتلك كل من هذه القواطع عنوان مستقل في حيز ذاكرة البرنامج، ولكل قاطعة خانة تمكين مستقلة، فعندما نرغب بتفعيل إحدى القواطع فإنه يتوجب علينا تفعيل الخانة المخصصة لها في مسجل التحكم بالقاطعة المعنية إلى جانب تفعيل خانة تمكين القاطعة العامة Iفي مسجل الحالة SREG.

الشكل 3: الخانة 7 شعاع القواطع العام (Global Interrupt Vector) في مسجل الحالة SREG

يمكن تمثيل شعاع القواطع العام (Global Interrupt Vector) بقاطع رئيسي، وباقي القواطع كقواطع فرعية، وبالتالي لا يكفي تفعيل القاطعة الفرعية وإنما يجب أيضاً تفعيل شعاع القواطع العام معها كما هو مبين على الشكل التالي.

الشكل 4: تمثيل لحالة شعاع القواطع العام (Global Interrupt Vector) والقواطع الفرعية الأخرى

 


تصنيف القواطع في متحكمات AVR

يمكن تقسيم القواطع في العائلة AVR إلى مجموعتين رئيسيتين، تضم كل مجموعة من المجموعتين مجموعات فرعية أخرى:

  • قواطع خارجية (External Interrupts):
    لها ارتباط مباشر مع الأقطاب الفيزيائية للمتحكم وتستجيب لأحداث خارجية مطبقة على أقطاب المتحكم وهي:

    • قاطعة التصفير (Reset).

    • قواطع الطلب الخارجي (INT0 إلى INT7).

  •  
  • قواطع داخلية (Internal Interrupts):
    لها ارتباط مع الوحدات المحيطية الداخلية فقط للمتحكم وهي:

    • قواطع المؤقتات (OV, COMP).

    • قواطع حادثة المسك للمؤقتات/عدادات (ICP).

    • قواطع العدادات.

    • قاطعة اكتمال التحويل للـADC.

    • قاطعة اكتمال الإرسال للنافذة التسلسلية SPI (STC)i.

    • قواطع النافذة التسلسلية USART (RX,TX,UDR)i.

    • قاطعة المقارن التشابهي (ANALOG COMP).

    • قاطعة اكتمال كتابة المعطيات إلى الذاكرة EEPROM.

    • قاطعة النافذة التسلسلية TWI.

    • وغيرها...

 


مبدأ عمل القواطع في متحكمات AVR

تتمتع وحدة القواطع بمسجلات تحكم خاصة في المساحة المخصصة للدخل/الخرج بالإضافة إلى خانة تفعيل خاصة (I) ضمن مسجل الحالة، وتتمتع كل قاطعة بشعاع قاطعة منفصل في جدول أشعة القواطع، ويكون لكل قاطعة أولوية متناسبة مع موقع شعاعها ضمن الجدول، فكلما كان عنوان شعاع القاطعة أدنى كلما كانت ذات أولوية أعلى.

الشكل 5: عناوين أشعة القواطع في المتحكم ATmega32A

 

الشكل 5 يبين القائمة الكاملة للقواطع في المتحكم ATmega32Aوعناوين الأشعة لهذه القواطع، كما تحدد هذه القائمة أيضاً مستويات الأولوية للقواطع، فالعنوان الأخفض ($000) هو الشعاع ذو الأولوية الأعلى، فلقاطعة التصفير مثلاً الأولوية الأعلى ومن ثم القاطعة الخارجية INT0وهكذا...

 

عندما تحدث قاطعة ما فإنه يتم تلقائياً تصفير خانة تمكين القاطعة العامة (I = 0)، وبالتالي تحجب جميع القواطع الأخرى إلى حين الانتهاء من القاطعة الحالية، إلا أن المبرمج يستطيع أن يُفعّل خانة تمكين القاطعة العامة (I = 1) داخل برنامج خدمة القاطعة في حال أريد الإبقاء على القواطع الأخرى. وعندما ينفذ المتحكم تعليمة العودة RETURN الواقعة في نهاية برنامج خدمة القاطعة، فإنه يتم تلقائياً تفعيل خانة تمكين القاطعة العامة (I = 1).

 


ملاحظات هامة حول القواطع في متحكمات AVR

  • عند استخدام أي قاطعة فإنه يجب تفعيل شعاع القواطع العام I والذي يمكن تمثيله كقاطع رئيسي لجميع القواطع.

  • عندما تحدث قاطعة ما يتم تلقائياً تصفير شعاع القواطع العام I في مسجل الحالة وبذلك يتم إلغاء الاستجابة لجميع القواطع الأخرى، وتتم عملية إعادة تفعيل الخانةI بعد الانتهاء من تنفيذ أية قاطعة تلقائياً أيضاً.

  • إذا تحقق شرط إحدى القواطع أو أكثر، وكانت خانة تمكين القاطعة العامة غير مفعلة (I = 0)، فإن أعلام القاطعة التي حدثت ستفعل (“1”) تلقائياً وتبقى كذلك إلى أن يتم تأهيل خانة القاطعة العامة (I = 1)، فإذا ما تم تفعيل خانة القاطعة العامة (I = 1) عندها يبدأ المتحكم بتنفيذ برامج خدمة القاطعة بحسب أولويات أشعتها.

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

  • عندما ينتهي تنفيذ برنامج خدمة قاطعة ما، فإن سيتم العودة إلى البرنامج الرئيسي وينفذ المتحكم تعليمة واحدة على الأقل قبل أن ينتقل لتنفيذ قاطعة أخرى في حال وجود قواطع متراكمة أثناء برنامج خدمة القاطعة الأخيرة.

  • ينصح بأن يكون برنامج خدمة القاطعة قصيراً جداً (يمكن تفعيل علم تحقق القاطعة وتفحص العلم في البرنامج الرئيسي وتنفيذ جملة تعليمات تبعاً لحالة علم القاطعة) وجميع المعالَجات تتم في البرنامج الرئيسي من أجل الاستجابة المباشرة للقواطع الأخرى حال حصولها.

 


زمن استجابة القاطعة

إن الاستجابة الزمنية عند تنفيذ القواطع بالنسبة لمتحكمات عائلة AVR هي على الأقل أربع دورات ساعة (4-Cycle) يتم خلالها دفع (Push) محتوى عداد البرنامجPC (Program Counter)i إلى المكدس SP ويستهلك الدفع 2-Cycle، ومن ثم يقفز البرنامج إلى برنامج خدمة القاطعة ويستهلك القفز 2-Cycle. وإذا حدثت القاطعة أثناء تنفيذ إحدى التعليمات التي زمن تنفيذها أكبر من دورة واحدة، فإنه يتم استكمال تنفيذ التعليمة قبل الانتقال إلى برنامج خدمة القاطعة. إن العودة من برنامج خدمة القاطعة تستهلك أربع دورات ساعة (4-Cycle) أيضاً يتم خلالها سحب (Pull) قيمة عداد البرنامجPC من المكدس SP ويستهلك السحب 2-Cycle، ومن ثم يقفز إلى البرنامج الرئيسي ويستهلك القفز 2-Cycle، وينفذ ابتداءً من التعليمة التالية للتعليمة التي حدثت عندها القاطعة.

 


القواطع الخارجية في متحكمات AVR

تمتلك متحكمات العائلة AVR أقطاب مخصصة للقواطع الخارجية والتي يرمز لها INT0 و INT1 و… و INT7. الهدف من هذه القواطع الخارجية هو الاستجابة لأحداث معينة تطبق على أقطاب هذه القواطع. تملك هذه القواطع الخارجية أنماط استجابة متعدة للجبهات المطبقة عليها وكذلك يمكن تفعيلها أو إلغاء تفعيلها من خلال مجموعة من مسجلات التحكم الخاصة بهذه القواطع.

 

  مسجلات التحكم بالقواطع الخارجية في متحكمات AVR

تملك القواطع الخارجية ثلاث مسجلات تحكم وهي:

  • GIFR: مسجل أعلام القواطع الخارجية، اختصار لجملة Global Interrupt Flag Register

  • GICR: مسجل التحكم بالقواطع الخارجية، اختصار لجملة Global Interrupt Mask Register

  • MCUCR: مسجل التحكم بنمط عمل القاطعة الخارجية، اختصار لجملة MCU Control Register

 

  1. مسجل التحكم بنمط عمل القاطعة الخارجية MCUR: يتم من خلاله التحكم بحساسية أو نمط استجابة القاطعة للحدث الخارجي المطبق على قطب القاطعة ويوجد أربع حالات وهي:

  1. تقدح عن مستوى الحافة (Low Level)

  2. تقدح عن تغير المستوى (Level Change)

  3. تقدح عن الحافة الهابطة (Falling Edge)

  4. تقدح عن الحافة الصاعدة (Rising Edge)

الشكل 6: مسجل التحكم بنمط عمل القاطعة الخارجية MCUR للقواطع [INT0/INT1]

 

على اعتبار وجود أربعة حالات لنمط عمل كل قاطعة من القواطع الخارجية فإن هذا سيحتاج إلى خانتين في مسجل التحكم بنمط عمل القاطعة الخارجية لكل قاطعة حيث:

تمثل الخانتين ISC00 وISC01 خانتي التحكم بنمط عمل القاطعة الخارجية INT0،

وتمثل الخانتين ISC10 وISC11 خانتي التحكم بنمط عمل القاطعة الخارجية INT1،

وهكذا باقي القواطع الأخرى...

الشكل 7: اختيار حالات نمط استجابة القاطعة للحدث للقاطعة INT1

  1. مسجل التحكم بالقواطع الخارجية GICR: تمثل كل خانة من الخانات الثلاث (5,6,7) في المسجل خانة لتفعيل طلب قاطعة خارجية من القواطع الخارجية الثلاثة (INT0 و INT1 و INT2) للمتحكم ATmega32A، حيث أنه عند وضع القيمة “1” في خانة المسجل GICR.n فإنه يتم تمكين القاطعة الموافقة لهذه الخانة بشرط أن تكون الخانةI في مسجل الحالة SREG مفعلة (“1”)، أما عند وضع “0” في خانة المسجل GICR.n فإنه يتم إلغاء تمكين القاطعة الموافقة (n).

الشكل 8: مسجل التحكم القواطع الخارجية GICR

  1. مسجل أعلام القواطع الخارجية GIFR: تمثل كل خانة من الخانات الثلاث (5,6,7) في المسجل علم يشير لحدوث قاطعة خارجية (GIFR.n = “1”) من القواطع الثلاث (INT0, INT1, INT2) للمتحكم ATmega32، وبالتالي سوف يقفز المتحكم إلى شعاع القاطعة المتوضع عند العنوان المحدد في ذاكرة البرنامج لينفذ برنامج خدمة القاطعة، وعند العودة من برنامج خدمة القاطعة سيتم تصفير هذا العلم بشكل تلقائي من قبل الكيان الصلب.

الشكل 9: مسجل أعلام القواطع الخارجية GIFR

 


برمجة القواطع الخارجية في BASCOM-AVR

بشكل عام فإنه من أجل برمجة القواطع الخارجية فإنه يجب:

  • تحديد نمط عمل (State: Rising | Falling | Low | Level) القاطعة الخارجية (INTx).

ConfigINTx= State

  • تحديد اسم البرنامج الفرعي (Label) للقاطعة (INTx).

OnINTxLabel

  • تفعيل (Enable) شعاع القاطعة المطلوبة تشغيلها.

EnableINTx

  • تفعيل شعاع القواطع العام.

EnableInterrupts

ملاحظة 1: يمكن أثناء عمل البرنامج إلغاء تفعيل أي من القواطع الخارجية من خلال التعليمة:

DisableINTx

ملاحظة 2: يمكن أثناء عمل البرنامج إلغاء تفعيل شعاع القواطع العام من خلال التعليمة:

DisableInterrupts

ملاحظة 3: التعليمة Print تستخدم لطباعة البيانات على النافذة التسلسلية UART في حال الوصل مع الحاسب.

 

التجربة الثانية عشرة

المطلوب تعديل التجربة الثامنة لتعمل المفاتيح اللحظية الثلاث (S1 و S2 و S3) الموصولة إلى أقطاب القواطع الخارجية INT2 و INT1 و INT0، على تغيير حالة عمل (Toggle) الثنائي D1 عن الضغط على المفتاح S1، وتغيير حالة D2 عند الضغط على S2، وتغيير حالة D3 عند الضغط على S3 – باستخدام القواطع الخارجية بدلاً من الفحص الدوري لحالة المفاتيح.

الشكل 10: توصيل المفاتيح اللحظية الثنائيات مع المتحكم ATmega32A على اللوحة Mini-Phoenix للتجربة 12

 

البرنامج Exp.12.bas في بيئة BASCOM-AVR:

' ******************************************************************************
' * Title : Exp.12.bas *
' * Target Board : Mini-Phoenix - REV 1.00 *
' * Author : Walid Balid *
' * IDE : BASCOM AVR 2.0.7.3 *
' * Peripherals : Pull-Up Resistors *
' * Description : External Interrupts *
' ******************************************************************************
' Set the SW Jumbers to GND (Active Low)
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'-----------------------[Definitions]
$regfile="m32def.dat"
$crystal= 8000000
$baud= 9600
'-----------------------
'-----------------------[GPIO Configurations]
ConfigPortc=&B00000111
Led1
AliasPortc.0 : Led2 AliasPortc.1 : Led3 AliasPortc.2
Set Led1 :Set Led2 :Set Led3
'-----------------------
'-----------------------[External Interrupts Configurations]

ConfigInt0= Falling :OnInt0 Sw_r1 :EnableInt0:Portd.2 = 1 'PU Resistor
ConfigInt1= Falling :OnInt1 Sw_r2 :EnableInt1:Portd.3 = 1
ConfigInt2= Falling :OnInt2 Sw_r3 :EnableInt2:Portb.2 = 1

EnableInterrupts
'-----------------------[Variables]
Dim Count1 AsByte, Count2 AsByte, Count3 AsByte
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'--->[Main Program]
Print"Hello!"
Do

Loop
End
'---<[End Main]
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'--->[Print]
Sw_r1
:
Toggle Led1 : Count1 = Count1 + 1
Print"Sw1 has Pressed! > "; Count1
Return
'---<
Sw_r2
:
Toggle Led2 : Count2 = Count2 + 1
Print"Sw2 has Pressed! > "; Count2
Return
'---<
Sw_r3
:
Toggle Led3 : Count3 = Count3 + 1
Print"Sw3 has Pressed! > "; Count3
Return
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 


توصيل وبرمجة لوحة مفاتيح مصفوفية مع متحكم AVR

من أجل ربط عدد كبير من المفاتيح اللحظية مع متحكم مصغر فإنه ليس من المجدي ربط كل مفتاح إلى قطب كما مر معنا في التجارب السابقة لأن عدد الأقطاب المستهلكة من المتحكم ستساوي عدد المفاتيح التي تم ربطها مع تلك الأقطاب. لذلك يتم ربط المفاتيح مع بعضها بطريقة مصفوفية – أي يتم توصيل النقطة الأولى للمفاتيح المتوضعة على سطر واحد مع بعضها لتشكل قطب واحد يمثل السطر، كذلك يتم توصيل النقطة الثانية للمفاتيح المتوضعة على عمود واحد مع بعضها لتشكل قطب واحد يمثل العمود... وهكذا كما هو مبين على الشكل 11.

الشكل 11: لوحة المفاتيح المصفوفية (Matrix-Keypad) المؤلفة من 16-key

 

تستخدم لوحة المفاتيح المصفوفية بشكل أساسي في الهواتف، ويمكن أن تكون مؤلفة من 9 مفاتيح (3×3) أو 16 مفتاح (4×4) أو أكثر...
ويكون دائماً عدد أقطاب توصيل اللوحة مساوياً إلى مجموع الأسطر والأعمدة (4×4 > 8-Lines).

يتم توصيل لوحة المفاتيح مع أقطاب المتحكم المصغر مباشرة، ومنهجية مسح اللوحة لمعرفة المفتاح المضغوط تتم على الشكل التالي:

  1. يجب وصل العمود الأول إلى القطب الأول من البوابة (مثلاً:PINB.0 ) والعمود الثاني إلى القطب الثاني وهكذا... ثم يتم توصيل السطر الأول إلى القطب التالي من نفس البوابة... ففي حال لوحة مفاتيح4×4 فإن التوصيل سيكون كما هو مبين على الشكل 13.

  2. يتم تعريف أقطاب المتحكم الموصولة مع الأعمدة كأقطاب خرج، ويتم تعريف الأقطاب الموصولة مع الأسطر كأقطاب دخل.

  3. يبدأ المسح بكتابة القيمة “1” على العمود الأول (على اعتبار أن الأقطاب الموصلة مع الأعمدة هي أقطاب خرج) وقراءة القيمة الظاهرة على الأسطر (على اعتبار أن الأقطاب الموصلة مع الأسطر هي أقطاب دخل). في حال لم يكن هناك أي مفتاح مضغوط فإن القيمة على الأسطر ستكون “0000”. وفي حال كان هناك مفتاح مضغوط فإن السطر الذي ضغط فيه المفتاح ستظهر عليه القيمة المطبقة على العمود “1” وبالتالي يمكن معرفة المفتاح المضغوط. ثم ينتقل المسح إلى العمود الثاني ويكرر العملية السابقة ثم الثالث فالرابع وهكذا حتى يعود للعمود الأول ضمن دورة مسح لانهائية كما في الشكل 12.

الشكل 12: توصيل مجموعة المفاتيح مع المتحكم المصغر وحالة المسح

 

من أجل قراءة لوحة مفاتيح ست عشرية في البيئة BASCOM-AVR فإننا نحتاج إلى تعليميتين أساسيتين:

  1. تعريف البوابة الموصول معها لوحة المفاتيح وتعريف زمن التأخير (Debounce) لتفادي أثر العطالة الميكانيكية للمفاتيح.

Config Kbd =Portb,Debounce= 100 ,Delay= 100

  1. قراءة حالة المفاتيح.

Var =Getkbd()

الدالة “Getkbdستعود بقيمة عددية تتراوح بين 0 و16 تمثل المفتاح المضغوط. حيث يعود هذا الدالة بالقيمة Var = 16 إذا لم يكن هناك أي مفتاح مضغوط. وأما إذا كان هناك مفتاح مضغوط فسيعود بقيمة المفتاح المضغوط كما يلي:

Var(S1) 0
Var(S2) 1
Var(S3) 2
Var(A ) 3
Var(S4) 4
Var(S5) 5
Var(S6) 6
Var(B ) 7
Var(S7) 8
Var(S8) 9
Var(S9) 10
Var(C ) 11
Var(S*12
Var(S0) 13
Var(S#) 14
Var(D ) 15

 

الشكل 13 توصيل مجموعة المفاتيح مع المتحكم المصغر والقيم التي يعود بها الدالة “Getkbd”

 

التجربة الثالثة عشرة

المطلوب كتابة برنامج لقراءة حالة لوحة مفاتيح موصلة بشكل مصفوفي إلى البوابة PORTB لمعرفة المفتاح المضغوط وطباعة اسم المفتاح المضغوط على النافذة التسلسلية UART كما هو مبين على الشكل 14 – ثم يطلب تطبيقها على اللوحة التعليمية مباشرة.

الشكل 14: توصيل مجموعة من المفاتيح مع المتحكم Atmega32A
لتشكيل لوحة مفاتيح 16-key/Keypad للتجربة 13

 

البرنامج Exp.13.bas في بيئة BASCOM-AVR:

' ******************************************************************************
' * Title : Exp.13.bas *
' * Target Board : Mini-Phoenix - REV 1.00 *
' * Target MCU : ATMega32A *
' * Author : Walid Balid *
' * IDE : BASCOM AVR 2.0.7.3 *
' * Peripherals : Keypad *
' * Description : GPIOs as Input/Keypad *
' ******************************************************************************
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'-----------------------[Definitions]
$regfile="m32def.dat"
$crystal= 8000000
$baud= 9600
'-----------------------
'-----------------------[Keypad Configurations]
Config Kbd =Portb,Debounce= 100 ,Delay= 100
'-----------------------
'-----------------------[Variables]
Dim Var AsByte
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'--->[Main Program]
Do
Var
=Getkbd()
If Var < 16 ThenGosub Check_number
Loop
End
'---<[End Main]
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'--->[Print the Key Number]
Check_number
:
SelectCase Var
Case 00 :Print"Key Pressed is (1)"
Case 01 :Print"Key Pressed is (2)"
Case 02 :Print"Key Pressed is (3)"
Case 03 :Print"Key Pressed is (A)"
Case 04 :Print"Key Pressed is (4)"
Case 05 :Print"Key Pressed is (5)"
Case 06 :Print"Key Pressed is (6)"
Case 07 :Print"Key Pressed is (B)"
Case 08 :Print"Key Pressed is (7)"
Case 09 :Print"Key Pressed is (8)"
Case 10 :Print"Key Pressed is (9)"
Case 11 :Print"Key Pressed is (C)"
Case 12 :Print"Key Pressed is (*)"
Case 13 :Print"Key Pressed is (0)"
Case 14 :Print"Key Pressed is (#)"
Case 15 :Print"Key Pressed is (D)"
EndSelect
Return
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


الحقوق الفكرية

حقوق النشر محفوطة م.وليد بليد

Copyright © 2012 Walid Balid All rights reserved


تأليف

 

المؤلف: وليد بليد (سوريا)


 {jumi [*3]}
{jumi [*3]}
{jumi [*3]}

التعليقات  

ali alhusaini
0 # ali alhusaini 2016-07-26 04:47
شكرا لمجهوداتك الراااائعة استاذ وليد
ولكن الأكثر من ذلك هو نفسك الخالية من الأنانية وهذا نجاح بحد ذاته
فهنيئا لك لكل جهدك
رد | رد مع اقتباس | اقتباس | تقرير إلى المدير

أضف تعليقا


إصنعها يريد أن يتأكد أنك لست روبوتا، لذلك أحسب ما يلي:

كود امني
تحديث