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

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

الصورة الرمزية wleed antar
wleed antar
:: عضو ماسي ::
تاريخ التسجيل: May 2006
الدولة: القاهرة - مصر
المشاركات: 1,524
نشاط [ wleed antar ]
قوة السمعة:145
قديم 12-04-2012, 07:09 AM المشاركة 1   
افتراضي دراسة مشروع الساعة الرقمية باستخدام البيك والمقاطعة . Twitter FaceBook Google+



السلام عليكم ورحمة الله وبركاته

اخوانى الكرام
إليكم مشروع الساعة الرقمية للدراسة والإفادة فى استخدام المقاطعة وطريقة العرض على الوحدات المضيئة ( السيفن سيجمنت ) واستخدام التأخير الزمنى

وكما عودتكم المشروع من تصميمى وغير منقول ولأول مرة يعرض على النت رغم أنى رفعت الفيديو الخاص بالشرح الصوتى المبسط على قناتى

http://www.youtube.com/user/WLEEDANT.../3/BAEJ5s7w1kk




تم استخدام ترانزستورات bc337 فى الناحية العملية وإنما على البروتوس استخدمت
not gate من أجل زيادة سرعة الأداء على المحاكاة لآن هناك بعض الإختلافات فى المحاكاة عن الحقيقة من حيث السرعة أو الأداء بصفة عامة أو الأداء الفعلى لبعض القطع والمتكاملات ، وسنرى فى الفيديو الموجود على الرابط الأداء العملى وكذلك الأداء على برنامج المحاكاة ومقارنة الزمن على القطع الضوئية متطابق مع الساعة الداخلية لبرنامج المحاكاة والتى تظهر فى الشريط السفلى للحالة لبرنامج المحاكاة .

التفاصيل

يتبع ،

---------------------

اعلانات

الصورة الرمزية wleed antar
wleed antar
:: عضو ماسي ::
تاريخ التسجيل: May 2006
الدولة: القاهرة - مصر
المشاركات: 1,524
نشاط [ wleed antar ]
قوة السمعة:145
قديم 12-04-2012, 07:17 AM المشاركة 2   
افتراضي


مع كود البرنامج الخاص بالساعة الرقمية
========================



كود:
unsigned long sec , cnt , show ;
char sec1,sec2,mint1,mint2,hur1,hur2 ,set,hold ;

void display(){
portb=0xff;porta=sec2;portb.f5=0;delay_ms(1);
portb=0xff;porta=sec1;portb.f4=0;delay_ms(1);
portb=0xff;porta=mint2;portb.f3=0;delay_ms(1);
portb=0xff;porta=mint1;portb.f2=0;delay_ms(1);
portb=0xff;porta=hur2;portb.f1=0;delay_ms(1);
portb=0xff;porta=hur1;portb.f0=0;delay_ms(1);
}
void interrupt(){
if(intcon.f2==1){intcon.f2=0;cnt++ ;tmr0 = 132;}
}
void main() { trisb=0xc0; portb=0;trisa=0xE0;porta=0xff;
option_reg =0x84; cnt = 0; set=0;
intcon = 0xA0; tmr0 = 132; hold=0;
sec1=sec2=hur1=hur2=mint1=mint2=0;
normal:

while(cnt<249){
display();
if(porta.f5==0 && porta.f6==0 && porta.f7==0){hold=0;}
if(porta.f5==1 && hold==0){hold=1;hur2++;
if(hur2>9){hur2=0;hur1++;}
if(hur1==2 && hur2>3){hur2=hur1=0;}
}
if(porta.f6==1 && hold==0){ hold=1;mint2++;
if(mint2>9){mint2=0;mint1++; if(mint1>5){mint1=0;}}
}
if(porta.f7==1 && hold==0){hold=1;sec1=sec2=0;}
}
cnt=0;
sec2++;
if(sec2>9){sec2=0;sec1++;
if(sec1>5){sec1=0;mint2++;
if(mint2>9){mint2=0;mint1++;
if(mint1>5){mint1=0;hur2++; 
if(hur2>9){hur2=0;hur1++;}
if(hur1>1 && hur2>2){sec1=sec2=hur2=hur1=0;}
} } } }
goto normal; // goto labl
{



الشرح يتبع ،

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

الصورة الرمزية wleed antar
wleed antar
:: عضو ماسي ::
تاريخ التسجيل: May 2006
الدولة: القاهرة - مصر
المشاركات: 1,524
نشاط [ wleed antar ]
قوة السمعة:145
قديم 12-04-2012, 07:24 AM المشاركة 3   
افتراضي


شرح البرنامج


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


وهنا المقاطعة هى للتايمر زيرو ومادمنا ذكرنا التايمر زيرو فنحن سنستخدم هذه المقاطعة لحساب الزمن وسنضبط الإعدادات لواحد ثانية وسنقوم بعد ذلك بالنظر إلى بت العلم ( خانة الإعلام عن اكتمال التايمر زيرو) وعندها سنقوم باتخاذ اجراء مرور ثانية والإجراء هنا هو زيادة خانة الثوانى بمقدار واحد وعند الإكتمال 59 يصبح الرقم 00 ثم يزيد الدقائق بمقدار واحد بنفس النظام حتى 59 تصبح 00 وعندها تزيد الساعات بمقدار واحد صحيح حتى 23 وبعدها تكون 00 وبذلك نتلافى استخدام الأمر تأخير ( (delay_ms(1000 ) ثم زمن اجراء تعليمة البحث عن فعل شرط ( IF ) وزمن اجراء كل تعليمة مهما كان زمن قصير فهو سيأخذ من الزمن الحقيقى للساعة ولن تكون دقيقة لذلك فنحن بحاجة لبرنامج المقاطعة ،

كود:
 


unsigned long sec, cnt, show;
هذه الكلمات هى كلمات عشوائية اخترناها لتكون متغيرات من المدى الكبير
كود:
 
void interrupt(){ if(intcon.f2==1){intcon.f2=0;cnt++ ;tmr0 = 132;} }
هذا هو برنامج المقاطعة
فيه يتم البحث هل البت 2 والمسئول الإعلام بامتلاء التايمر زيرو ومعناها مرور واحد ثانية وعندها سيقوم الجواب لهذا الشرط بمسح هذا البت وذلك عن طريق وضع صفر فيه ثم نجد بعد ذلك المتغير
cnt
سيزيد بمقدار واحد صحيح
ويجب أن نعلم أننا الآن دخلنا لبرنامج المقاطعة هذا بسبب أن التايمر زيرو صفرا أو امتلئ وأصبح صفر ولذلك دخلنا لبرنامج المقاطعة وقمنا بإجراء الخطوات أو التعليمات السابقة والآن جاء دور التعليمة التالية
كود:
 
tmr0 = 132;
وهذه التعليمة نطلب فيها وضع القيمة 132 داخل سجل التايمر زيرو
ثم ينتهى بذلك برنامج المقاطعة


يجب أن نعلم أن التايمر زيرو يزداد طالما المذبذب الذى يمد المتحكم بالنبضات يعمل أو بمعنى آخر أن التايمر زيرو لم ولن يتوقف عن العمل لأنه مرتبط بالمذبذب وليس بطرف خارجى لأننا يمكننا أن نربطه مع طرف خارجى خاص بذلك ولكن هنا هو مرتبط مع المذبذب ويجب أن نعلم أيضا أنه كلما اكتمل بالعدد 255 سيعود للصفر مثله مثل أى سجل يتكون من ثمانى بتات وعندها سيعود للصفر كما قلنا محدثا المقاطعة وكما رأينا أننا بنضع رقم 132 وذلك ليبدأ سجل التايمر زيرو من عند الرقم 132 وهذا يعنى أننا سنبدأ العد من الرقم 132 إلى الرقم 255 أى أننا سنعد 123 مرة حتى يكتمل التايمر زيرو
كود:
 
trisb=0xc0; portb=0;trisa=0xE0;porta=0xff;

اعداد المداخل والمخارج وإطفاء قطع السيفن سيجمنت عن طريق اغلاق ترانزستورات الإشعال
كود:
 
option_reg =0x84;
اعدادات الأوبشن ريجستر أو مسجل الوظائف بالقيمة التالية
10000100

وهذا يعنى أننا سنستخدم المقسم
1:32

وبقسمة ربع تردد الكريستالة ال
4MHz
وهو 1000000
سنقسمه على 32 على سبيل المثال واخترت الرقم هذا لأن الناتج رقم صحيح وهو
1000`000 / 32 = 31250
والآن سنقسم الناتج على رقم مناسب من بين 256 و 1
بحيث أن الناتج يكون صحيحا واخترت على سبيل المثال الرقم
125
والآن
الناتج من آخر عملية وهو 31250
31250 / 125 = 250
إذن الناتج رقم صحيح 250
والآن نفهم الآتى
أن التايمر زيرو سيحمل بالقيمة 132 ليقوم بالعد حتى 255 أى سيتحرك بعدد 124 نبضة حتى يعوود للصفر ونكرر الموضوع هذا 32 مرة وهذا هو الرقم المختار من الجدول الخاص بتقسيم التايمر زيرو وكل هذا سيظل يتكرر كام مرة ؟؟؟
250
وهذه النتائج كما سبق فى العمليات الحسابية المذكورة
والآن عندنا خلال البرنامج يمكننا ببساطة عمل تكرار لعرض القيم على شاشة العرض أو وحدات العرض بقيم المتغيرات للثوانى والدقائق والساعات حتى يتم وصول
cnt
إلى الرقم 249 وهذا يعنى 250 خطوة تكرار للمقاطعة وهى بذلك تعنى مرور زمن واحد ثانية

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



الصورة الرمزية wleed antar
wleed antar
:: عضو ماسي ::
تاريخ التسجيل: May 2006
الدولة: القاهرة - مصر
المشاركات: 1,524
نشاط [ wleed antar ]
قوة السمعة:145
قديم 12-04-2012, 07:26 AM المشاركة 4   
افتراضي


هذه صورة عملية للمشروع


ونرى أن بين كل وحدة من الثوانى والدقائق والساعات تم وضع ليدان مع مقاومات 100 أوم وتغذيتهم باستمرار مع المصدر للفصل


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

ونرى أننا فى هذا المشروع استخدمنا 13 طرف فقط من واقع 18 طرف للمتحكم الصغير واستخدمنا الكريستالة الداخلية للدقة ، فى حين أننا فى باقى المتحكمات يمكننا استخدام مقاومة ومكثف ولكن فى مثل هذا المشروع الذى يحتاج لدقة عالية يجب استخدام كريستالة سواء الداخلية أو الخارجية للثبات .

غالبا نجد فى بعض الساعات الرقمية خانة الدقائق وخانة الساعات دون خانة الثوانى ، وهنا يجب أن تكون ليدات الفصل بين الخانتان تومضان بمعدل نبضة كل ثانية كمؤشر على عمل الثوانى ، ولكن فى المشاريع التى تحتوى على خانة رقمية لإظهار الثوانى فإن الليدات الفاصلة قد تكون ثابتة أو وامضة ،


يتبع ،



الصورة الرمزية wleed antar
wleed antar
:: عضو ماسي ::
تاريخ التسجيل: May 2006
الدولة: القاهرة - مصر
المشاركات: 1,524
نشاط [ wleed antar ]
قوة السمعة:145
قديم 12-04-2012, 07:33 AM المشاركة 5   
افتراضي



والآن بعدما عرفنا كيفية عمل المقاطعة والتى هى عبارة عن برنامجا فرعيا وتكلمنا هنا عن مقاطعة التايمر زيرو تحديدا وفائدته نكمل معا باقى البرنامج

كود:
void display(){ portb=0xff;porta=sec2;portb.f5=0;delay_ms(1); portb=0xff;porta=sec1;portb.f4=0;delay_ms(1); portb=0xff;porta=mint2;portb.f3=0;delay_ms(1); portb=0xff;porta=mint1;portb.f2=0;delay_ms(1); portb=0xff;porta=hur2;portb.f1=0;delay_ms(1); portb=0xff;porta=hur1;portb.f0=0;delay_ms(1); }
هذا برنامج شبه فرعى وهو فى الواقع عبارة عن اختزال عدة تعليمات تنفذ بمجرد استدعاء عنوانهم ألا وهو display ونرى أن التعليمات عبارة عن إعطاء البورة b خرج موجب وبالتالى يتم اطفاء الوحدات بالكامل لأن البورت b هو المسؤال عن تشغيل وإطفاء وحدات العرض .

يتم إعطاء البورت a خانة الأحاد للثوانى ثم يتم إعطاء إشارة تشغيل وحدة العرض الأولى من اليمين والمسؤلة عن عرض خانة الأحاد للثوانى ، وهى إشارة سالبة ، لمدة واحد ميللى ثانيى ثم يتم بعد ذلك إعطاء البورت b كاملا إشارات موجبة ( 0xff ) لإطفاء الوحدات بالكامل ثم تحميل البورت a بقيمة خانة العشرات للثوانى ثم تشغيل خانة العرض بإعطاء البت ( الطرف الخاص بإشعال الترانزستور الخاص بالخانة المقصودة ) سالب لمدة واحد ميللى ثانية ثم السطر التالى بنفس الطريقة ويكرر النظام وفى كل مرة يتم تحميل البورت a بقيمة الخانة المطلوب عرضها ثم تحميل البورت b بإشارة سالبة للبت المسؤل عن الخانة المطلوب عرضها لمدة واحد ميللى ثانية وهكذا ،
كود:
 
while(cnt<249){
هنا تعليمة التكرار المشروط والشرط هنا معناه هل تم انقضاء ثانية كاملة وقد عرفنا المتغير هذا وعرفنا أيضا لماذا اخترنا هذا الرقم تحديد ، وبمجرد ان يصبح الشرط غير متحقق بمعنى أن المتغير يصبح يتساوى مع الرقم يصبح الشرط غير محقق وعندها يتم الخروج من الحلقة ،

بعد ذلك نرى بداخل الحلقة استدعاء برنامج العرض ، display

كود:
if(porta.f5==0 && porta.f6==0 && porta.f7==0){hold=0;} if(porta.f5==1 && hold==0){hold=1;hur2++; if(hur2>9){hur2=0;hur1++;} if(hur1==2 && hur2>3){hur2=hur1=0;} } if(porta.f6==1 && hold==0){ hold=1;mint2++; if(mint2>9){mint2=0;mint1++; if(mint1>5){mint1=0;}} } if(porta.f7==1 && hold==0){hold=1;sec1=sec2=0;} }
يتم اختبار أطراف الدخل إذا كانت غير مضغوطة فيتم إعطاء المتغير hold قيمة صفر ،

ثم بعد ذلك فى السطر التالى يتم السؤال هل الطرف كذا يساوى كذا ؟؟ حسب الموجب والسالب وتوصيل المفاتيح ، وهنا معناه هل المفتاح مضغوط الموصل بالطرف رقم كذا وهل فى نفس الوقت المتغير HOLD يساوى صفر ؟؟ إذن قم بزيادة الخانة رقم كذا بقيمة واحد ( فى حالة ضغط المفتاح الخاص بالثوانى فيتم التصفير بإعطاء صفر للمتغير الخاص بالثوانى )


المتغير HOLD يساوى صفر فى حالة عدم الضغط على أى مفتاح وهذا يعنى أن المستخدم لم يظل ضاغطا على احد المفاتيح ، وبذلك يتطلب من المستخدم أن يضغط ضغطات متتابعة وليست متصلة وصمم البرنامج بهذا لمنع الإستمرار فى الزيادة للأرقام بنسبة كبيرة جدا مع أى ضغطة ,
كود:
 
cnt=0; sec2++; if(sec2>9){sec2=0;sec1++; if(sec1>5){sec1=0;mint2++; if(mint2>9){mint2=0;mint1++; if(mint1>5){mint1=0;hur2++; if(hur2>9){hur2=0;hur1++;} if(hur1>1 && hur2>2){sec1=sec2=hur2=hur1=0;} } } } }
هنا وبعدما خرجنا من حلقة التكرار المشروط أى بعد انقضاء ثانية كاملة يتم إعادة تصفير المتغير cnt لبداية حساب ثانية من جديد وللدخول فى الحلقة من جديد عندما نصل بعد قليل للأمر goto الموجود فى آخر البرنامج
التعليمات السابقة تعنى زد خانة الأحاد للثوانى بمقدار واحد وإذا كانت الخانة الأحاد تساوى 10 بعد الزيادة اجعلها صفر وزد خانة العشرات واحد وإذا كانت بعد الزيادة 6 اجعلها 0 وزد حينئذ الأحاد للدقائق بواحد فإذا كانت بعد الزيادة 10 اجعلها صفر وزد عندها خانة العشرات بمقدار واحد فإذا أصبحت بعد الزيادة 6 اجعلها صفر وزد الساعات بواحد فإذا كانت خانة الأحدا تساوى 4 انظر هنا لخانة العشرات هل هى تساوى 2 ؟؟ فإذا كانت كذلك صفر جميع الساعة وهنا تكون الساعة أصبحت 24 لوكن رقم أربعة لم يكتب ، وإذا كانت خانة العشرات أقل من 2 سيتم زيادة خانة الأحاد بدون مشاكل حتى تكون 10 وعندها تصبح صفر وتزيد خانة العشرات بمقدار واحد



وبالتوفيق للجميع
والسلام عليكم ورحمة الله وبركاته
--------------------


yac100
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2007
الدولة: فلسطين - غزة
المشاركات: 140
نشاط [ yac100 ]
قوة السمعة:0
قديم 12-04-2012, 12:25 PM المشاركة 6   
افتراضي


ما شاء الله عليك يا مهندس وليد
شرح جميل وموضوع أيضا جميل
جعله في ميزان حسناتك
وبارك الله فيك


الصورة الرمزية أبو معاذ 2010
أبو معاذ 2010
:: مشرف قسم الإنتاج الزراعي والحيواني والطاقة البديلة ::
تاريخ التسجيل: Feb 2010
المشاركات: 2,121
نشاط [ أبو معاذ 2010 ]
قوة السمعة:216
قديم 12-04-2012, 07:59 PM المشاركة 7   
افتراضي


ضبط الوقت أكثر ما يؤرق المبرمجين ، و حضرتك شرحته بما لا يدع مجالا للغموض ، بارك الله و فيك و جزاك عنا خير الجزاء .


TIME0
:: مهندس جيد ::
تاريخ التسجيل: Mar 2012
المشاركات: 277
نشاط [ TIME0 ]
قوة السمعة:0
قديم 12-04-2012, 08:31 PM المشاركة 8   
افتراضي


جزاك الله خيرا

اريد ان اسال هل دقة الوقت الريل تايم تعتمد على المقاطعة

ام قطع اضافيه مثل ds1307

ام لغة البرمجة لها دور

اتمنى لو كان لك شروحات كيف نستخدم ds

-----------------------------------------------------

وبالنسبة للساعة التي عملتها نريد ان نضيف عليها بعض الاضافات

وهي... عند ضبط الساعة السفن سيجمنت يعمل فلاش لخانه الثواني او الدقائق او الساعات حسب ما اختار
والساعة تقف عن العد عند الضبط


التعديل الأخير تم بواسطة : TIME0 بتاريخ 12-04-2012 الساعة 08:36 PM
إضافة رد

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

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

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


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

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