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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 10-06-2015, 06:49 PM المشاركة 1   
افتراضي مشروع مهم لعداد تصاعدى 0-99 يستخدم CCS-C-Counter-PIC-EEPROM-Interrupt-7 Segment-7447- Twitter FaceBook Google+



مشروع مهم لعداد تصاعدى 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 :











http://fathallaabdelaziz.forumarabia.com/



اعلانات

الصورة الرمزية Sallam
Sallam
:: مهندس متميز ::
تاريخ التسجيل: Mar 2006
الدولة: Syria
المشاركات: 518
نشاط [ Sallam ]
قوة السمعة:0
قديم 11-06-2015, 10:00 PM المشاركة 2   
افتراضي


مشروع مهم لعداد تصاعدى 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 :











http://fathallaabdelaziz.forumarabia.com/


أسعد الله أوقاتك أستاذ فتح الله

أحتاج لشرح الكود وخاصة المتعلق بالزيادة بواحد والزيادة ب 7

أي ما بتعلق بهذا الكود

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));
}
[/RIGHT][/LEFT]

اشكرك لتفهمك ولتعبك


التعديل الأخير تم بواسطة : Sallam بتاريخ 11-06-2015 الساعة 10:04 PM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

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


أسعد الله أوقاتك أستاذ فتح الله

أحتاج لشرح الكود وخاصة المتعلق بالزيادة بواحد والزيادة ب 7

أي ما بتعلق بهذا الكود[LEFT]


اشكرك لتفهمك ولتعبك
أخى الكريم شكرا جزيلا لك

إليك شرح المشروع :

شرح المشروع :
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 للوصول إلى النبل العلوى أى رقم العشرات .


الصورة الرمزية Sallam
Sallam
:: مهندس متميز ::
تاريخ التسجيل: Mar 2006
الدولة: Syria
المشاركات: 518
نشاط [ Sallam ]
قوة السمعة:0
قديم 12-06-2015, 04:27 PM المشاركة 4   
افتراضي


أشكرك من كل القلب

الشرح واضح جدا وقد وصلت المعلومة بخصوص بعض النقاط التي كانت غير واضحة عندي.

منها قيمة الايبروم الابتدائية والقيمة التي نريد الوصول اليها وهي 99 بحيث يتم تصفير موقع الذاكرة والبدء من جديد.

بخصوص التزايد الشرط هو التزايد بمقدار واحد حتى الرقم 9 عندها يتحقق الشرط الأخير والذي نزيد عليه 7 بحيث يكون العدد الناتج هو البت الأول في النيبل الأعلى

لو فرضنا عندنا الرقم 1001 0000 وهو الرقم 9
مع التزايد سنصل الى 1010 0000 وهكذا حتى 1111 0000
وحتى لا نصل لهذا الرقم وهو 15
نضيف 7 + 9 اي
1001 0000
+
0111 0000
=
0000 0001

فيظهر 1 في النيبل الأعلى


أشكرك لأجل تعبك وصبرك مع كل التقدير

إضافة رد

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

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

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


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

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