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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 18-09-2013, 11:29 PM المشاركة 1   
افتراضي مشاريع السفن سيجمنت وإستعراض تقنيات المسح بالانتخاب من متعدد والمقاطعة بالمؤقت TMR0 و Twitter FaceBook Google+



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

هنا ، الدور الأساسى لن يكون للإلكترونيات ، لكن سوف يكون لرؤية العين للصورة الناتجة بطريقة الانتخاب من متعدد . عين الإنسان لا تستطيع كشف (رؤية) الكائنات التى تعرض عليها لفترة زمنية أقصر من 16 إلى 20 ملى ثانية . لكى ترى العين صورة الأشياء يجب أن تظل معروضة لفترة زمنية أكبر من 20 ملى ثانية . فى طريقة الانتخاب من متعدد ، يتم انتخاب وعرض أحد المدخلات فى كل مرة ولفترة زمنية قصيرة جدا(5 ملى ثانية على سبيل المثال) ، فى النهاية سوف ترى العين جميع المدخلات المعروضة كما لو كانت معروضة فى نفس الوقت ( تسمى ظاهرة الخداع البصرى) . هذه الخاصية هى أحد أهم الطرق المستخدمة بشكل واسع فيما يعرف بأنظمة مسح scanning وحدات العرض المتعددة للسفن سيجمنت .

تتكون حدات السفن سيجمنت من 7 شرائح ، كل شريحة عبارة عن دايود مشع للضوء ( ليد) وقد يوجد ليد كنقطة عشرية ، ويوجد نوعان أساسيان : نوع المهبط المشترك (المستخدم هنا) ، ونوع المصعد المشترك . فى نوع المهبط المشترك لأضاءة أى شريحة ومن شرائح وحدة العرض ، يتم توصيل طرف المهبط المشترك للشرائح بالحالة المنطقية المنخفضة (الأرضى) وتوصيل طرف الشريحة (أنود الليد) بالحالة المنطقية المرتفعة (الجهد الموجب) من خلال مقاومة تحديد للتيار . فى السفن سيجمنت الكبيرة الحجم يتواجد أكثر من ليد بكل شريحة والتى قد تكون متصلة على التوالى أو على التوازى ، لذلك يجب الرجوع إلى الداتا شيت الخاصة بها .
تم الاتفاق على تسمية الشرائح بالحروف (A-B-C-D-E-F-G) كما فى الشكل التالى :



على سبيل المثال ، لعرض الحرف "A" يجب إضاءة الشرائح الستة (A+B+C+E+F+G) ، ولعرض الرقم "2" يجب إضاءة الشرائح الستة (F+A+B+G+E"D) ، وهلم جرا .
يتم السماح بعرض الرقم على وحدة سفن سيجمنت عن طريق تفعيل طرف المهبط المشترك أثناء توصيل بيانات هذا الرقم إلى أطراف الشرائح .
عند الرغبة فى عرض عدد مكون من آلاف يستخدم أربع وحدات عرض سفن سيجمنت كل وحدة تمثل "رقم" أو "خانة" أو Digit ، ويتم تفعيل وحدة تلو الأخرى بنظام "المسح بالانتخاب من متعدد" . أفضل طريقة لتنفيذ ذلك هى استخدام المقاطعة نتيجة لتجاوز سجل المؤقت TMR0 ، حيث يتم اختيار قاسم التردد السابق prescaler بالقيم "32" مع تحميل السجل TMR0 بقيمة ابتدائية "99" ليتم إنتاج مقاطعة كل 5 ملى ثانية تستخدم فى تفعيل خانات وحدات العرض بشكل دورى عن طريق ترانزستورات نوع NPN كما فى التدريب التالى .
تدريب رقم 1 :

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 18-09-2013, 11:33 PM المشاركة 2   
افتراضي


تدريب رقم 1 :
إنشاء عداد لعد الأشياء يبدأ من الصفر "0" وتزايد عند كل ضغطة على مفتاح ضاغط (أو دخل لحساس) حتى 9999 "9999" والعرض على 4 وحدات سفن سيجمنت .

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



· عند الضغط على المفتاح الضاغط COUNT المتصل بالطرف RB7 (مقاومة الرفع داخلية) يتزايد قيمة العداد بواحد .
· عند الضغط على المفتاح الضاغط RESET المتصل بالطرف RA4 (مقاومة الرفع خارجية) يتم تصفير Clear العداد .
· يمكن إضافة مفتاح ضاغط آخر ( على الطرف RA6 على سبيل المثال ) ليقوم بتناقص قيمة العداد ، ويصبح لديك عداد تصاعدى تنازلى .
البرنامج الكامل :

كود:
;0-9999-Objects-counter Device = 16F628A Xtal 4 All_Digital true PORTA=0:TRISA=%00010000 PORTB=0:TRISB=%10000000 OPTION_REG=%00000100 'PORTB PULLUP active ,TMR0 : internal clock , prescaler 1/32. INTCON=%00100000 'TMR0 interrupt enablee Dim Counting As Word 'Variable, which will hold the values to be counted Dim Digit_NO As Byte 'Display unit number Dim Ones As Byte 'Ones digit of the number Dim Tens As Byte 'Tens digit of the number Dim Hundreds As Byte 'Hundreds digit of the number Dim Thousands As Byte 'Thousands digit of the number Dim I As Byte 'Loop variable, Dim Convert As Byte 'Convert variable Dim X As Byte 'Intervening variable Symbol Disp0=PORTA.0 ' ones digit of the common anode Symbol Disp1=PORTA.1 ' Tens digit of the common anode Symbol Disp2=PORTA.2 ' hundreds digit Symbol Disp3=PORTA.3 ' Thousands digit Symbol P_Button =PORTB.7 'Count up push button Symbol Resetting =PORTA.4 'Clear counter PAUSE 100 INTCON.7=1 'Enable all(Global) interrupt (GIE) TMR0=99 'Sart value On Interrupt GoTo ISR ' On interrupt go to lable "ISR" Start: If P_Button=0 Then ' pressed GoSub DELAY ' Execute and return Counting=Counting+1 If Counting>9999 Then Counting=0 While P_Button=0:Wend ; Wait , until PB released EndIf If Resetting=0 Then Counting=0 X=Counting Dig 0 :GoSub Decoding:Ones=Convert ' Execute to get number and return X=Counting Dig 1 :GoSub Decoding:Tens=Convert X=Counting Dig 2 :GoSub Decoding:Hundreds=Convert X=Counting Dig 3 :GoSub Decoding:Thousands=Convert GoTo Start Decoding: Convert = LookUp X,[63,6,91,79,102,109,125,7,127,111] :Return DELAY: For I=0 To 2000 ; For safe operation debounce 10 ms = 5us * 2000 =10000us PAUSEUS 5 Next Return Disable ISR: ;When TMR0 overflow each 5 ms : Digit_NO=Digit_NO+1:If Digit_NO>3 Then Digit_NO=0 'Digit number from digit0 to digit 3 (4 units) If Digit_NO=0 Then 'Ones digit is the first digit, so Disp3=0 ' shutting down the display of the previous unit PORTB=Ones 'Send segment Information to portB given Disp0=1 'Display opens. EndIf If Digit_NO=1 Then Disp0=0 PORTB=Tens Disp1=1 EndIf If Digit_NO=2 Then Disp1=0 PORTB=Hundreds Disp2=1 EndIf If Digit_NO=3 Then Disp2=0 PORTB=Thousands Disp3=1 EndIf TMR0=99 'Loaded into register TMR0 value that would cause the amount of time of 5 ms. ;(256-99) = 157us * 32 (prescaler) = 5024 us = 5 ms INTCON.2=0 'TMR0 Interrupt flag (T0LF bit) is reset (cleared) Resume Enable End

شرح البرنامج :

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

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


شرح البرنامج :
1- جزء المقدمة وفيها يتم :
· اختيار الميكروكونترولر المستخدم Device = 16F628A ، وتردد الكريستال المستخدم Xtal 4 ، مع إعداد جميع أطراف الدخل / الخرج كمداخل / مخارج رقمية All_Digital true .
· إعداد منافذ الدخل والخرج PORTA=0:TRISA=%00010000 و PORTB=0:TRISB=%10000000 .
· الإعداد الابتدائى لسجل الخيارات OPTION_REG=%00000100 وسجل التحكم فى المقاطعة INTCON=%00100000 .
· إعلان المتغيرات المطلوبة للبرنامج :
كود:
Dim Counting As Word 'Variable, which will hold the values to be counted Dim Digit_NO As Byt 'Display unit number Dim Ones As Byte 'Ones digit of the number Dim Tens As Byte 'Tens digit of the number Dim Hundreds As Byte 'Hundreds digit of the number Dim Thousands As Byte 'Thousands digit of the number Dim I As Byte 'Loop variable, Dim Convert As Byte 'Convert variable Dim X As Byte 'Intervening variable
· إعلان أسماء مستعارة لتسهيل فهم وتتبع البرنامج :

كود:
Symbol Disp0=PORTA.0 ' ones digit of the common anode Symbol Disp1=PORTA.1 ' Tens digit of the common anode Symbol Disp2=PORTA.2 ' hundreds digit Symbol Disp3=PORTA.3 ' Thousands digit Symbol P_Button =PORTB.7 'Count up push button Symbol Resetting =PORTA.4 'Clear counter
· الانتظار 100 ملى ثانية لاستقرار النظام PAUSE 100 .
· الإعداد النهائى لسجل التحكم فى المقاطعة ، وتحميل سجل المؤقت TMR0 بقيمة ابتدائية :

كود:
INTCON.7=1 'Enable all(Global) interrupt (GIE) TMR0=99 'Start value
· إعلان وجود مقاطعة تبعا للأمر On Interrupt GoTo ISR .

2- حلقة البرنامج الرئيسى وتبدأ بالعنوان "Start:" وتحتوى على :
أ‌- اختبار الضغط على المفتاح الضاغط If P_Button=0 Then ، إذا كان مضغوط يتم القفز إلى الروتين الفرعى لعلاج الارتداد فى المفتاح GoSub DELAY والعودة ، حيث يتم تنفيذ التأخير الزمنى بشكل يسمح بفاعلية المقاطعة فى أقصر زمن ممكن فبدلا من استخدام الأمر Pause 20 للحصول على تأخير 20 ملى ثانية يتم الحصول على نفس النتيجة ولكن بشكل متقطع على هيئة حلقة تتكرر 2000 مرة فى كل مرة يتم تنفيذ تأخير قصير جدا (5 ميكروثانية) وهذا يسمح بالإحساس بحدوث المقاطعات فى أقصر وقت :


كود:
DELAY: For I=0 To 20000 PAUSEUS 5 Next Return
ب‌- بعد تنفيذ التأخير الزمنى والعودة يتم تزايد متغير العداد بواحد Counting=Counting+1 ثم اختبار محتويات متغير العداد فإن كانت أكبر من الحد الأقصى "9999" يتم تصفير متغير العداد :
If Counting>9999 Then Counting=0 ، مع التحقق من أن المفتاح الضاغط مازال مضغوطا لمنع أى تزايد غير صحيح While P_Button=0:Wend :


كود:
If P_Button=0 Then ' pressed GoSub DELAY ' Execute and return Counting=Counting+1 If Counting>9999 Then Counting=0 While P_Button=0:Wend EndIf
ت‌- ثم يتم اختبار الضغط على مفتاح تصفير العداد وتنفيذ التصفير عند الضغط عليه :

If Resetting=0 Then Counting=0
ث‌- عرض محتويات متغير العداد Counting:
متغير العداد Counting بحجم 2 بايت word ليسع العدد من "0000" إلى "9999" . هذا العدد له أربع ارقام أو خانات :
· خانة الآحاد Ones وتوجد قيمتها فى الخانة الأولى Dig 0 لمتغير العداد Counting ويتم الحصول عليها بالأمر X=Counting Dig 0 .
· خانة العشرات Tens وتوجد قيمتها فى الخانة الثانية Dig 1 لمتغير العداد Counting ويتم الحصول عليها بالأمر X=Counting Dig 1 .
· خانة المئات وتوجد قيمتها فى الخانة الثالثة Dig 2 لمتغير العداد Counting ويتم الحصول عليها بالأمر X=Counting Dig 2 .
· خانة الآلاف وتوجد قيمتها فى الخانة الرابعة Dig 3 لمتغير العداد Counting ويتم الحصول عليها بالأمر X=Counting Dig 3 .
يتم استخلاص الخانة ثم الذهاب إلى الروتين الفرعى GoSub Decoding لتحويلها إلى كود السفن سيجمنت المقابل والعودة والتكرار لباقى الخانات كما يلى :

كود:
X=Counting Dig 0 :GoSub Decoding:Ones=Convert ' Execute to get number and return X=Counting Dig 1 :GoSub Decoding:Tens=Convert X=Counting Dig 2 :GoSub Decoding:Hundreds=Convert X=Counting Dig 3 :GoSub Decoding:Thousands=Convert GoTo Start
Decoding: Convert = LookUp X,[63,6,91,79,102,109,125,7,127,111,99,57] :Return


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 18-09-2013, 11:41 PM المشاركة 4   
افتراضي


3- فى الخلفية ( فى الخفاء) يتزايد سجل المؤقت TMR0 وتحدث مقاطعة كل 5 ملى ثانية ، عندئذ يتم تنفيذ روتين خدمة المقاطعة وفيه :
· تغطية الأربع خانات من الخانة "0" إلى الخانة "3" عن طريق تزايد رقم الخانة بواحد وعند الوصول للقيمة القصوى "3" يتم الرجوع مرة أخرى إلى القيمة الدنيا "0" :

كود:
Digit_NO=Digit_NO+1:If Digit_NO>3 Then Digit_NO=0 'Digit number from digit0 to digit3 (4 units)

· بالنسبة للخانة الأولى (وحدة خانة الآحاد) : يتم فصل الوحدة السابقة لها وهى الخانة الثالثة (وحدة خانة الألاف Disp3=0 قبل أن يتم إرسال بيانات شرائح تلك الوحدة إلى المنفذ PORTB=Ones ، وفى النهاية يتم تفعيل هذه الخانة Disp0=1


كود:
If Digit_NO=0 Then 'Ones digit is the first digit, so Disp3=0 ' shutting down the display of the previous unit PORTB=Ones 'Send segment Information to portB given Disp0=1 'Display opens. EndIf

· تكرار الخطوة السابقة لجميع الوحدات :

كود:
If Digit_NO=1 Then Disp0=0 PORTB=Tens Disp1=1 EndIf
If Digit_NO=2 Then Disp1=0 PORTB=Hundreds Disp2=1 EndIf
If Digit_NO=3 Then Disp2=0 PORTB=Thousands Disp3=1 EndIf

· فى نهاية روتين خدمة المقاطعة يجب : إعادة تحميل السجل TMR0 بالقيمة الابتدائية "99" ، ومسح بت علم المقاطعة بالمؤقت INTCON.2=0 (T0IF) للتجهيز للمقاطعة التالية .
كود:
TMR0=99 'Loaded into register TMR0 value that would cause the amount of time of 5 ms. ;(256-99) = 157us * 32 (prescaler) = 5024 us = 5 ms INTCON.2=0 'TMR0 Interrupt flag (T0LF bit) is reset (cleared)

التدريب الثانى :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 18-09-2013, 11:43 PM المشاركة 5   
افتراضي


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


البرنامج :
كود:
;0-9999-Objects-up-COUNT_DOWN-counter Device = 16F628A Xtal 4 All_Digital true PORTA=0:TRISA=%01010000 PORTB=0:TRISB=%10000000 OPTION_REG=%00000100 'PORTB PULLUP active ,TMR0 : internal clock , prescaler 1/32. INTCON=%00100000 'TMR0 interrupt enablee Counting var Word 'Variable, which will hold the values to be counted Digit_NO var Byte 'Display display order Ones var Byte 'Ones digit of the number Tens VAR Byte 'Tens digit of the number Hundreds VAR Byte 'Hundreds digit of the number Thousands VAR Byte 'Thousands digit of the number I VAR Byte 'Loop variable, Convert VAR Byte 'Convert variable X VAR Byte 'Intervening variable Symbol Disp0=PORTA.0 ' ones digit of the common anode Symbol Disp1=PORTA.1 ' Tens digit of the common anode Symbol Disp2=PORTA.2 ' hundreds digit Symbol Disp3=PORTA.3 ' Thousands digit Symbol COUNT_UP =PORTB.7 'push button Symbol Resetting =PORTA.4 Symbol COUNT_DOWN =PORTA.6 PAUSE 100 INTCON.7=1 'Enable all(Global) interrupt (GIE) TMR0=99 'Sart value On Interrupt GoTo ISR ' On interrupt go to lable "ISR" Start: If COUNT_UP=0 Then ' pressed GoSub DELAY ' Execute and return Counting=Counting+1 If Counting>9999 Then Counting=0 While COUNT_UP=0:Wend ; Wait , until PB released EndIf If COUNT_DOWN =0 Then ' pressed GoSub DELAY ' Execute and return Counting=Counting-1 If Counting<0 Then Counting=0 While COUNT_DOWN =0:Wend ; Wait , until PB released EndIf If Resetting=0 Then Counting=0 If Resetting=0 Then Counting=0 X=Counting Dig 0 :GoSub AL:Ones=Convert ' Execute to get number and return X=Counting Dig 1 :GoSub AL:Tens=Convert X=Counting Dig 2 :GoSub AL:Hundreds=Convert X=Counting Dig 3 :GoSub AL:Thousands=Convert GoTo Start AL: Convert = LookUp X,[63,6,91,79,102,109,125,7,127,111,99,57] :Return DELAY: For I=0 To 1000 ; For safe operation debounce 5 ms = 5 * 1000 us PAUSEUS 5 Next Return Disable ISR: ;When TMR0 overflow each 5 ms : Digit_NO=Digit_NO+1:If Digit_NO>3 Then Digit_NO=0 'given the screen determines which households If Digit_NO=0 Then 'Ones digit of the first digit, so the Disp3=0 'Before shutting COUNT_DOWN the display of the previous navigation PORTB=Ones 'Information on households port (segments) are given Disp0=1 'Display opens. EndIf If Digit_NO=1 Then Disp0=0 PORTB=Tens Disp1=1 EndIf If Digit_NO=2 Then Disp1=0 PORTB=Hundreds Disp2=1 EndIf If Digit_NO=3 Then Disp2=0 PORTB=Thousands Disp3=1 EndIf TMR0=99 'Loaded into register TMR0 value that would cause the amount of time of 5 ms. ;(256-99) = 157us * 32 (prescaler) = 5024 us = 5 ms INTCON.2=0 'TMR0 Interrupt flag (T0LF bit) is reset (cleared) Resume Enable End


الصورة الرمزية Omar Mekkawy
Omar Mekkawy
:: مهندس متميز ::
تاريخ التسجيل: Aug 2011
الدولة: مصر
المشاركات: 1,523
نشاط [ Omar Mekkawy ]
قوة السمعة:0
قديم 20-09-2013, 07:13 PM المشاركة 6   
افتراضي


جزاك الله كل خير أستاذي شرح رائع
أستاذي لدي سؤال بعد إذنك

لدي push button رابطه بميكروكونترولر + في شاشة بتعرض عدد الضغطات

لكن لما بأدوس على الزر على طول بيقعد يعد على الفاضي !

لكن انا عاوزه يعد كل ضغطة واحدة ( فهل من حل ؟ )


يعطيك العافية


نايف نظمي
:: مهندس جيد ::
تاريخ التسجيل: Jul 2009
الدولة: الاردن
المشاركات: 274
نشاط [ نايف نظمي ]
قوة السمعة:0
قديم 20-09-2013, 10:40 PM المشاركة 7   
افتراضي


مشكور مشكور الله لا يحرمنا من مواضيعك الرائع

بدون مبالغة شرح واضح وكامل والكمال لله

ونرجو المزيد



عبدالله نعمان
:: مهندس متواجد ::
تاريخ التسجيل: May 2006
المشاركات: 176
نشاط [ عبدالله نعمان ]
قوة السمعة:0
قديم 09-02-2014, 05:35 PM المشاركة 8   
افتراضي


ممتااااااااااااااااااااااااااااااااااز

إضافة رد

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

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

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


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

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