برمجة الأنظمة المدمجة ببيئة BASCOM-AVR – الدرس 2

برمجة الأنظمة المدمجة ببيئة BASCOM-AVR – الدرس 2

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


تسميات

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

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

  • زوج عوض bit

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

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

 


ملفات المقال

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

Session_04_PPTX

Session_04_codes

 


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

 


برمجة بوابات الدخل والخرج في متحكمات AVR

 

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

تم وصل عشرة ثنائيات ضوئية إلى متحكم ATmega32A على القطب PIND.6 (“1”)i، وعشرة أخرى إلى القطب PIND.7 (“0”)i، والمطلوب: كتابة برنامج خفقان لكلا المجموعتين معاً كل 0.5S وتصميم دارة المفتاح الترانزستوري.

الشكل 1: توصيل الثنائيات مع المتحكم عن طريق مفاتيح تحكم ترانزستورية للتجربة 4

 

أولاً: إن الترانزستور الذي قمنا باختيارهBC337 له المواصفات التالية:

ICmax=800mA, VBE_saturate=0.65V, VCE_saturate=0.2V, hFE = 100, VCE_max=50V

 

ثانياً: نحسب تيار الحمل (IC) الكلي علماً أنILED = 10mA و VLED = 2.2V:

IC = 10 × 10mA = 100mA

 

ثالثاً: نحسب مقاومة تحديد التيار RCواستطاعتها:

Rc = (VccVLED) / IC (5 – 2.2) / 100 = 28Ω 

PRC = (VccVLED) × IC=(5 – 2.2) × 100 = 280mW

 

رابعاً: نحسب قيمة التيار الأصغري اللازم لقيادة الترانزستور :

IC = hfe × IB →  IB = IC/ hfe =100 / 100 =1.0mA

Pcmax = UCE × IC = 0.2 ×100 = 20mW

 

خامساً: الآن يمكن حساب قيمة مقاومة القاعدة واستطاعتها من العلاقة التالية:

RB = (VVBE) / IB= (5 0.7) / 1 = 4.3KΩ 

PRC = (VVBE) × IB =5 0.7 × 1 = 4.3mW

 

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

' ******************************************************************************
' * Title : Exp.04.bas *
' * Target MCU : ATMega32A *
' * Author : Walid Balid *
' * IDE : BASCOM AVR 2.0.7.3 *
' * Peripherals : LEDs *
' * Description : GPIOs as Outputs *
' ******************************************************************************
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'-----------------------[Definitions]
$regfile="m32def.dat"
$crystal= 8000000
'-----------------------
'-----------------------[GPIO Configurations]
ConfigPind.6 =Output
Leds_y
AliasPortd.6 :Reset Leds_y

ConfigPind.7 =Output
Leds_g
AliasPortd.7 :Set Leds_g
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'--->[Main Program]
Do
'>[Turn Leds on]
Set Leds_y :Set Leds_g :Waitms 500
'>[Turn Leds off]
Reset Leds_y :Reset Leds_g :Waitms 500
Loop
End
'---<[End Main]
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

التجربة الخامسة

التحكم بمصباح كهربائي 36V تياره 5A عن طريق متحكم ATmega32A على القطب PIND.7، وكتابة برنامج بحيث يخفق المصباح كل 1Secعلماً أن جهد تغذية وشيعة المُرَحّل هو 5V وتيار تشغيل وشيعة هو 100mA.

الشكل 2: توصيل المُرَحّل مع المتحكم عن طريق مفتاح تحكم ترانزستوري للتجربة 5

 

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

' ******************************************************************************
' * Title : Exp.05.bas *
' * Target MCU : ATMega32A *
' * Author : Walid Balid *
' * IDE : BASCOM AVR 2.0.7.3 *
' * Peripherals : LEDs *
' * Description : GPIOs as Outputs *
' ******************************************************************************
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'-----------------------[Definitions]
$regfile="m32def.dat"
$crystal= 8000000
'-----------------------
'-----------------------[GPIO Configurations]
ConfigPind.7 =Output: Relay AliasPortd.7
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'--->[Main Program]
Do
Toggle Relay :Waitms 1000
Loop
End
'---<[End Main]
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


التحكم بالمُرَحّل باستخدام مفتاح ترانزستوري ثنائي القطبية

يستخدم المُرَحّل (Relay) للتحكم بأحمال التيار المستمر والمتناوب التي لا تتطلب تحكماً سريعاً بالوصل والفصل – أي أن المُرَحّل يستخدم كقاطع ميكانيكي متحكم به كهربائياً. يتوفر المُرَحّل التجاري بجهود تحكم ذات مجال واسع نسبياً ومن هذه الجهود نذكر: 3V و 5V و 6V و 9V و 12V و 15V و 24V و 36V و 48V و 60V. كما أن التيار الذي يستجره وشيعة تشغيل المُرَحّل يتراوح من 30mA إلى 300mA وذلك حسب حجم واستطاعة المُرَحّل ويتناسب مع ذلك تناسباً طردياً.

الشكل 3: رسم تمثيلي للبنية الداخلية للمرحل

الشكل 4: رسم تفصيلي للبنية الداخلية للمرحل

 

يتألف المُرَحّل من وشيعة وهو مسؤول عن فصل ووصل المُرَحّل (التحكم)، ومن تماسات استطاعية لقيادة الحمل واستطاعتها تختلف من مرحل لأخرى، ولكن معظم المُرَحّلات المستخدمة في الدارات الإلكترونية تكون تماساتها قادرة على قيادة حمل بتيار من 3 إلى 10A عند جهد تشغيل الشبكة 220V.

يبين الشكل 3 والشكل 4 رسماً تفصيلياً للبنية الداخلية للمرحل حيث أنه عندما يتم تغذية وشيعة المُرَحّل فإن الزراع الذي يحمل التماس المتحرك سوف ينجذب ويلامس التماس الثابت مؤدياً إلى وصل الدارة، وعندما تفقد الوشيعة تهييجها تؤثر قوة النابض العكسية على الذراع وتعيده إلى وضعيته الأساسية.

 

يبين الشكل 5 دارة تحكم بمرحل تعمل وشيعته على جهد 12V وتتحكم بدورها بعمل مصباح تيار مستمر جهد تشغيله 24V، حيث أنه عند تطبيق “1” على قطب بوابة المتحكم فإن الترانزستور سوف يغلق مؤدياً إلى وصل النقطة الأرضية إلى الطرف الثاني من وشيعة المُرَحّل، فتتهيج الوشيعة مؤدياً بدوره إلى جذب تماس المُرَحّل K1 وإغلاق النقطتين P و S، وعندها يضيء المصباح الكهربائي.

 

ملاحظة: من أجل حماية الترانزستور من أن يتم تدميره (حرقه) بسبب تيار التفريغ العكسي لوشيعة المُرَحّل عند فصل الترانزستور، يتم إضافة صمام ثنائي على التوازي مع وشيعة المُرَحّل (D1) يسمى صمام ثنائي المسار الحر والذي بدوره يشكل حلقة مغلقة لتفريغ تيار الوشيعة عند قطع الترانزستور.

 

يبين الشكل 6 دارة عملية لقيادة مصباح كهربائي متناوب ذو جهد 220V وتيار 1A عن طريق مرحل متحكم بها من متحكم مصغر.

الشكل 5: التحكم بحمل باستخدام مرحل

الشكل 6: قيادة مصباح كهربائي متناوب عن طريق مرحل متحكم به من متحكم مصغر

 


وصل المفاتيح اللحظية مع المتحكم المصغر

يوجد طريقتين لوصل المفاتيح مع أقطاب المتحكم المصغر:

  1. المفتاح يطبق على قطب المتحكم القيمة المنطقية “0” عند ضغطه – الشكل 7.

  2. المفتاح يطبق على قطب المتحكم القيمة المنطقية “1” عند ضغطه – الشكل 8.

على الشكل 7 وعند ضغط المفتاح يتم توصيل النقطة الأرضية إلى قطب المتحكم، اما عند تحرير المفتاح فيتم تطبيق التغذية 5V+ على مدخل قطب المتحكم. وبالعكس تماماً تكون الحالة في طريقة التوصيل المبينة على الشكل 8. وفي كلا الحالتين يقوم المتحكم في برنامجه الرئيسي بفحص حالة التغير على القطب المتصل مع المفتاح.

الشكل 7: توصيل المفتاح ليكون فعال عند “0”

الشكل 8: توصيل المفتاح ليكون فعال عند “1”

 

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

الشكل 9: أثر العطالة الميكانيكية للمفتاح عند ضغطه وتحريره

 

بشكل عام يوجد طريقتين للتخلص من العطالة الميكانيكية للمفاتيح وهما:

  1. استخدام مكثف بقيمة تتراوح من 100nF إلى 1uF على التوازي مع المفتاح والذي سيقوم بدوره على تأخير التذبذب الناشئ كما هو مبين على الشكل 10 والشكل 11.

  2. معالجة هذه الحالة برمجياً في برنامج المتحكم بفحص حالة المفتاح، وعند تحقق الشرط يتم توليد تأخير زمني يتراوح من 25 إلى100 ميليثانية وبعدها يتم فحص الحالة من جديد، فإذا بقيت الحالة مستقرة على الشرط المطلوب فيتم التنفيذ.

الشكل 11: التخلص من الاهتزاز الميكانيكي للمفتاح (“1”)

الشكل 10: التخلص من الاهتزاز الميكانيكي للمفتاح (“0”)

 


مقاومات الرفع والسحب

(Pull-up & Pull-down Resistors)

بالعودة إلى الشكل 7 أو الشكل 10 والذي تم فيهما توصيل المفتاح ليكون فعالاً عند “0” – أي بالضغط على المفتاح سيتم تطبيق صفر منطقي على قطب الدخل – فإن المقاومة R1 تمثل مقاومة رفع وظيفتها تأمين القيمة المنطقية “1” (5V+) على مدخل القطب عندما يكون المفتاح غير مضغوط، وبدونها ستكون الحالة على قطب الدخل غير معرّفة.

بالعودة إلى الشكل 8 أو الشكل 11 والذي تم فيهما توصيل المفتاح ليكون فعالاً عند “1” – أي بالضغط على المفتاح سيتم تطبيق واحد منطقي على قطب الدخل – فإن المقاومة R3 تمثل مقاومة سحب وظيفتها تأمين القيمة المنطقية “0” (GND) على مدخل القطب عندما يكون المفتاح غير مضغوط، وبدونها ستكون الحالة على قطب الدخل غير معرّفة.

قيمة مقاومات الرفع أو السبح تتراوح عادة بين القيمة 10KΩ و 50KΩ.

هل يمكن الاستغناء عن مقاومة الرفع الخارجية في الشكل 7 والشكل 10 عند وصل المفتاح إلى قطب متحكم AVR؟

الشكل 12: مخطط البنية الداخلية لقطب دخل/خرج لمتحكم AVR

تمتلك أقطاب متحكمات AVR عند استخدامها كأقطاب دخل مقاومات رفع داخلية قيمتها RPU = 50KΩ كما هو مبين على الشكل 12 وهو مخطط البنية الداخلية لقطب دخل/خرج لمتحكم AVR. يمكن تفعيل أو إلغاء تفعيل هذه المقاومة لكل قطب دخل على حدى وبشكل افتراضي تكون هذه المقاومات غير مفعلة.

 

ملاحظة: لا تملك متحكمات AVR مقاومات سحب داخلية وبالتالي يجب وضع مقاومات سحب خارجية من أجل التوصيلات في الشكل 8 والشكل 11.

 


تعليمات تعريف الأقطاب كمداخل في Bascom-AVR

وظيفة التعليمة

شكل التعليمة

تعريف البوابة C كبوابة دخل

ConfigPORTC=Input

تعريف القطب رقم 5 من البوابة C كقطب دخل

ConfigPINC.5 =Input

تفعيل مقاومات الرفع الداخلية للبوابة C كاملةً

PORTC=255

إلغاء تفعيل مقاومات الرفع الداخلية للبوابة C كاملةً

PORTC=0

تفعيل مقاومة الرفع الداخلية للقطب رقم 5 فقط من البوابة C

PINC.5 = 1

إلغاء تفعيل مقاومة الرفع الداخلية للقطب رقم 5 فقط من البوابة C

PINC.5 = 0

تفعيل بعض مقاومات الرفع الداخلية للبوابة C (PIN.4,5,6,7)i

PORTC= &B11110000

يمكن استخدام هذا الشكل لتعريف الأقطاب من البوابة كدخل/خرج حيث أن (0) تعني قطب دخل، و (1) تعني قطب خرج.

ConfigPORTC=&B11110000

يصرح إلى أن PINC سوف يشار إليها أثناء البرنامج بالاسم (SWs)

SWs Alias PINC

يصرح إلى أن القطب PINC.5 سوف يشار إليه بالاسم (SW)

SW Alias PINC.0

 

التجربة السادسة

المطلوب التحكم بتشغيل وفصل المُرَحّل في التجربة الخامسة باستخدام مفتاح لحظي موصول إلى القطب PINB.0، بحيث أنه عند ضغط المفتاح تعمل المُرَحّل وعند تحرير المفتاح تفصل المُرَحّل - باستخدام مقاومة رفع خارجية.

الشكل 13: التحكم بالمُرَحّل عن طريق مفتاح لحظي

 

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

' ******************************************************************************
' * Title : Exp.06.bas *
' * Target MCU : ATMega128A *
' * Author : Walid Balid *
' * IDE : BASCOM AVR 2.0.7.3 *
' * Peripherals : Relay - Switch *
' * Description : GPIOs as Output/Input *
' ******************************************************************************
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'-----------------------[Definitions]
$regfile="m32def.dat"
$crystal= 8000000
'-----------------------
'-----------------------[GPIO Configurations]
ConfigPind.7 =Output: Relay AliasPortd.7
ConfigPinb.0 =Input: Switch AliasPinb.0
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'--->[Main Program]
Do
If Switch = 0 ThenSet Relay ElseReset Relay
Loop
End
'---<[End Main]
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

ملاحظة: من أجل الاستغناء عن مقاومة الرفع الخارجية وتفعيل مقاومة الرفع الداخلية فإن كل ما نحتاجه هو إضافة تعليمة تفعيل مقاومة الرفع الداخلية للقطب PINB.0 بعد تعليمة تفعيل القطب وهي:

PORTB.0 = 1

 

التجربة السابعة

المطلوب التحكم بتشغيل وفصل ثمانية ثنائيات ضوئية موصولة إلى البوابة PORTC باستخدام مفتاح DIP-Switch موصول إلى البوابة PINB، بحيث أنه عند تفعيل المفتاح (on) يعمل الثنائي الموافق لرقم المفتاح وعند إلغاء تفعيل المفتاح (off) سوف يتوقف عمل الثنائي مع مراعات استخدام مقاومات الرفع الداخلية لبوابة الدخل PORTC.

الشكل 14: توصيل المفاتيح الانزلاقية DIP-Switch

 

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

' ******************************************************************************
' * Title : Exp.07.bas *
' * Target MCU : ATMega128A *
' * Author : Walid Balid *
' * IDE : BASCOM AVR 2.0.7.3 *
' * Peripherals : DIP-Switch *
' * Description : GPIOs as Output/Input *
' ******************************************************************************
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'-----------------------[Definitions]
$regfile="m32def.dat"
$crystal= 8000000
'-----------------------
'-----------------------[GPIO Configurations]
ConfigPortc=Output: Leds AliasPortc
ConfigPortb=Input: Switchs AliasPinb:Portb=&B11111111
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'--->[Main Program]
Do
Leds
= Switchs
Loop
End
'---<[End Main]
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 


تعليمات قراءة حالة مفتاح موصول إلى قطب دخل في Bascom

إن التجربة السادسة تضمنت قراءة حالة مفتاح لحظي من خلال قراءة القيمة الموجودة على القطب المتصل معه المفتاح، ومبدأ التخلص من العطالة الميكانيكية استخدم مكثف خارجي مع القطب. وتضمنت الفقرة 3-4 طريقتان للتخلص من العطالة الميكانيكية للمفاتيح، حيث أن الطريقة الثانية تستخدم تأخير زمني برمجي. التعليمات التالية يمكن استخدامها كتعليمات برمجية جاهزة في البيئة Bascom تسهل إلى حد كبير التعامل مع المفاتيح اللحظية وإضافة تأخير زمني.

 

وظيفة التعليمة

شكل التعليمة

يراقب حالة القطب المحدد فيPx.y كلما مر عليه، وعندما تصبح حالته موافقة للحالة المحددة في state، سوف يقفز إلى البرنامج الفرعي عند اللافتة label وينفذ البرنامج ويعود.

Debounce Px.y, state , label ,Sub

 

Ex. Debounce Key1 , 0 , Sw1 ,Sub

تهيئة زمن تأخير (ميلي ثانية) عن استعمال تعليمة Debounce للتخلص من العطالة الميكانيكية للمفتاح.

ConfigDebounce= time

سوف يقف البرنامج عند هذه التعليمة وينتظر أن تصبح حالة القطب صفر (reset) أو واحد (set) منطقي ليكمل البرنامج.

Bitwait x , Set/reset

 

Ex. Bitwait Pinb.7 ,reset

 

التجربة الثامنة

يوجد على اللوحة التعليمية Mini-Phoenix ثلاث مفاتيح لحظية موصولة إلى الأقطاب Pind2, Pind3, Pinb.2، كما يوجد ثمانية صمامات ضوئية (Leds) موصولة إلى البوابة PortC،

 

والمطلوب: باستخدام التعليمة الشرطية If تغيير حالة عمل (Toggle) الثنائي D1 عن الضغط على المفتاح S1، وتغيير حالة D2 عند الضغط على S2، وتغيير حالة D3 عند الضغط على S3.

الشكل 15: توصيل المفاتيح اللحظية الثنائيات مع المتحكم ATmega32A على اللوحة Mini-Phoenix

 

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

' ******************************************************************************
' * Title : Exp.08.bas *
' * Target Board : Mini-Phoenix - REV 1.00 *
' * Target MCU : ATMega32A *
' * Author : Walid Balid *
' * IDE : BASCOM AVR 2.0.7.3 *
' * Peripherals : Pull-Up Resistors *
' * Description : GPIOs as Input; Active Low (GND) *
' ******************************************************************************
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'-----------------------[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

ConfigPind.2 =Input: Sw_1 AliasPind.2 :Portd.2 = 1 'PU Internal Resistor
ConfigPind.3 =Input: Sw_2 AliasPind.3 :Portd.3 = 1
ConfigPinb.2 =Input: Sw_3 AliasPinb.2 :Portb.2 = 1
'-----------------------
'-----------------------[Variables]
Dim Count1 AsByte, Count2 AsByte, Count3 AsByte
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'--->[Main Program]
Print"Hello!"
Do
If Sw_1 = 0 ThenGosub Sw_r1
If Sw_2 = 0 ThenGosub Sw_r2
If Sw_3 = 0 ThenGosub Sw_r3
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
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

التجربة التاسعة

المطلوب تعديل البرنامج في التجربة الثامنة باستبدال التعليمة الشرطية If بالتعليمة Debounce.

 

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

' ******************************************************************************
' * Title : Exp.09.bas *
' * Target Board : Mini-Phoenix - REV 1.00 *
' * Target MCU : ATMega32A *
' * Author : Walid Balid *
' * IDE : BASCOM AVR 2.0.7.3 *
' * Peripherals : Pull-Up Resistors *
' * Description : GPIOs as Input; Active Low (GND) *
' ******************************************************************************
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'-----------------------[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

ConfigPind.2 =Input: Sw_1 AliasPind.2 :Portd.2 = 1 'PU Internal Resistor
ConfigPind.3 =Input: Sw_2 AliasPind.3 :Portd.3 = 1
ConfigPinb.2 =Input: Sw_3 AliasPinb.2 :Portb.2 = 1

ConfigDebounce= 50
'-----------------------
'-----------------------[Variables]
Dim Count1 AsByte, Count2 AsByte, Count3 AsByte
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'--->[Main Program]
Print"Hello!"
Do
Debounce Sw_1 , 0 , Sw_r1 ,Sub
Debounce Sw_2 , 0 , Sw_r2 ,Sub
Debounce Sw_3 , 0 , Sw_r3 ,Sub
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
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

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

المطلوب تعديل البرنامج في التجربة الثامنة باستبدال التعليمة الشرطية If بالتعليمة Bitwait.

 

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

' ******************************************************************************
' * Title : Exp.10.bas *
' * Target Board : Mini-Phoenix - REV 1.00 *
' * Target MCU : ATMega32A *
' * Author : Walid Balid *
' * IDE : BASCOM AVR 2.0.7.3 *
' * Description : GPIOs as Input; Active Low (GND) *
' ******************************************************************************
'-----------------------[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

ConfigPind.2 =Input: Sw_1 AliasPind.2 :Portd.2 = 1 'PU Internal Resistor
ConfigPind.3 =Input: Sw_2 AliasPind.3 :Portd.3 = 1
ConfigPinb.2 =Input: Sw_3 AliasPinb.2 :Portb.2 = 1
'-----------------------
'-----------------------[Variables]
Dim Count1 AsByte, Count2 AsByte, Count3 AsByte
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'--->[Main Program]
Do
Print"PC is waiting for Sw1"
Bitwait Sw_1 ,Reset:Gosub Sw_r1

Print"PC is waiting for Sw2"
Bitwait Sw_2 ,Reset:Gosub Sw_r2

Print"PC is waiting for Sw3"
Bitwait Sw_3 ,Reset:Gosub Sw_r3
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
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 


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

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

Copyright © 2012 Walid Balid All rights reserved


تأليف

 

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

البريد الإلكتروني: عنوان البريد الإلكتروني هذا محمي من روبوتات السبام. يجب عليك تفعيل الجافاسكربت لرؤيته.


 

أضف تعليق


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


Go to top