الان ننتقل الى الجانب العملي والامثلة التي ستوضح بعض النقاط ان شاء الله تعالى..بسم الله تعالى نبدا...
سؤال 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 في البرنامج الرئيسي.
(يتبع) ...