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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 07-06-2017, 10:02 PM المشاركة 1   
افتراضي برمجة المداخل الرقمية )المفتاح على سبيل المثال( : Twitter FaceBook Google+



برمجة المداخل الرقمية )المفتاح على سبيل المثال( :
الدائرة الكهربية :




• يتم توصيل المفتاح الضاغط إلى طرف البت الأولى بالمنفذ PORTD أى RD0 ، والذى يجب تهيئته كطرف دخل ، يتم توصيل المفتاح بحيث يكون فعال فى الحالة المنخفضة ، ولذلك يتم توصيل مقاومة سحب لأعلى (رفع) بين طرف الدخل RD0 والجهد الموجب (5V)VDD ، ويتم توصيل المفتاح بين هذا الطرف والأرضى . نتيجة لذلك تكون حالة طرف الدخل RD0 عند الحالة المنطقية المرتفعة High(5V)(1) "عندما يكون المفتاح غير مضغوط" (غير فعال) .
• عند الضغط على المفتاح (فعال) فإن طرف الدخل RD0 سوف يتصل بالأرضى وتتحول حالته إلى الحالة المنطقية المنخفضة Low(0V)(0) .
• الليد المتصل بطرف الخرج PORTB(RB0) ، خلال مقاومة تحديد التيار ، سوف يومض عند الضغط على المفتاح .
• يقوم الميكروكونترولر "تلقائيا" بالكشف (قراءة) على طرف الدخل وتسجيل حالته فى البت المناظرة وكل ما عليك هو اختبار حالة هذه البت بعبارات الشرط المعروفة ، كما فى البرنامج التالى .


تطبيق :
برنامج لتشغيل وتبطيل ليد (أو أى حمل) بمفتاح واحد .
• فى البداية يكون المفتاح فى الوضع المفتوح (غيرفعال) ، ويكون طرف الدخل RD0 فى الحالة المرتفعة ، وشرط العبارة if(PORTD.F0 == 1) يكون صواب true ، ومن ثم يتم تنفيذ العبارتين Delay_ms(10) (زمن تأخير لتلاشى الارتدادات ) ، و oldstate = 1 ( للإشارة إلى أن الدخل عند الحالة الابتدائية المرتفعة) .
• بعد ذلك يكون الميكروكونترولر فى انتظار الضغط على المفتاح ليكمل تنفيذ البرنامج .
• عندما يتم الضغط على المفتاح تتحول حالة طرف الدخل RD0 من الحالة المرتفعة (1) إلى الحالة المنخفضة (0) (الحالة الفعالة) ، ومن ثم يتحقق شرط العبارة if (oldstate && PORTD.F0 == 0) ، وهو شرط مركب من شرطين oldstate "و" && PORTD.F0 == 0 ، ويتم تنفيذ الثلاثة عبارات التابعة لها : Delay_ms(10) (زمن تأخير تلاشى الارتدادات ) ، وعبارة الفعل المطلوب وهى
PORTB.F0 = ~PORTB.F0 (عكس حالة الطرف RB0 ، فإن كان off(0) يصبح on(1) والعكس بالعكس ، و العبارة oldstate = 0 للعودة إلى الحالة الابتدائية انتظارا للضغطة التالية .
• نتيجة لذلك عند الضغطة الأولى يتم إضاءة الليد ، وعند الضغطة التالية يتم إطفاء الليد ، وتتكرر العملية . بعبارة أخرى ، فى كل مرة يتم فيها الضغط على المفتاح يتحول الليد بين التشغيل on والفصل off . بمجرد أن يتم الضغط على المفتاح فإن الميكروكونترولر سوف ينتظر تحرير الضغط للرجوع إلى الحالة الابتدائية وذلك قبل الكشف عن ضغطة أخرى .

كود:
bit oldstate;
void main()
{
oldstate=0;
TRISD.F0 = 1; 	//pin RD0 as input – it doesn’t matter if you are using F0 or B0
TRISB = 0x00; 	// PORTB as output
PORTB = 0x00; 	// PORTB pins are all “off”

while(1) 					// Endless loop
{
if(PORTD.F0 == 1) 			// Detect logical one , oldstate

{
Delay_ms(10); 			// “debouncing” mechanical contacts
oldstate = 1; 				// Update flag
}

if (oldstate && PORTD.F0 == 0)		 // Detect one-to-zero transition , pressed

{
Delay_ms(10); 			// “debouncing” mechanical contacts
PORTB.F0 = ~PORTB.F0; 		//Action >>> Invert PORTB.F0
oldstate = 0; 				// Update flag , Initial condition 
}
} 
}
النتائج :















اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 07-06-2017, 10:19 PM المشاركة 2   
افتراضي


تدريب :

كود:
void main()
{
  TRISD.F0 = 1; 				//Configure 1st bit of PORTD as input
  TRISB.F0 = 0; 				//Configure 1st bit of PORTB as output
  PORTB.F0 = 0; 				//LED OFF
  while(1)
  {
    	if(PORTD.F0 == 0)   		//If the switch is pressed
    	{
       		Delay_ms(10);    		//Switch Debounce
       		if(PORTD.F0 == 0)		//If the switch is still pressed
       		{
         			PORTB.F0 = 1; 	//LED ON
         			Delay_ms(500); 	//0.5 Second Delay
         			PORTB.F0 = 0; 	//LED OFF
Delay_ms(500); 	//0.5 Second Delay
       		}
    	}
 }
}
فى هذا البرنامج :
• فى البداية ، وكالعادة، يتم تهيئة منافذ الدخل والخرج .
• بمجرد تشغيل البرنامج ، يتم قراءة حالة طرف الدخل RD0 ، وتكون فى الحالة المرتفعة (المفتاح غير مضغوط) ، وعند الدخول إلى الحلقة الغير منتهية نجد أن شرط العبارة if(PORTD.F0==0) غير متحقق false ولا يتم تنفيذ جسمها ، ويكون الليد مطفأ .
• عند الضغط على المفتاح تتحول حالة طرف الدخل RD0 إلى الحالة المنخفضة (0) ، ويتحقق true شرط عبارة if ويتم تنفيذ جسمها ، حيث التأخير 10 ملى ثانية ، ومرة أخرى نجد عبارة الشرط الثانية if(PORTD.F0==0) ، فإذا كان المفتاح مازال مضغوطا يكون شرطها متحقق true ويبد تنفيذ جسمها الذى يحتوى على وميض الليد المتصل بالطرف RB0 .
• عند رفع الضغط من على المفتاح تعود حالة الطرف إلى الحالة المرتفعة ونعود إلى الحالة الابتدائية ( الشروط أصبحت false).

لعلك لاحظت ما يلى :
• أنه يتم اختبار حالة المفتاح مرتين (باستخدام عبارة if ) ، بتأخير 10 ملى ثانية . هذا الزمن لازم لتجنب ظهور تأثير الارتدادات التى تحدث نتيجة غلق وفتح المفتاح debouncing .
• تأثير المفتاح (الوميض) يكون "أثناء الضغط علية" ، ويزول بعد تحرير المفتاح .


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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 07-06-2017, 10:48 PM المشاركة 3   
افتراضي


تمرين :

كود:
/*Toggle LED with a Tact Switch Input */
 // Define LED * RB0 and Tact switch * RD0
 sbit LED at RB0_bit;
 sbit Switch at RD0_bit;
void main() 
{
 	TRISB = 0; // PORTB All Outputs
PORTB=0;
 	TRISD = 0b00000001; // PORTD All Outputs, Except RD0
PORTD=0;
do 
{
  		if(Switch==0)
{
Delay_ms(20);
    			if (Switch ==0)  
{
    				LED = ~LED;
    			}
    		while (Switch ==0); // Wait for release of the button
  	}
 } while(1);  // Infinite Loop
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 08-06-2017, 01:08 AM المشاركة 4   
افتراضي


تدريب :
برنامج لتشغيل وفصل أكثر من ليد بمفتاح واحد .

يتم توصيل 4 ليدات بأطراف المنفذ PORTB(RB0…RB3) ، ومفتاح بالطرف RD0 .
عند بداية التشغيل تكون جميع الليدات مطفأة .
عند الضغط على المفتاح لأول مرة : تضىء الليد المتصل بالطرف RB0 فقط .
عند الضغط على المفتاح لثانى مرة : تضىء الليد المتصل بالطرف RB1 فقط .
عند الضغط على المفتاح لثالث مرة : تضىء الليد المتصل بالطرف RB2 فقط .
عند الضغط على المفتاح لرابع مرة : تضىء الليد المتصل بالطرف RB3 فقط .
عند الضغط على المفتاح لخامس مرة : تنطفىء جميع الليدات ، وتبدأ الدورة من جديد .

البرنامج :

كود:
bit oldstate;
char counter = 0 ;
void main()
{
oldstate=0;
TRISD.F0 = 1; 	//pin RD0 as input – it doesn’t matter if you are using F0 or B0
TRISB = 0x00; 	// PORTB as output
PORTB = 0x00; 	// PORTB pins are all “off”

while(1) 					// Endless loop
{
if(PORTD.F0 == 1) 			// Detect logical one 

{
Delay_ms(10); 			// “debouncing” mechanical contacts
oldstate = 1; 				// Update flag
}

if (oldstate && PORTD.F0 == 0)		 // Detect one-to-zero transition, pressed

{
Delay_ms(10); 			// “debouncing” mechanical contacts
counter++ ; 				//   Action
oldstate = 0; 				// Update flag
if(counter==5) counter=0;
}

if(counter==1) portb=0b00000001 ;
else if(counter==2) portb=0b0000010 ;
else if(counter==3) portb=0b0000100 ;
else if(counter==4) portb=0b0001000 ;
else portb=0;

} 
}

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

الصورة الرمزية مسلم11
مسلم11
:: عضو ذهبي ::
تاريخ التسجيل: Jun 2009
الدولة: بلاد الشام
المشاركات: 3,795
نشاط [ مسلم11 ]
قوة السمعة:183
قديم 22-06-2017, 08:44 PM المشاركة 5   
افتراضي


شكرا لك
للرفع

إضافة رد

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

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

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


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

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