الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

delay

مغلق
بدأه white soul في 22 مارس 2006 · 19 رد · 1,976 مشاهدة · في الميكروكنترولر (المتحكم) و الدوائر الرقمية و المنطقية
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

انا مبتدئة بالpic وبدي اسأل عن ال delay

4mhz crystal clock

هل هدا يعني انو التعليمة الواحدة تنفذ بزمن 1/4 = 0.25*10^-6 sec

طيب اذا بدي delay 10 ms يعني لازم 4000 تعليمة ؟؟؟؟

decfsz كم دورة تاخد (2) او وحدة بس واذا 2 هل يختلف اذا عملت skip أو لأ ؟؟؟؟

فاهمة صح ولا خطأ ؟ :(

سلام

:)

TenMs


	nop  ;One cycle
	movlw	TenMsH	;Initialize COUNT
	movwf	COUNTH
	MOVLW	TenMsL
	movwf  COUNTL
Ten_1
	decfsz	COUNTL,F;Inner loop
	goto	Ten_1
	decfsz	COUNTH,F;Outer loop
	goto	Ten_1
	return

يعني هدا الكود عشان يعمل delay لمدة 10ms

؟؟؟؟؟؟؟

تم تعديل هذه المشاركة بواسطة white soul في 22 مارس 2006 في 21:48

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#2

4mhz crystal clock

يعني 1MHz داخل الميكرو , لأن كل دورة داخل الـ PIC تستخدم 4 نبضات من الكريستال

يعني زمن التعليه التي تأخذ دورة واحدة (4 نبضات من الكريستال) يساوي 1 ميكروثانية

يعني يمكن تنفيذ مليون دورة (أي مليون امر) في الثانية

اقتباس
طيب اذا بدي delay 10 ms يعني لازم 4000 تعليمة ؟؟؟؟

10ms = 10,000us

توجد تعليمات تأخذ دورة واحدة , وتعليمات تأخذ دورتان , وتعليمات تتوقف عل الحالة يعني احيانا تأخذ دورة واحيانا دورتين حسب شرط

بالنظر في الداتا شيت يمكن معرفة ما تستغرقه كل تعليمه من دورات

اقتباس
decfsz كم دورة تاخد (2) او وحدة بس واذا 2 هل يختلف اذا عملت skip أو لأ ؟؟؟؟

طالما لم يحدث skip فان هذه التعليمه تأخذ دورة واحدة فقط , ولكن في حالة skip فانها تأخذ دورتين

	call  TenMs
....
....

TenMs
	movlw 100; 1
	movwf COUNTH; 1
Ten_1	MOVLW 32; 1
	movwf  COUNTL; 1
Ten_2
	decfsz COUNTL, F;Inner loop
	goto Ten_2
	decfsz COUNTH, F;Outer loop
	goto Ten_1
	return

يتم استدعاء TenMs باستخدام call

الوقت المستغرق في هذه الداله

2(call) + 2(load counth) + ((2(load countl)+ ((3*32)-1)(inner loop)+3)*100-1)(outer loop) + 2(return)

تستغرق call دورتين

عملية تحميل COUNTH تستغرق تعليمتين لكل تعليمع دورة , أي انها تستغرق دورتين

مثلها عملية تحميل COUNTL تستغرق دورتين

يتم تكرار المجموعه

	decfsz COUNTL, F;Inner loop
	goto Ten_2

31 مره , بحيث decfsz تستغرق دورة واحده لأنها لا تعمل skip , و goto تستغرق دورتين دائما , أي ان المجموعه تستغرق 3 دورات

3 * 31

في المره الاخيره يتم تنفيذ decfsz ولكن مع skip فتأخذ دورتين ولا يتم تنفيذ goto

2

= 3*32 - 1 = 95

اجمع عليهم 3 لمجموعة اللوب الخارجي , واجمع 2 الخاصه بتحميل العداد للوب الداخلي كل مره

الناتج 100

كررهم 100 مره

النتيجه النهائية

(3*32+ 4)*100 + 5 = 10,005 ميكروثانية

تقريبا 10ms

#3

عنجد فهمت

شكرا كتير وفهمت المثال الي كتبته انت منيح طب سؤال صغير

على الكود اللي كتبته انا هو كود جاهز وينفذ 10ms delay و حاولت بالطريقة اللي علمتني اياها

كما يلي :

لtenMsL equ 250

tenMsH equ 13

ومتل الكود الي كتبته انا سابقا :

((250*3-1) + 2+1)*13-1

call 2+ 2 return+ الجمل السابقة لللوبات5

بس المجموع النهائي

9784 cycle الجواب تقريبي ام انه في خطأ في الحساب ؟؟؟

شفت بموقع بالنت نفس الكود وكان مكنوب الحل التالي

770*13+250*3-760=10000

بس ما فهمته؟؟

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#4

شوفي , على الكود اللي كاتبه المعادلة الي تستخدميها شكلها كده :

(3*L + 4)*H + 5 = delay

بالتعويض عن L = 255 , H = 13 ـحصلي على اقرب شيء للـ 10000

(3*255 + 4)*13 + 5 = 769*13 + 5 = 10002

لو تحبي تخليها 10000 تماما , نحتاج نغير في شكل المعادلة وأكيد شكل الكود , هيكون أكبر حجم طبعا

عموما هاتي الكود اللي بتتكلمي عليه يمكن في طريقه تانيه سهله

#5
;;;;;;; TenMs subroutine;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; This subroutine and its call inserts a delay of exactly ten milliseconds into
; the execution of code. 
; It assumes a 4 MHz crystal clock.
; Cycles = 770xTenMsH + 3xTenMsL - 760
;TenMH equ 13
; TenMsL equ 250


TenMs
nop;One cycle
movlw TenMsH;Initialize COUNT
movwf COUNTH
movlw TenMsL
movwf COUNTL
Ten_1
decfsz COUNTL,F;Inner loop
goto Ten_1
decfsz COUNTH,F;Outer loop
goto Ten_1
return

end

هدا هو الكود

غلبتك معي

لتنسيق الكود

تم تعديل هذه المشاركة بواسطة Asm4all في 25 مارس 2006 في 02:59

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#6

صحيح , الكود فعلا سيستغرق 10000 ميكروثانيه

بهذا الشكل :

1 - call تأخذ دورتين

2 - هذه التعليمات

nop;One cycle
movlw TenMsH;Initialize COUNT
movwf COUNTH
movlw TenMsL
movwf COUNTL

تأخذ 5 دورات

3 -

Ten_1
decfsz COUNTL,F;Inner loop
goto Ten_1

تأخذ 3 * 250 - 1 = 749 دورة كي تنتقل الى الكود التالي لها

مع العلم أن COUNTL = 0 الآن

4 -

decfsz COUNTH,F;Outer loop
goto Ten_1

تأخذ 3 دورات وتنتقل الى Ten_1

5 -

Ten_1
decfsz COUNTL,F;Inner loop
goto Ten_1

هذه المره تستغرق 256*3 - 1 = 767 دورة

يليها 3 دورات من الخطوة رقم 4 أي 770 دورة

تتكرر العملية 12 مرة

أي النتيجه

770 * 12 - 1 = 9239

6 - return تأخذ دورتين

نجمع النتيجه

2 + 5 + 749 + 3 + 9239 + 2 = 1000 دورة

#7

شكرا كتييييييير

فهمت

يا رب يجزيك بكل حرف مليون حسنة

هذه المره تستغرق 256*3 - 1 = 767 دورة

ليش 256 مش 250؟؟؟

هاي الوحيدة اللي ما فهمتها بس على كل حال انا ما كنت فاهمة ولا اشي وبفضلك فهمت كتير اشياء

thanks

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#8

كويس انك سألتي :D

في أول مره فقط كانت 250 لأننا حملناها بالقيمة 250 بهذا الكود

movlw TenMsL
movwf COUNTL

خدي بالك بقى من النفقطة دي

اقتباس
تأخذ 3 * 250 - 1 = 749 دورة كي تنتقل الى الكود التالي لها

مع العلم أن COUNTL = 0 الآن

ولن نعيد تحميلها بالقيمة 250 مره ثانيه لأننا لن نصعد مره اخرى للكود ال>ي يقوم بذلك

طيب ليه 256 ؟؟

انظري , COUNTL = 0 الان

نفذي السطر

decfsz COUNTL,F;Inner loop

الان ما هي قيمة COUNTL ؟؟؟

255

افضلي كملي الكود بقى

لغاية ما يوصل عند COUNTL = 1

وبعدين نفذي السطر نفسه

تبقى COUNTL = 0 وبكده تحصل skip

يبقى الكود اتنفذ 256 مره لأني بادئ من الصفر الى الصفر

#9

أه صح فهمت ما كانت خاطرة ببالي

مش معقول اديش فهمت

رح اضل ادعيلك من هون لحتى................................................................أخر عمري

الله يجزيك الخير ويوفقك يا رب

:lol:

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#10
white soul كتب:
انا مبتدئة بالpic وبدي اسأل عن ال delay

4mhz crystal clock

هل هدا يعني انو التعليمة الواحدة تنفذ بزمن 1/4 = 0.25*10^-6 sec

طيب اذا بدي delay 10 ms  يعني لازم 4000 تعليمة ؟؟؟؟T

السؤال الذى يجب ان يمر عليه كل واحد !

اتمنى لك التوفيق! :)

Moore’s Law

– “Number of transistors in chips doubles every 18 
months”.
–  Every 10 years, processors are 100 times more 
powerful.

Gilder’s Law

– “Bandwidth grows at least three times faster than 
computer power”.
– Assuming bandwidth doubles every 12 months; 
every 10 years, it is 1000 times better.
#11

بس هدا السؤال بتشوف منه كم انا مبتدئة بالpic

على كل حال اتمنى انه كل مبتدأ يستفيد من هالأسئلة المبتدئة

التوفيق للجميع

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#12

انا ايضا مبتدئ

ولكننى افضل الC

Moore’s Law

– “Number of transistors in chips doubles every 18 
months”.
–  Every 10 years, processors are 100 times more 
powerful.

Gilder’s Law

– “Bandwidth grows at least three times faster than 
computer power”.
– Assuming bandwidth doubles every 12 months; 
every 10 years, it is 1000 times better.
#13

بالسي؟؟

نفس السي اللي بنكتبها ؟ عندي برنامج الميطرو سي بس لسا ما استخدمته؟

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#14

نعم تقريبا نفس السى

ولكن ما هو الميطرو سي؟

تم تعديل هذه المشاركة بواسطة NUCLEAR في 1 أبريل 2006 في 20:05

Moore’s Law

– “Number of transistors in chips doubles every 18 
months”.
–  Every 10 years, processors are 100 times more 
powerful.

Gilder’s Law

– “Bandwidth grows at least three times faster than 
computer power”.
– Assuming bandwidth doubles every 12 months; 
every 10 years, it is 1000 times better.
#15
NUCLEAR كتب:
نعم تقريبا نفس السى

ولكن ما هو الميطرو سي؟

بص على لوحة المفاتيح كويس وانت تعرف , ايه هو الميـ(ـكـ)ـرو سي

#16

خطأ مطبعي بس هو المكرو سي متل ما قال زميلنا...

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#17
Hello everyone, 
thanks for this nice article, am sorry I dont have arabic keyboard here. 
My question is very URGENT, is this equation (Cycles = 770xTenMsH + 3xTenMsL - 760) always valid  ? I mean for any required time of delay ? If no, please tell me how to find the CountH and CountL 

Thanks
#18

على ما أظن لا هي بس لهادا البرنامج بس

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#19

سلام يا اخوان

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

بس بالنهاية لا مفر من assemly الخاصة بالpic

Timer2 :

initTmr2
bcf   STATUS,RP1 ; select bank0
bcf   STATUS,RP0
MOVLW   B’01001101’;set prescalor to 4;  post scalor to 10; enable timer2
bsf   INTCON,PEIE
bsf  STATUS,RP0    ;;Select bank1
MOVLW   D’249’
MOVWF  PR2
bsf  PEIE,TMR2IE
bcf  STATUS,RP0
bsf  INTCON,GIE
return

هدا الكود بعمل delay لمدة 10 ms عرفت اكتب الكود ومفهوم كل شي منيح بس السؤال

انا داخل البرنامج الأصلي بس بعمل استدعاء له بالاسم initTmr2 call يعني كل مل بدي delay استدعيه :huh:

ام انه هدا الكود بس بعمل initialization :blink:

انا بدي اعمل delay 500 ms عن طريق timer2 وطبعا اكبر قيمة مكنة 16*256*16 وهي اقل من 500ms :lol:

لذلك رح اعمل 10ms ثم اعمل لووب خارجية 50 مرة تعد :)

في طريقة باستخدام الinterrupt بس ما فهمت وين اكتبه :wacko:

على علمي انه الinterrupt ممكن اكتبه متل اي function واخره return و استدعيه ب call

بالتالي ممكن اللووب اللي بتعد ل 50 اخليها هي ال interrupt صح ام خطا

طيب كيف اضعهم داخل بعض ال interrupt وال delay من timer2

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

#20

من الطرق اني اعمل interrupt هي الtimer2

واذا بدي استعمل الtimer2 لازم استخدم interrupt ؟؟؟؟؟؟؟؟؟؟؟؟؟

Computer Engineer

2007

"اللهم يا مثبت القلوب ثبت قلبي على دينك "

ولدتك امك باكيا والناس حولك يضحكون سرورا

فافعل لنفسك ان تكون اذا بكوا في يوم موتك ضاحكا مسرورا

هذا الموضوع مغلق.

مواضيع مشابهة