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

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

فوزي سامي
:: مهندس جيد ::
تاريخ التسجيل: Jun 2008
المشاركات: 255
نشاط [ فوزي سامي ]
قوة السمعة:0
قديم 20-06-2009, 10:11 AM المشاركة 57   
افتراضي



السلام عليكم
سؤال مهم أخ geniusse01 :
هل ممكن إجراء هذه المقاطعات أيضا ببرنامج الفلوكود ؟؟؟
لأنني لاحظت سهولة التعامل مع الفلوكود
مشكور جدا أخ geniusse01

اعلانات

الصورة الرمزية عطية حسن محمود
عطية حسن محمود
:: عضو ذهبي و مشرف سابق لورشة صيانة التلفزيون ::
تاريخ التسجيل: Aug 2005
المشاركات: 1,073
نشاط [ عطية حسن محمود ]
قوة السمعة:124
قديم 20-06-2009, 02:41 PM المشاركة 58   
افتراضي


اشكرك اخى العزيز /فادى
بالفعل الكود به لووب ومن افكارك استلهمت الحل
داخل اللوب وضعت شرط لو تحقق يقف اللوب وينفذ الشرط
جزاك الله خيرا

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

geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,139
نشاط [ geniusse01 ]
قوة السمعة:106
قديم 20-06-2009, 06:08 PM المشاركة 59   
افتراضي


السلام عليكم

كيف الحال اخواني جميعا..ان شاءا لله تكوني بخير وعافية...

اخي فوزي لم اتعامل مع الفلوكود الا الشي البسيط من بداية الموضوع..ولكني فتحت البرنامج لدي ووجدت ان هناك شكل من الاشكال في الفلوكود يخص المقاطعة ومكتوب عليه الاحرف (INT) وهو موجود مع الاشكال التي تستخدمها لوضع دخل او خرج او حلقة وهكذا تفقد الرموز وستجده بينهم..اما كيفيه التعامل معه فلم اجربها ...ربنا يوفقك ويسهل امورك...

اخي العزيز عطية
ان كثير من المشاكل تحدث معي في الاقواس والفواصل وهكذا ..وان شاءا لله ربنا يسهل امورك وينفع بك الاسلام والمسلمين..ولا تحرمنا من مشاركاتك الجميله ....ربنا يوفقك..

واخر دعوانا ان الحمدلله رب العالمين..وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم..


geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,139
نشاط [ geniusse01 ]
قوة السمعة:106
قديم 20-06-2009, 06:19 PM المشاركة 60   
افتراضي مقاطعة التايمر زيرو _واستخدامه كعداد خارجي


السلام عليكم

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


عمل التايمر كعداد خارجي :

ان عمل التايمر زيرو بشكل اساسي يعتمد على السجل OPTION_REG وتوضيح ذلك في الصورة التالية :



ان ما يهمنا هو البتات التالية:

بيت رقم 5 : وهو البيت الذي يحدد مصدر الاشارة هل هو خارجي (طبعا ياخذ العد فقط من خلال RA4 اي من خلال البين رقم 4 في البورت A فقط ) ويتم هذا بوضع 1 في هذا البيت .. ام مصدرها داخلي (من الكريستالة الموصولة مع البيك ) ويتم هذا بوضع القيمة صفر في هذا البيت .

بيت رقم 4 : يحدد ما اذا كان التايمر زيرو سيزداد عندما تتغير الاشارة الخارجية على RA4 من جهد صفر الى 5 فولت (وهذا يكون بوضع القيمة صفر في هذا البيت ) ، او اذا كان التايمر سيزداد عندما تتغير الاشارة الخارجية RA4 من جهد 5 فولت الى الصفر فولت (ويكون بوضع القيمة 1 في هذا البيت ) .

بيت رقم 3 : وهو البيت الذي يحدد هل مجال القسمة الموجود سيكون للتايمر زيرو او لمؤقت كلب الحراسة (WDT) كما يسمى . وبما اننا سنسنخدم التايمر زيرو كعداد فنحدد مجال القسمة للتايمر زيرو بوضع القيمة صفر في هذا البيت؟ اما في حال اردنا ان يكون مجال القسمة للتايمر زيرو (1:1) اي كل اشارة دخل على الطرف RA4 يعدها التايمر ب 1 فانه نقوم باعطاء مجال القسمة لمؤقت كلب الحراسة وذلك يتم بوضع القيمة 1 في هذا البت.

البتات من 2 – 0 : وهي البتات المسؤولة عن مجال القسمة للنبضات القادمة الى تايمر زيرو ويتم استخدام الجدول الموجود في الصورة السابقة لمعرفة المجال الذي نريد استخدامه حسب المتطلبات لما نريد.كما نرى فالجدول يتكون من 3 اعمدة .نحن يهمنا العمود الايسر والاوسط ؟ اما الايمن فيخص WDT ولا يهمنا معرفته.

طبعا السؤال الذي يطرح نفسه هو ما معنى مجال القسمة وما فائدته ؟؟؟

الان على فرض اننا اخترنا مجال معين وليكن(1:32) فان هذا يعني انه كل 32 اشارة خارجية فان التايمر زيرو سيزداد بمقدار واحد . يعني اول 32 سيصبح واحد وثاني 32 سيصبح 2 وثالث 32 سيصبح 3 وهكذا .وبالتالي لمعرفة عدد الاشارات الخارجية فاننا نقوم بضرب القيمة في التايمر زيرو بقيمة المجال للحصول على القيمة بشكل تقريبي.

طبعا يمكن ان نضع قيمة معينة في التايمر بحيث يبدا العد منها بواسطة التعليمة :

مثلا وضع القيمة 12 في التايمر زيرو نستخدم TMR0=12 ;

وبتفعيل المقاطعة للتايمر زيرو من سجل المقاطعات INTCON (بالاضافة الى تفعيل علم المقاطعة العام وتصفير اعلام المقاطعة) وعند وضع الاعدادت المناسبة في المسجل OPTION_REG فانه ستحدث المقاطعة ايضا عندما تتغير قيمة العد في التايمر زيرو من 255 الى صفر .

الان في حال اردنا ان نعد باستخدام التايمر زيرو وبدون استخدام مجال قسمة فنضع القيمة 1 في البت رقم 3 من هذا المسجل (اي جعلنا مجال القسمة تابع لمؤقت الحراسة ،وبما انه لا يوجد سوى مجال قسمة واحدة اعطيناه لمؤقت الحراسة فان التايمر زيرو يعد بدون اي مجال قسمة اي (1:1) ).

ان استخدام المجال (1:1) يسمح بالحساب الدقيق لعدد النبضات الداخلة ،اما استخدام مجال تقسيم معين مثلا (1:4) فان هذا يعني انه كل اربع نبضات فان التايمر يعد بمقدار 1، وبالتالي اذا كان عدد النبضات الداخلة عن طرق الطرف RA4 مثلا 4 او 5 او 6 او 7 فان القيمة الموجودة في التايمر زيرو هي 1 وبالتالي ينتج لدينا نسبة خطا حسب المجال فهنا لدنيا نسبة خطا 3 نبضات (5 \6\7) ولهذا لا افضل استخدام نسبة التقسيم ان كانت القيمة الدقيقة ضرورية جدا ، وفي حال ذلك يمكن استخدام مثلا مقاطعة الطرف RB0 هذه طريقة ، او يمكن استخدام نسبة تقسيم (1:1) ومتغير مرتبط بالتايمر(مثلا X) ،بحيث انه عند حدوث مقاطعة طفحان فان المتغير يزداد بمقدار 1 وهكذا تحسب عدد النبضات N بدقة بالعلاقة التالية:
N=256*X +TMR0

(يتبع)...

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

geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,139
نشاط [ geniusse01 ]
قوة السمعة:106
قديم 20-06-2009, 06:25 PM المشاركة 61   
افتراضي تكملة : مقاطعة التايمر زيرو _واستخدامه كعداد خارجي


الان ننتقل الى الجانب العملي والامثلة التي ستوضح بعض النقاط ان شاء الله تعالى..بسم الله تعالى نبدا...

سؤال 1: كما نرى في الحياه العملية وجود صناديق مثلا تحتوي على 12 علبة او 24 وهكذا ، اكتب برنامج يسمح بالعد لـ 12 علبة مثلا(العد يحدث عند تغير الجهد من 5 فولت الى صفر فولت على الطرف RA4) ويظهر العدد على الليدات الموصله على البورت C، وعندما يحدث ذلك فانه يضيء ليد موصول بالطرف RB0، ويبقى كذلك حتى تتغير الاشارة على RA3 من 5 فولت الى صفر ،ويكرر البرنامج نفسه ؟؟؟

الجواب :

الدارة المستخدمة موجودة في المرفقات في نهاية الدرس...

والبرنامج المستخدم هو التالي:

كود:
void interrupt()
{
 
portb.f0=1;
 
while(1)
{
if(porta.f3==0)  {portb.f0=0; goto end;}
}
 
end:
TMR0=244;
intcon.f2=0;
}
 
void main()
{
adcon1=0b10000110;
trisa=0b1111111;
trisb.f0=0;
trisc=0;
portb.f0=0;
TMR0=244;
intcon=0b10100000;
option_reg=0b10111000;
while(1)
{
portc=12-(256-TMR0);
}
}

يتم عمل اعدادات البورتات المستخدمة كدخل وخرج في بداية البرنامج الرئيسي ، بما اننا سنعد 12 مرة فان القيمة التي يجب ان نبدأ بها ليحدث مقاطعة عند الطفحان هي (256 -12=244) طبعا اريد ان اعرض عدد العلب التي وصلت فاستخدمت العلاقة portc=12-(256-TMR0) :
في برنامج المقاطعة بما ان العد وصل الى 12 علبة فان البين RB0 ويبقى كذلك حتى يتم ضغط المفتاح RA3 عندها نعيد وضع القيمة 244 في التايمر ونصف العلم للسماح بحدوث مقاطة اخرى في المستقبل.


سؤال2 : اريد كتابة برنامج يعد النبضات الخارجية بنسبة خطأ لا تتجاوز 7 نبضات بحيث ان العد يكون عند تغير الاشارة من الجهد صفر الى 5 فولت ؟؟ ويظهر النتيجة على البورت C .


الجواب :

الان الدارة المستخدمة موجود في المرفقات في نهاية هذا الدرس..

والبرنامج المستخدم هو التالي:

كود:
void interrupt()
{
intcon.f2=0;
}
void main()
{
trisc=0;
portc=0;
tmr0=0;
intcon=0b10100000;
option_reg=0b10100010;
 
while(1)
{
portc=TMR0;
}
}

الان يتم الاعدادت للبورتات وسجل المقاطعة ويتم اختيار مجال عد (1:8( لانه يسبب نسبة خطا لا تزيد عن 7 نبضات . حيث ان نسبة الخطا تكون مساوي لقيمة المجال المستخدم مطروحا منه واحد .ويتم اظهار القيمة على البورت C في البرنامج الرئيسي.

(يتبع) ...


التعديل الأخير تم بواسطة : geniusse01 بتاريخ 22-06-2009 الساعة 09:08 PM

geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,139
نشاط [ geniusse01 ]
قوة السمعة:106
قديم 20-06-2009, 06:32 PM المشاركة 62   
افتراضي تكملة : مقاطعة التايمر زيرو _واستخدامه كعداد خارجي


سؤال 3 : (سؤال متقدم ) استخدم مقاطعة التايمر زيرو للحصول على عداد يعد حتى مليون اشارة خارجية (تقريبا ) بحيث انه كل مليون اشارة خارجية فان القيمة على البورت C تزداد بمقدار 1 فقط .اتجاه تغير الجهد على RA4 من الصفر الى 5 فولت , اما نسبة التقسيم فهي اختيارية ؟؟؟


الجواب :

الان الدارة المستخدمة موجودة في نهاية هذا الدرس...


الشرح :

الان باختبار اكبر مجال وهو 256 وبما ان الطفحان يتم كل 256 اذن اكبر قيمة يمكن ان يعدها التايمر في هذه الحالة هي 256*256=65536 اذن نحن نحتاج طريقة اخرى للحصول على مليون لان هذه الطرقى غير فعالة . فما هو الحل هنا؟؟؟

ان الحل يتمثل في ادخال متغير جديد(مثلا X) بحيث انه كل ما تتكرر النبضات (مثلا كل 65536 يعد واحد وهكذا ) فاذا اردنا ان نعرف قمية المتغير عندما يصل الى المليون مثلا :

X=1000000/65536=15.25

الان بحساب العدد الكلي للنبضات في حال القيمة الصحيحة الاقل من المحسوبة (وهي هنا 15 وايضا القيمة الصحيحة الاكبر من المحسوبة(وهي هنا 16 ) نحصل على القيمة الافضل لبرنامجنا .

عدد النبضات في حال القيمة الصحيحة الاقل يكون عدد النبضات الكلي هو :
256*256*15= 983040

عدد النبضات في حال القيمة الصحيحة الاكبر يكون عدد النبضات الكلي هو :
256*256*16= 1048576

الان اي القيمتين اقرب الى الواقع فنجد انها القيمة الاولى لان الفرق بينها وبين المليون اقل من النسبة الاخرى لذلك نختار قيمة المتغير التابعة للاولى وهي 15.

اذن فكرة البرنامج كالتالي: حيث نقوم بعمل الاعدادت البورتات وسجلات المقاطعة لكل شي ونقوم باظهار القيمة على البورت C . ان البرنامج ينتقل الى المقاطعة (اي يحدث طفحان في هذه الحالة كل 65536 اشارة خارجية ) ويجب ان يحدث 15 مرة طفحان لنستطيع العد تقريبا الى مليون اشارة خارجية .اذن في المقاطعة سيقوم البرنامج بزيادة المتغير X كل مرة يدخل فيها المقاطعة .ومن ثم يختبر هذ ا المتغير هل وصل الى 15 ؟؟؟ فان كانت النتيجة لا فان القيمة لم تصل المليون بعد ويقوم البرنامج بتصفير علم المقاطعة للتايمر ويعود للبرنامج الرئيسي . اما في حال وصل المتغير الى 15 فمعناه ان الاشارات اصبحت تقريبا مليون اشارة وعندها فقط يزيد القيمة على البورت C بمقدار واحد ويعطي المتغير X القيمة صفر حتى يبدأ عد المليون اشارة الخارجية من جديد والاختبار للمتغير من جديد وهكذا...هذا باختصار عمل البرنامج والان بالبرنامج كالتالي:

كود:
int x;
void interrupt()
{
x++;
if(x>=15) { portc++; x=0;}
intcon.f2=0;
}
void main()
{
trisc=0;
portc=0;
tmr0=0;
intcon=0b10100000;
option_reg=0b10100111;
 
while(1)
{
portc;
}
}

الان اذا حاولنا حساب فرق القيمة التي استخدمناها عن القيمة الحقيقية سنجد انها تقارب فرق 16 الف اشارة تقريبا وهذا فرق كبير جدا حتى للحسابات العادية ؟فكيف يمكن ان نقلل الفرق عن القيمة الحقيقية التي نريدها ؟
ان الجواب يكون باختيار مجال قسمة اقل من 256 .حيث يكون الفرق اقل ما يمكن .لذلك نحسب الفرق عن القيمة الحقيقة لكل مجال من المجالات الموجودة لنحصل على اقرب قيمة تفيدنا فيما نريد. فمثلا اذا غيرنا المجال من 1:256 ليصبح 1:64 على سبيل المثال . وباجراء الحسابات السابقة بنفس الطريقة :

الان باختبار مجال وهو 64 وبما ان الطفحان يتم كل 256 اذن اكبر قيمة يمكن ان يعدها التايمر في هذه الحالة هي 64*256=16384 اذن نحن نحتاج طريقة اخرى للحصول على مليون لان هذه الطريقة غير فعالة . فما هو الحل هنا؟؟؟

ان الحل يتمثل في ادخال متغير جديد(مثلا X) بحيث انه كل ما تتكرر النبضات (مثلا كل 16384 يعد واحد وهكذا ) فاذا اردنا ان نعرف قمية المتغير عندما يصل الى المليون مثلا :

X=1000000/16384=61.035

الان بحساب العدد الكلي للنبضات في حال القيمة الصحيحة الاقل من المحسوبة (وهي هنا 61 وايضا القيمة الصحيحة الاكبر من المحسوبة(وهي هنا 62 ) نحصل على القيمة الافضل لبرنامجنا .

عدد النبضات في حال القيمة الصحيحة الاقل يكون عدد النبضات الكلي هو :
64*256*61= 999424

عدد النبضات في حال القيمة الصحيحة الاكبر يكون عدد النبضات الكلي هو :
64*256*62= 1015808

الان اي القيمتين اقرب الى الواقع فنجد انها القيمة الاولى لان الفرق بينها وبين المليون اقل من النسبة الاخرى لذلك نختار قيمة المتغير التابعة للاولى وهي 61.

ان البرنامج هو نفسه السابق مع تغيير مجال القسمة من (1:256) الى (1:64) من خلال البتات المرافقة في السجل OPTION_REG وتغيير قيمة المتغير X من 15 الى 61 في برنامج المقاطعة . وبالحساب نجد ان الفرق عن القيمة الحقيقية هو فقط 576 وهي اقرب من القيمة السابقة بكثييييييييييييير . طبعا يمكن تجرب اكثر من مجال للحصول على اقرب قيمة ممكنة من الحقيقة.

ملاحظة : ملفات المشروع موجود على الرابط التالي لمن اراد تجربة المشروع وان يرى كيفية عمله وعمل المقاطعة ولاي استفسار ..الرابط التالي للمشروع هو

جواب السؤال الاول:
http://arabsh.com/ixy1r7dlr830.html

جواب السؤال الثاني:
http://arabsh.com/jpc8ddgah9zu.html

جواب السؤال الثالث:
http://arabsh.com/vz2ke0jhkvn0.html

واخر دعوانا ان الحمدلله رب العالمين...وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم...

احصائية الشكر والاعجاب - 0 شكراً, 0 عدم اعجاب, 1 اعجاب
اعجاب sohaib A.Z ( أعجبته المشاركة )

أشرف الخطيب
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2009
الدولة: مصــــــــــــــــــــــــــــــر
المشاركات: 195
نشاط [ أشرف الخطيب ]
قوة السمعة:0
قديم 21-06-2009, 06:37 AM المشاركة 63   
افتراضي


ماشاء الله عليك أخى فادى ..... جهد ممتاز وشرح جميل

ربنا يرزقك ياأخى بالسعادة فى الدنيا والآخرة

لى سؤال إذا سمحت أخى فادى .... لا يتعلق بالتايمر ولا آلية عمله

فى إجابة السؤال الثالث

مامعنى الأمر الموجود داخل حلقة while

كود:
portc;


geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,139
نشاط [ geniusse01 ]
قوة السمعة:106
قديم 21-06-2009, 11:38 AM المشاركة 64   
افتراضي


ماشاء الله عليك أخى فادى ..... جهد ممتاز وشرح جميل

ربنا يرزقك ياأخى بالسعادة فى الدنيا والآخرة

لى سؤال إذا سمحت أخى فادى .... لا يتعلق بالتايمر ولا آلية عمله

فى إجابة السؤال الثالث

مامعنى الأمر الموجود داخل حلقة while


كود:
portc;
السلام عليكم اخي اشرف

منور يا عم .فينك من زمان ؟؟ ربنا يرزقنا جميعا والمسلمين السعادة في الدنيا والاخرة..ان الامر المستخدم هو فقط لاظهار القيمة الموجودة في PORTC كما هي بدون اي تغيير ..فقط اظهار القيمة على البورت .فكما تعلم فان الزيادة تكون بوضع علامتين (++) بجانب البورت ..فاذا لم نضع اي علامات بجانب البورت فانه يظهر القيمة نفسها فقط على البورت دون تغيير...ربنا يوفقك وتطلع بكم مشروع جميل يا عم..

واخر دعوانا ان الحمدلله رب العالمين..وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم..

إضافة رد

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

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

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


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

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