Saturday, June 5, 2010

شرح برنامج الوميض بالتفصيل

عندما تنظر لبرنامج الوميض المكتوب بلغة التجميع تظن أنه صعب جدا على الفهم و لكن ذلك ليس صحيحا . فهذا البرنامج هو البرنامج الأول و الأسهل للبرمجة المضمنة و الذى تستطيع عن طريقه فهم الكثير من أساليب البرمجة

الآن سنقوم بشرح هذا البرنامج خطوة بخطوة بالتفصيل. و تذكر أننى عندما بدأت تعلم البرمجة بلغة التجميع فهذا أول ما Comment تعلمته منها و وضعت
أمام كل خطوة من خطوات البرنامج لأعرف ما تقوم به بالضبط

لنبدأ الآن بشرح البرنامج


list p=16f84
include "p16f84.inc"

; هذه الخطوة مهمة لبرنامج المترجم ليعرف أى نوع من الشرائح المستخدمة و إضافة الملف الذى يترجم القيم المرتبطة بالمتحكم الدقيق



org 0x00
goto start

;
هذه الخطوة لا تترجم و لكنها تخبر المترجم بوضع الأوامر التالية من البرنامج فى هذا الموقع من الذاكرة
;
start label in the address 0x00 which is the reset vector of the PIC هذه العلامة فى أول موضع للذاكرة فى شريحة المتحكم الدقيق و عندها يبدأ تنفيذ البرنامج


org 0x20

start

; Again. Puts the label
start at the address 0x20 فى هذه الخطوة يتم وضع الأوامر التالية فى هذا الموقع من الذاكرة

bcf INTCON,7

; Clear the R7 bit in the register
INTCON which disables the interrupts جعل هذه البت فى هذا الموقع من الذاكرة قيمته صفر لإيقاف المقاطعة

movlw 0x00

; Put 0x00 in the W register وضع صفر فى هذا الموقع من الذاكرة


bsf STATUS,5


; Set the Bit 5 in the
status register which selects Bank 1 in the RAM جعل قيمة هذه البت واحد لاختيار الجانب (بنك1) من الذاكرة

movwf TRISB

; Copy the W register content into
TRISB register Trisb نسخ قيمة هذا الموقع من الذاكرة إلى
; [ makes PORTB output] PortB output وذلك لجعل

bcf STATUS,5

; Clear the Bit 5 in the status register which selects Bank 0 in the RAM جعل قيمة هذه البت واحد لاختيار الجانب (بنك0) من الذاكرة

again


; This is a label for the repeating part of the program هذه العلامة هى التى سيأتى عندها تشغيل البرنامج للتكرارالدائم


movlw 0x80
movwf PORTB

; Copies 0x80 [binary 1000 0000 ] in the W register وضع هذه القيمة فى هذا الموقع من الذاكرة
; Copy the W register content into
PORTB register PortB ثم إخراجها على المخرج

call delay

; This command calls the
Delay routine. لاستدعاء الجزء الخاص بالتأخير الزمنى فى البرنامج

movlw 0x00
movwf PORTB

; Copies 0x00 [binary 0000 0000 ] in the W register وضع هذه القيمة فى هذا الموقع من الذاكرة
; Copy the W register content into
PORTB register PortB ثم إخراجها على المخرج


goto again

; This label is important to keep the program running forever هذا الأمر ضرورى فى البرنامج لضمان تشغيله المستمر من البداية

delay


; This is the label for the delay routine بداية هذا الجزء من البرنامج الخاص بالتأخير الزمنى
; The delay consists of 3 nested loops هذا الجزء من البرنامج يتكون من 3 دوائر متداخلة

movlw 0x01
movwf 0x0e

; Put 0x01 in W register وضع هذه القيمة فى هذا الموقع من الذاكرة
; And copy it to the memory address 0x0e in RAM ثم نسخها فى الموقع الآخر من الذاكرة

loop3


; Label العلامة التى تميز الدائرة المتداخلة الخارجية

movlw 0xfa

movwf 0x0d

; Put 0xfa in W register وضع هذه القيمة فى هذا الموقع من الذاكرة
; And copy it to the memory address 0x0d in RAM ثم نسخها فى الموقع الآخر من الذاكرة

loop2

; Label العلامة التى تميز الدائرة المتداخلةالوسطى

movlw 0xfa
movwf 0x0c

; Put 0xfa in W register وضع هذه القيمة فى هذا الموقع من الذاكرة
; And copy it to the memory address 0x0c in RAM ثم نسخها فى الموقع الآخر من الذاكرة

loop1


; Label العلامة التى تميز الدائرة المتداخلة الداخلية

decfsz 0x0c,1

; Decrease contents of memory address 0x0c by 1 , تقليل قيمة هذا الموضع من الذاكرة بقيمة 1
; then skip the next command if the result is zero ثم تجاهل الأمر التالى إذا كانت القيمة تساوى صفر


goto loop1


; goto the outer loop الرجوع إلى الدائرة المتداخلة الأعلى

decfsz 0x0d,1


; Decrease contents of memory address 0x0d by 1 , تقليل قيمة هذا الموضع من الذاكرة بقيمة 1
; then skip the next command if the result is zero ثم تجاهل الأمر التالى إذا كانت القيمة تساوى صفر

goto loop2

; goto the outer loop الرجوع إلى الدائرة المتداخلة الأعلى

decfsz 0x0e,1

; Decrease contents of memory address 0x0e by 1 , تقليل قيمة هذا الموضع من الذاكرة بقيمة 1
; then skip the next command if the result is zero ثم تجاهل الأمر التالى إذا كانت القيمة تساوى صفر

goto loop3

; goto the outer loop الرجوع إلى الدائرة المتداخلة الأعلى

return

; Retrun from the Delay routine العودة إلى البرنامج الأصلى قبل التفرع إلى جزء التأخير الزمنى

end

; must be put at the end of the program لابد من هذا الأمر لكى يفهم برنامج المترجم أن هذه هى نهاية البرنامج

;*********************************************************************

فى نهاية هذا البرنامج نكون قد تعرفنا على أول برنامج للمتحكم الدقيق بالتفصيل . ويمكننا تعلم و كتابة المزيد من البرامج المفيدة


No comments:

Post a Comment