مشروع عداد تصاعدى 0-99 يستخدم CCS-C-Counter-PIC-EEPROM-Interrupt-7 Segment-7447-

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل

مشروع عداد تصاعدى 0-99 يستخدم CCS-C-Counter-PIC-EEPROM-Interrupt-7 Segment-7447-

مُساهمة من طرف Admin في الأربعاء يونيو 10, 2015 6:45 pm

مشروع عداد تصاعدى 0-99 يستخدم CCS-C-Counter-PIC-EEPROM-Interrupt-7 Segment-7447-
الغرض :
أنشاء عداد تصاعدى فى المدى “0-99” ، مع تذكر آخر رقم فى حالة انقطاع التيار الكهربائى ، والذى غالبا ما يتواجد فى كثير من المنشآت التى تقدم خدمات للجمهور مثل البنوك وأماكن انتظار الدور .


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



عندما نستخدم أكثر من وحدة عرض 7 Segment ، ونرغب فى تقليل عدد أطراف الميكروكونترولر المستخدمة للتحكم فيها ، هناك طرق عديدة ، أحد هذه الطرق ، والتى سوف نستخدمها هنا ، هى استخدام ديكودر (فك شفرة) من BCD إلى
7 Segment من نوع 7447 الذى يعمل مع السفن سيجمنت من نوع الأنود المشترك .
البرنامج :

الكود:


/*-----------------------------------------------------------*\ 
|  Use EEPROM                          | 
\*-----------------------------------------------------------*/ 
#include <16F877.h> 
#use delay(clock=4000000)
 
#int_EXT

void EXT_isr( void )
{
 
if ((read_eeprom(0)==0x99)||(read_eeprom(0)==0xFF))
{
write_eeprom(0,0);
output_d(read_eeprom(0));
}
else if ((read_eeprom(0) & 0x0F)<0x09)
{   
write_eeprom(0,(read_eeprom(0))+1);
output_d(read_eeprom(0));
}     
else if ((read_eeprom(0) & 0x0F)>=0x09)
{       
write_eeprom(0,(read_eeprom(0))+7);
output_d(read_eeprom(0));
}   
 
}
 
void main()
{
set_tris_b(0xFF);
set_tris_d(0x00);
enable_interrupts(GLOBAL); 
enable_interrupts(INT_EXT);
output_d(0xFF);
//write_eeprom(0,0xFF);//reset EEPROM
while(true)
{
//rest of program   
}
}


نتائج المحاكاة ببرنامج Proteus :















Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

شرح المشروع :

مُساهمة من طرف Admin في الخميس يونيو 11, 2015 11:28 pm

شرح المشروع :
1- هذا المشروع فى الأساس هو عداد تصاعدى من صفر إلى 99 ، والذى يتزايد بواحد فى كل مرة يتم فيها الضغط على الزر الضاغط المسمى "العداد" counter .
2- لمنع قيمة العداد من الإعادة reset والبداية من الصفر من جديد فى كل مرة ينقطع فيها التيار الكهربائى ، يتم تخزين القيمة الحالية للعداد فى ذاكرة EEPROM الداخلية للميكروكونترولر بدلا من التخزين فى ذاكرة RAM . نظرا لأننا نريد حفظ مجرد قيمة بين 0 و 99 فيكفى استخدام البايت الأول من ذاكرة EEPROM فقط .
3- لكشف حالة الضغط على المفتاح ، تستخدم المقاطعة الخارجية على الطرف RB0/INT . فعند الضغط على زر العد المتصل بالطرف RB0 ، تحدث المقاطعة ويتم تنفيذ دالة خدمة المقاطعة والتى تحتوى على 3 عبارات شرط
if / else if / else if :
أ‌- عبارة الشرط الأولى “if” :

الكود:

if ((read_eeprom(0)==0x99)||(read_eeprom(0)==0xFF))
{
write_eeprom(0,0);
output_d(read_eeprom(0));
}

فى البداية تكون قيمة محتويات بتات ذاكرة EEPROM هى “FF” ( قيمة المصنع) ، لذلك ينبغى علينا أن نجعل قيمتها بصفر لبداية العد ، وكذلك (أو || ) عند وصول العداد إلى أقصى قيمة له وهى 99 يتم تصفير قيمة العداد ، عند التشغيل بعد ذلك فإن الشرط الثانى فقط هو الذى يتم تحقيقة . ملخص هذه العبارة هو تنفيذ عملية إعادة reset لتصفير محتويات الموقع الأول من الذاكرة عند تحقق أى من الشرطين .

ب‌- عبارة الشرط الثانية “else if” :

الكود:

else if ((read_eeprom(0) & 0x0F)<0x09)  // & for select lower nibble only (mask)
{   
write_eeprom(0,(read_eeprom(0))+1); // Increment by 1
output_d(read_eeprom(0));
}


كل نبل “nibble” (أربع بتات) من المنفذ portD يتم توصيله إلى ديكودر ، كما هو فى الشكل أعلاه ، الأطراف RD0-RD3 (النبل السفلى) متصلة بالديكودر الأول والمتصل بوحدة عرض خانة الآحاد ، والأطراف RD4-RD7 (النبل العلوى) متصلة بالديكودر الثانى والمتصل بوحدة عرض العشرات .
حسنا ، إذا كان لدينا 4 بت تشكل النبل فإنه يكون لدينا 16 توليفة ممكنة ، ونحن نقوم بتزايد القيمة فى ذاكرة EEPROM بواحد ، وأن جميع القيم لن تتعدى القيمة 9 (أى تكون أقل من 9 ، كل خانة تعرض الأرقام من 0 إلى 9 ) . ونظرا لأن دالة الكتابة إلى الذاكرة EEPROM تسمح لنا باستخدام دالة القراءة كبارامتر ، لذلك فليس هناك حاجة لإعلان متغير محلى لنقل البيانات . الخلاصة تزايد محتويات الموقع الأول بذاطرة EEPROM بواحد كلما حدثت المقاطعة الخارجية .

ت‌- عبارة الشرط الثالثة : بمجرد أن تتجاوز ( أكبر من أو تساوى ) القيمة المخزنة فى النبل الأدنى لبيانات الموقع الأول لذاكرة EEPROM القيمة “9” وهى أكبر قيمة نريدها ، يتم إجراء قراءة جديدة وتخصيص قيمتها إلى المنفذ PORTD :

الكود:

else if ((read_eeprom(0) & 0x0F)>=0x09)  // mask for lower nibble
{       
write_eeprom(0,(read_eeprom(0))+7);
output_d(read_eeprom(0));
}

• بعد الرقم 9 ، القيم من 10 إلى 15 فى النبل السفلى غير مطلوبة ، ولتخطيها وللوصول إلى النبل العلوى مباشرة فبدلا من إضافة واحد يتم إضافة 7 للوصول إلى النبل العلوى أى رقم العشرات .

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى