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

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

walid el masry
:: مهندس ::
تاريخ التسجيل: Nov 2006
المشاركات: 42
نشاط [ walid el masry ]
قوة السمعة:0
قديم 08-10-2009, 07:38 PM المشاركة 1   
افتراضي ما هي احسن طريقة اعمل كود الديلاي Twitter FaceBook Google+



بسم الله الرحمن الرحيم
بعد التحيه

منا منا لا يحتاج الديلاي في برنامجه ؟!
الديلاي جزء مهم في البرمجه و انا محتار في جزئية صغير و هي
دلوقتي في طريقتين لعمل الديلاي
الاولي من خلال زمن تنفيذ الانستراكشن instruction execution time
الثانيه من خلال تايمر انتربت timer interrupt
المشكله هنا كالاتي
الطريقه الاولي طريقة سهله خاصة للمبتدئين لكن المشكله هتظهر لما نعرف فكره عملها و هي انك تخلي الميكرو تدخل في لوب الي ان يمر زمن الديلاي و ليكن 1 ثانيه ثم تخرج منه و بالتالي اثناءفتره الديلاي هتفضل الميكرو مشغوله و لا يمكن الاستفاده منها

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

السؤال هنا ازا اكتب كود علي الطريقه الثانيه علما باني استخدم
PIC16F core assume 84 or 876 or 877 with crystal 4 mhz
assume we use TMR0
i write in assembly
افيدوني من فضلكم

اعلانات

walid el masry
:: مهندس ::
تاريخ التسجيل: Nov 2006
المشاركات: 42
نشاط [ walid el masry ]
قوة السمعة:0
قديم 08-10-2009, 07:51 PM المشاركة 2   
افتراضي


و كمساعده انا كتبت الكود اللي بيزبط الانتربت و البورتات و بعض المتغيرات
و هو كالاتي

كود:
;****************************************************************************************
    LIST P=16F876
    #INCLUDE<P16F876.INC>
    __CONFIG _CP_OFF&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC
;****************************************************************************************
    CBLOCK 0x20
TMR0_LOW    ;0X40
TMR0_MID    ;0X42
TMR0_HIGH    ;0X0F
TST
    ENDC
;****************************************************************************************
    ORG 0X00;reset vector
    GOTO initialize
;****************************************************************************************
    ORG 0X04;interrupt vector
;interrupt_subrutine
    BCF INTCON,GIE 
;****************************************************************************************
    ;bla
;bla
;bla
;****************************************************************************************
out_interrupt
    BCF INTCON,T0IF
    BSF INTCON,GIE
    RETFIE
initialize
;****************************************************************************************
;initialize_variables
    MOVLW 0X00
    MOVWF TMR0_LOW
    MOVWF TMR0_MID
    MOVWF TMR0_HIGH
;****************************************************************************************
;initialize_INTCON
;GIE: Global Interrupt Enable bit                = 1 = Enables all unmasked interrupts
;PEIE: Peripheral Interrupt Enable bit            = 0 = Disables all peripheral interrupts
;TMR0IE: TMR0 Overflow Interrupt Enable bit    = 1 = Enables the TMR0 interrupt
;INTE: RB0/INT External Interrupt Enable bit    = 0 = Disables the RB0/INT external interrupt
;RBIE: RB Port Change Interrupt Enable bit    = 0 = Disables the RB port change interrupt
;TMR0IF: TMR0 Overflow Interrupt Flag bit    = 0 = TMR0 register did not overflow
;INTF: RB0/INT External Interrupt Flag bit        = 0 = The RB0/INT external interrupt did not occur
;RBIF: RB Port Change Interrupt Flag bit        = 0 = None of the RB7:RB4 pins have changed state
    BANKSEL INTCON    ;goto OPTION_REG bank
    MOVLW B'10100000'
    MOVWF INTCON        ;load data into OPTION_REG
    BANKSEL 0            ;back to normal bank 0
;****************************************************************************************
;initialize_OPTION_REG
;RBPU:        PORTB Pull-up Enable bit            =   1   = PORTB pull-ups are disabled
;INTEDG:    Interrupt Edge Select bit         =   0   = Interrupt on falling edge of RB0/INT pin
;T0CS:         TMR0 Clock Source Select bit    =   0   = Internal instruction cycle clock (CLKOUT)
;T0SE:        TMR0 Source Edge Select bit        =   0   = Increment on low-to-high transition on RA4/T0CKI pin
;PSA:        Prescaler Assignment bit        =   1   = Prescaler is assigned to the WDT
;PS2:PS0:    Prescaler Rate Select bits        = 000 = 1 : 128 for WDT Rate
    BANKSEL OPTION_REG    ;goto OPTION_REG bank
    MOVLW B'10001000'
    MOVWF OPTION_REG    ; load data into OPTION_REG
    BANKSEL 0                ; back to normal bank 0
;****************************************************************************************
;initialize_PORTB&TMR0
    CLRF PORTB
    MOVLW 0X00
    MOVWF TRISB
    MOVWF PORTB
    MOVWF TMR0
;****************************************************************************************
main
;bla
;bla
;bla
    GOTO main
    END
ملف السورس كود مرفوع علي اي من المواقع التاليه

http://www.2shared.com/file/8304697/...ng_timer0.html

http://rapidshare.com/files/29040948...imer0.asm.html

http://www.4shared.com/file/13856474...ng_timer0.html

http://www.MegaShare.com/1511036

http://www.megaupload.com/?d=5GCU2QPP

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

الصورة الرمزية SAMI-ALG
SAMI-ALG
:: مهندس جيد ::
تاريخ التسجيل: Jul 2009
الدولة: الجزائر
المشاركات: 199
نشاط [ SAMI-ALG ]
قوة السمعة:0
قديم 08-10-2009, 11:32 PM المشاركة 3   
افتراضي


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

اليك الكود التالي

كود:
movlw 	0x85					
	movwf 	OPTION_REG			;Load MASK
			;--------------Initialize register OPTION------------------------
			;-; bit 7 (/RBPU) 	= 1 : 	PORTB pull-ups are disabled			-
			;-; bit 6 (INTEDG)	= 0 : 	Not matter "interrupt on Timer0"	-
			;-; bit 5 (T0CS)	= 0 : 	Internal instruction cycle clock	-
			;-; bit 4 (T0SE)	= 0 :  	Increment on rising for RA4/T0CKI 	-
			;-; bit 3 (PSA) 	= 0 : 	Prescaler assigned to TMR0			-
			;-; bit 2 (PS2)		= 1 :  	To set prescaler on 1:64			-
			;-; bit 1 (PS1)		= 0 :	we have to set 101					-
			;-; bit 0 (PS0)		= 1 : 	Prescaler 1:64	( 256*64=16384µs )	-	
			;-N.B: 000 in prescaler equal to 256 µsecond					-
			;----------------------------------------------------------------
بعدها تقوم بوضع كونتر عند الدخول الى الانتربت كالتالي

كود:
;***********************************************INTERRUPTION*****************************************************
	ORG 	0x004				; Interruption adress
	movwf   Save  				; Save W register
	swapf	STATUS,w			; Swap status with w
	movwf	Statusave			; Save Swapped status
       	;--------------------------------------Test Iimer0 interruption---------------------
	btfss 	INTCON,T0IF			; Test TIMER0 interruption Flag
	goto 	ENDI   				; if there is flag interruption will be ended
   	bcf		INTCON,T0IF				; Clear Flag to be able to enter interruption next time
		;------------------------------------------------------------------------------------
	decfsz 	counter,f			; Wait 61 time to enter in interruption program
								; Because interruption happens on 16384µs so
	goto 	ENDI				; 16384*61 = 999424µs = 0.999 Second
	movlw	D'61'				; Program will be excuted once every 1 Second
	movwf	counter


walid el masry
:: مهندس ::
تاريخ التسجيل: Nov 2006
المشاركات: 42
نشاط [ walid el masry ]
قوة السمعة:0
قديم 09-10-2009, 11:38 AM المشاركة 4   
افتراضي


بعد التحيه
اولا احب ان اشكرك اخي العزيز علي سرعة التجاوب

ثانيا

ما هي الحكمه من ان يكون ال

prescaler on 1:64

مع العلم اننا ممكن ان تجعله 1:256

لكن مع ذلك انا جربت الكود و اضفت عليه جزء عشان اقدر اعرف اذا كان شغال و لا لا
و ضفت ليد علي بروت بي وكفلاشر و لكن لم يعمل و اليك الكود كالاتي

كود:
    ORG     0x04                ; Interruption adress
    movwf   Save                  ; Save W register
    swapf    STATUS,w            ; Swap status with w
    movwf    Statusave            ; Save Swapped status
           ;--------------------------------------Test Iimer0 interruption---------------------
    btfss     INTCON,T0IF            ; Test TIMER0 interruption Flag
    goto     ENDI                   ; if there is flag interruption will be ended
       bcf        INTCON,T0IF                ; Clear Flag to be able to enter interruption next time
        ;------------------------------------------------------------------------------------
    decfsz     counter,f            ; Wait 61 time to enter in interruption program
                                ; Because interruption happens on 16384µs so
    goto     ENDI                ; 16384*61 = 999424µs = 0.999 Second
    movlw    D'61'                ; Program will be excuted once every 1 Second
    movwf    counter

    movlw 0xff
    xorwf PORTB,W
    btfss STATUS,Z
    goto one;no
    movlw 0x00;yes
    movwf PORTB
    goto     ENDI
one
    movlw 0xff
    movwf PORTB

;****************************************************************************************
ENDI
out_interrupt
    BCF INTCON,T0IF
    BSF INTCON,GIE
    RETFIE
اخيرا ما هي الحكمه من الحفاظ علي قيم ريجيسترات ال
STATUS و W
اذا لم نقم بارجاعها لقيمها قبل حدوث الانتربت

الغرض من الديلاي هنا اني عملت برنامج يقوم بعرض الساعه و التاريخ علي شاشة
LCD
و طبعا من اساسيات التعامل مع الشاشه اننا لانقوم بارسال اي امر او داتا الا اذا تاكدنا انها ليست مشغول و ذلك بيتم بطريقتين اما بعمل ديلاي و في حالتي استخدمت 1 ميللي ثانيه او بعمل تست علي البيزي فلاج في الشاشه لكن المشكله في الحالتين قائمه لان سواء استخدمت الديلاي او التست فالزمن المستغرق لعمل التست او الديلاي سيضاف لزمن الواحد ثانيه و بالتالي ستلاحظ تاخير في الزمن يتزايد مع طول فتره التشغيل لتراكم زمن تنفيذ الثانيه مع زمن الواحد ميللي ثانيه علما باني في كل ثانيه ساعرض قيم الزمن و التاريخ و اذا كانوا بهذا الشكل
h1h2:m1m2:s1s2
d1d2/m1m2/y1y2y3y4
اذا فانا ساحتاج لكل حرف علي الشاشه هيتغير قيمته 1 مللي ثانيه لارسال الامر و 1 ميللي ثانيه اخري لارسال القيمه نفسها و بالتالي التأخير سيكون 28 ميللي ثانيه

ارجوا ان اكون استطعت توضيح الصوره بشكل جيد


و شكرا


الصورة الرمزية SAMI-ALG
SAMI-ALG
:: مهندس جيد ::
تاريخ التسجيل: Jul 2009
الدولة: الجزائر
المشاركات: 199
نشاط [ SAMI-ALG ]
قوة السمعة:0
قديم 09-10-2009, 07:56 PM المشاركة 5   
افتراضي


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

ما هي الحكمه من ان يكون ال

prescaler on 1:64

مع العلم اننا ممكن ان تجعله 1:256
اليك العملية الحساية التالية

256*64=16384s ولدينا واحد ثانية تساوي 100000 ميكروثانية نقسم هذه الاخيرة على العدد المتحصل عليه من prescaler اي

1000000/1638=61,03515625

ولك ان تجرب باقي ال prescaler وستلاحط ان هذا اقرب وقت

لكن مع ذلك انا جربت الكود و اضفت عليه جزء عشان اقدر اعرف اذا كان شغال و لا لا
و ضفت ليد علي بروت بي وكفلاشر و لكن لم يعمل
جرب هذا الملف وهو عبارة عن عداد ثواني + دقائق مع البروتس فقط هو عن طريق السفن سجمت

المهم البرنامج يبقى هو نفسه الخاص بال lcd يبقى الاختلاف في كيفية العرض

http://filaty.com/f/919/79950/WALID_EL_MASRY.rar.html

اخيرا ما هي الحكمه من الحفاظ علي قيم ريجيسترات ال
STATUS و W
اذا لم نقم بارجاعها لقيمها قبل حدوث الانتربت
iعندك مثلا قيمة معينة موجود في w وتحتاجها في البرنامج العادي لو ما نعمل حفظ تضيع هذه القيمة اثناء استخدام ال w في الانتربت

ونفس الكلام بالنسبة لل status لدينا اربع بيتات ااساسية فيه وهي c ,z,rp0 ,rp1 وبالخصوص ال c و z لذالك نقوم بحفظها قبل الدخول للعملية ثم اعادة عند الخروج من الانتربت

هذا وان شاء الله اكون وفقت في الشرح ولو بالشيء القليل

ودمت في رعاية الله وحفظه


walid el masry
:: مهندس ::
تاريخ التسجيل: Nov 2006
المشاركات: 42
نشاط [ walid el masry ]
قوة السمعة:0
قديم 10-10-2009, 04:31 PM المشاركة 6   
افتراضي


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

عند عمل بلد للبروجكت من جديد علي كمبايلر ال
mplab
فانه لا يعترف بجملة

كود:
#define  led PORTB,1
و لكني قمت باستبدال كلمه
led
في الكود بـ
PORTB,1

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

كود:
    list    p=16F84A
    #include p16F84a.inc
    ERRORLEVEL -302
    __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC
;************ Définition des constantes *********************
;#define  led PORTB,1
;************ définition les regestres temporaire************
    CBLOCK 0X0C
conter1_reg:1      ; second1
conter10_reg:1     ; second10
conter100_reg:1    ; minute1
conter1000_reg:1   ; minute10
;-------------------------------------------
status_temp:1
w_temp:1
;-------------------------------------------
cpt:1
;-------------------------------------------
cont11:1
cont22:1
cont33:1
    ENDC
; le programe principale commence a l'itéquette  INIT *******
    ORG 0X00
    GOTO INIT     
;***************** RB0 passe 0 a 1 **************************
    ORG 0X04 
;****************** programme d'interruption *****************
    movwf   w_temp      
    swapf    STATUS,w    
    movwf    status_temp    
    BTFSS   INTCON,T0IF
    GOTO    ENDI
    BCF     INTCON,T0IF
    DECF    cpt,f
    btfss   STATUS,Z
    GOTO    ENDI
    MOVLW   D'61'
    MOVWF   cpt
;*********************** seconde *************************
    BTFSS PORTB,1
    GOTO  ON
    BCF   PORTB,1
    GOTO  ENDI
ON           
    BSF   PORTB,1
ENDI
    swapf        status_temp,w    ; swap ancien status, résultat dans w
    movwf       STATUS        ; restaurer status
    swapf       w_temp,f    ; Inversion L et H de l'ancien W   
    swapf       w_temp,w      
    RETFIE     
;***************** programme d'INIT **************************
INIT 
    BSF     STATUS,RP0
    MOVLW   B'00000000' 
    MOVWF   TRISB      ; portb en sortie
    MOVLW   B'00000'
    MOVWF   TRISA      ; porta en sortie
;-------------------------------------------
    movlw    0x85  ; interruption sur timer0  
    movwf    OPTION_REG
;RBPU        =1=     PORTB pull-ups are disabled
;INTEDG    =0=     Interrupt on falling edge of RB0/INT pin
;T0CS        =0=     Internal instruction cycle clock (CLKOUT)
;T0SE        =0=     Increment on low-to-high transition on RA4/T0CKI pin
;PSA        =0=     Prescaler is assigned to the Timer0 module
;PS2:PS0    =101=    1 : 64 for TMR0 Rate
;-------------------------------------------
    movlw    0xA0
    movwf    INTCON
;GIE    =1=     Enables all unmasked interrupts
;PEIE    =0=     Disables all peripheral interrupts
;TMR0IE    =1=     Enables the TMR0 interrupt
;INTE    =0=     Disables the RB0/INT external interrupt
;RBIE    =0=     Disables the RB port change interrupt
;TMR0IF    =1=     TMR0 register has overflowed (must be cleared in software)
;INTF    =0=     The RB0/INT external interrupt did not occur
;RBIF    =0=     None of the RB7:RB4 pins have changed state
;-------------------------------------------
    BCF     STATUS,RP0
    CLRF    PORTB
    CLRF    PORTA
;-------------------------------------------
    MOVLW   D'61'
    MOVWF   cpt 
;************************ programe princcipal ********************           
START
    SLEEP  
    ;goto START
    END


التعديل الأخير تم بواسطة : walid el masry بتاريخ 10-10-2009 الساعة 04:37 PM

الصورة الرمزية SAMI-ALG
SAMI-ALG
:: مهندس جيد ::
تاريخ التسجيل: Jul 2009
الدولة: الجزائر
المشاركات: 199
نشاط [ SAMI-ALG ]
قوة السمعة:0
قديم 10-10-2009, 04:48 PM المشاركة 7   
افتراضي


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

عذرا قد اخطات في رفع الملف

الملف المقصود هو هذا

http://filaty.com/f/919/14034/WALID_EL_MASRY.rar.html

ودمت في رعاية الله وحفظه


walid el masry
:: مهندس ::
تاريخ التسجيل: Nov 2006
المشاركات: 42
نشاط [ walid el masry ]
قوة السمعة:0
قديم 10-10-2009, 04:53 PM المشاركة 8   
افتراضي


لك جزيل الشكر و جاري الفحص

إضافة رد

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

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

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


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

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