المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : البرنامج يعمل على الكمبيوتر ولا يعمل على الواقع ؟!


haidar ayad
10-18-2013, 08:44 PM
السلام عليكم
اخوتي عملت برنامج صغير وظيفته العد فقط من ال0-9 عند كل ضغطة زر ...بواسطة البيك 16f628a
ولكن المشكلة ان البيك يظهر لي على الشاشة اول رقم وضعته او حددته للعد منه وهو الصفر ...وعندما انقر الزر لا يعد ويبقى على الصفر .... فما السبب ؟

وهذا الكود مع الدائرة :
http://www.gulfup.com/?V8ZdSI

>>>>>>>>>>>>>>>>
وعندي سؤال اخر وهو : كيف اجعل الدائرة تعد فقط اذا ضغط الزر لمدة دقيقة او لاي وقت محدد ؟ يعني اذا شخص نقر الزر بسرعة فلا يعد الا اذا بقى ضاغط لمدة طويلة بمقدار دقيقة تقريبا....كيف ؟

حسن هادي محمود
10-18-2013, 08:55 PM
السلام عليكم
اخوتي عملت برنامج صغير وظيفته العد فقط من ال0-9 عند كل ضغطة زر ...بواسطة البيك 16f628a
ولكن المشكلة ان البيك يظهر لي على الشاشة اول رقم وضعته او حددته للعد منه وهو الصفر ...وعندما انقر الزر لا يعد ويبقى على الصفر .... فما السبب ؟

وهذا الكود مع الدائرة :
http://www.gulfup.com/?V8ZdSI

>>>>>>>>>>>>>>>>
وعندي سؤال اخر وهو : كيف اجعل الدائرة تعد فقط اذا ضغط الزر لمدة دقيقة او لاي وقت محدد ؟ يعني اذا شخص نقر الزر بسرعة فلا يعد الا اذا بقى ضاغط لمدة طويلة بمقدار دقيقة تقريبا....كيف ؟


سلام عليكم
عندي بعض ملاحظات
1- اذا كنت تتعامل مع سويج فلابد ان تجعله اما 0 او 1 بمعنى انت وصلت طرف سويج الى مصدر لابد من تربط نهاية سويج الى الارضي عبر مقاومة 10 كيلو بحيث يوصل الى مايكرو 0 فولت في وضع عادي وعندما تضغط يصل الية 5 فولت

2- لابد ان تضيف الامر CMCON=7; في بداية البرنامج لان بورت A ليس في وضع ديجتل اي انه يتعامل comparators لذا عليك كتابة الامر CMCON=7 لغرض جعل
بورت A ديجتل

3- انت تعرف في سفن سكمنت ان اقصى رقم هو 9 ولكن لما تزيد x بواحد راح يصبح 10 وهو لايظهر على سفن سكمنت
وحلها بسيط تضع شرط اذا x اكبر من او تساوي 9 خلي بورت b نفسها عند قيمة 9

كود:
void main()
{
int x; x=0;
CMCON=7;
trisb=0;
trisa=1; porta=0;

loop:

//dp- c=1 -D- e=3 -g- f=5 -a-b=7
if (x==0)
{ portb=0xEE;}
if (x==1)
{ portb=0b10000010;}
else if (x==2)
{ portb=0b11011100;}
else if (x==3)
{ portb=0b11010110;}
else if (x==4)
{ portb=0b10110010;}
else if (x==5)
{ portb=0b01110110;}
else if (x==6)
{ portb=0b01111110;}
else if (x==7)
{ portb=0b11000010;}
else if (x==8)
{ portb=0b11111110;}
if (x>=9)
{ portb=0b11110110;}


//while(porta.f0==1)
if( porta.f0==1)
{
delay_ms(600);
//if( porta.f0==1)
x++;

}
goto loop;

}
******************************************
بالنسبة لسؤالك الثاني تم أستخدام تايمر 0 اي بتفعيل الانتربت
وهنا عند ضغط على سويج تضع هذا الامر
كود:
if( porta.f0==1)
{
delay_ms(20);
tmr0=0;
while( porta.f0==1);
if( time > 1000)x++;

}
طبعا هنا ماذا فعلت اخبرته اذا تم ضغط على سويج انتظر فتره زمنية للتخلص من الاضظرابات في سويج bounce وبعدها يدخل في لوب مستمر ومعناها هنا طلما انت ضاغط على سويج لاتفعل شي وفي هذا لحظة تايمر 0 يحسب زمن بعدها عند رفع ضغطة من سويج نختبر هل زمن وصل الى قيمة مطلوبه او لا اذا كان نعم زيد x
واذا لا تفعل شي

haidar ayad
10-18-2013, 09:12 PM
رحم الله والديك والله يرزقك الجنة .... فقط وضعت ال CMCON=7; واشتغل معي على الواقع جيدا .... وانا كنت واضع اذا يصل اكثر من تسعة يظهر الحرف H

.............
اما بالنسبة لجواب حضرتك على السؤال الثاني فعندي سؤال :
ما الفرق بين كودك واذا وضعت هكذا :
if( porta.f0==1)
{
delay_ms(1000);

x++;

}
؟؟؟؟؟؟؟؟؟؟