برنامه نويسی به زبان Basic برای ميکروکنترلرهای PIC
قسمت اول
ميتوان برنامه ميکروکنترلر ها را با زبان های مختلف چون زبان اسمبلی , basic و c نوشت.
برنامه نويسی به زبان Basic برای ميکروکنترلرهای PIC ساده تر از برنامه نويسی به زبان اسمبلی است اگرچه
تعداد دستورات زبان اسمبلی ميکروکنترلر PIC کمتر از بيسيک است.
کامپايلر های مختلفی را برای اين منظور می توان يافت. اين کامپايلر ها تنها در چند دستور با هم متفاوتند لذا بهتر
است که فقط با يک نوع از آنها کار کرد.
کامپايلری که پيشنهاد می کنم و درباره آن توضيح می دهم، کامپايلر و شبيه ساز ميکروکنترلر PIC يعنی
IDE Simulator PIC می باشد که می توان جديد ترين نسخه آن را از وب سايت oshonsoft
دانلود کرد (نسخه رجيسترشده اين نرم افزار در بیشتر سايت ها موجود می باشد.).
در 3 قسمت دستورات اين کامپايلر شرح داده می شود. هيچ فرقی نمی کند که دستورات را با حروف کوچک
بنويسيد يا بزرگ . کامپايلر اين نرم افزار دستورات را تشخيص می دهد و آن ها را به رنگ آبی نمايش می دهد.
برای اينکه بتوانيد در اين نرم افزار به زبان بيسيک برنامه نويسی نمائيد ابتدا برنامه را باز کنيد و روی منوی
TOOLS رفته و سپس Compiler Basic را انتخاب نمائيد.
دستورات:
يک بيت يا صفر است يا يک ، يک بايت byte از 8 بيت تشکيل می شود و يک word) کلمه) از 2 بايت تشکيل
می شود.
اين دستور را می توان در هر جای برنامه استفاده نمود منتها قبل از استفاده از متغير.
تعداد متغيرهايی که می توان به عنوان word,byte,bit در برنامه تعريف نمود بستگی به حافظه RAM
ميکروکنترلر دارد.
به عنوان مثال در ميکروکنترلر 16, PIC F8416متغيربيت , 52 متغير بايت و 25 متغير کلمه می توان به
طور مجزا تعريف کرد.
شايد ندانيد که ميکروی PIC شما چند متغير بايت يا کلمه دارد . می توانيد به ديتا شيت آن مراجعه کنيد . البته بايد
بدانيد که دانستن اين موضوع چندان اهميتی ندارد و در برنامه نويسی به مشکلی بر نخواهيد خورد.
فرم کلی دستور DIM به صورت زير است:
دسترسی داشت. که BIT شماره بيت مورد نظر است که می تواند از 0 تا 7 باشد.
مثال:
دستور فوق عدد صفر را به چهارمين بيت از متغير name اختصاص می دهد.
مثلا با دستور (1.PORTA (می توان به دومين بيت پورت A دست يافت و يا با دستور (INTF.INTCON (
می توان به بيت INTF ثبات INTCON دست يافت.
آن دسترسی داشت.
که HB با ارزشترين بايت است و LB کم ارزش ترين بايت.
است:
خاص , نام های ديگری که در برنامه معنی دار تر هستند اطلاق کردوسپس به جای نام آن متغير , از نام
سمبوليک آن استفاده می شود.
فرم کلی اين دستور به صورت زير است:
.را در آن ذخيره می سازد
تواند پايه خاصی را تبديل به خروجی می کند و آن را در حال 1 منطقی قرار می دهد. فرم کلی اين دستور به
صورت زير است:
تواند پايه خاصی را تبديل به خروجی می کند و آن را در حالت 0 منطقی قرار می دهد. فرم کلی اين دستور به
صورت زير است:
بوده آن را 1 می کند و بالعکس. همچنين اين دستور می توانداين دستور پايه خاصی را معکوس می سازد ( 1 را
به 0 و 0 را به 1 تبديل می کند) پايه مشخص شده به طور خودکار به يک پايه خروجی تبديل می شود. فرم کلی
اين دستور به صورت زير است:
اگر بخواهيم عددی را در مبنای هگز نشان دهيم ، يا در سمت راست عدد ، علامت H قرار می دهيم و يا در سمت
چپ آن 0x قرار می دهيم مانند (0x55 (يا ( 55H , (يعنی عدد 55 در مبنای هگز.
اگر بخواهيم عددی را در مبنای دو (باينری) نشان دهيم يا در سمت راست آن عدد علامت B قرار می دهيم و يا
در سمت چپ آن علامت % قرار می دهيم مانند (00011011 %)يا (000110011B) .
يابد:
مثال:
آدرس آن در متغير Address ذخيره شده است را خواند. اطلاعات موجود در اين آدرس در متغير Var که از
نوع بايت است کپی می شود.
مقدار حافظه داده EEPROM تراشه 256 ، 16F876 PIC بايت است که از آدرس 00H شروع می شود و به
0FFH ختم می شود.
می توان آدرس حافظه EEPROM را در دستور فوق در مبنای هگز و يا دسيمال و يا باينری نوشت و يا به طور
غير مستقيم اين آدرس را با استفاده از يک متغير مشخص نمود:
ترتيب درون متغيرهای C ,B می ريزد.
شده است, می نويسد:
.می ريزد PIC
با اين دستور برنامه به برچسب Label پرش می کند. اين برچسب در واقع يک زير برنامه ( سابروتين) است. در
انتهای زير برنامه بايد دستور RETURN باشد تا برنامه به عبارتی که بعد از GOSUB قرار دارد برگردد.
مثالی از اين دستور در انتهای اين قسمت آورده شده.
THEN می رود در غير اينصورت به عبارت بعد از ELSE می رود و سپس دستور شرطی با IF END به
اتمام می رسد.مثال:
می کند در غير ايصورت برنامه به عبارت بعد از اين دستور می رود. اين دستور نيازی به IF END ندارد.
نکته:
اگر تمام بيت های ثبات های TRISD,TRISC,TRISB,TRISA صفرباشند پورت مربوط به آن ثبات به
عنوان خروجی انتخاب می شود و اگر مقدار آنها 1 باشد پورت مربوط به آن ثبات به عنوان ورودی شناخته می
شود.
به عبارت ديگر با مقدار دهی بيت های ثبات های ياد شده می توان پين مربوط به آن بيت را به عنوان خروجی يا
ورودی مشخص نمود. مثلا با دستور15=TRISB چهار بيت کم ارزش تر پورت B به عنوان ورودی شناخته می
شود و 4 بيت با ارزش تر به عنوان خروجی.
اما نکته ديگری که بايد رعايت شود اين است که ميکروکنترلرهای PIC که دارای 28 يا 40 پين هستند دارای
مبدل آنالوگ به ديجيتال داخلی هستند (می توانيد به ديتا شيت آن ها مراجعه کنيد) اين مبدل معمولا روی پورت A
ميکروکنترلر قرار دارد بنابراين قبل از اينکه از اين پورت استفاده کنيد بايد مشخص سازيد که اين پورت به
صورت آنالوگ است يا ديجيتال برای اين کار بايد ثبات ADCON1 مقدار دهی شود. ما در اين قسمت درباره
مبدل آنالوگ به ديجيتال داخلی اين ميکروها صحبت نمی کنيم لذا در اينجا فقط متذکر می شوم که هرگاه بخواهيم
تمام پين های پورت A به صورت ديجيتالی کار کنند بايد مقدار 7 دسيمال را درون ثبات ADCON1 ريخت.:
نکته:
اگر يک کاراکتر حرف يا عدد ميان دو گيومه قرار گيرد و به داخل متغيری ريخته شود ,در واقع کد اسکی آن
کاراکتر ريخته شده است مثلا دستور "F = "A کد اسکی حرف F را در متغير A قرار می دهد و يا دستور
"O = "PORTB کد اسکی حرف O را به پورت B ارسال می کتد.
ممکن است که در برنامه از کدهای اسمبلی استفاده شود که در اينصورت قبل از استفاده از آنها بايد از دستورزير
استفاده نمود:
1 -تمامی زير روال ها (زير برنامه ها) را بايد پس از دستور END وارد نمود.
" استفاده نمود . 2 -برای توضيحات برنامه بايد از کاراکتر ' "
:در انتها يک مثال از زيربرنامه می زنم
قسمت اول
ميتوان برنامه ميکروکنترلر ها را با زبان های مختلف چون زبان اسمبلی , basic و c نوشت.
برنامه نويسی به زبان Basic برای ميکروکنترلرهای PIC ساده تر از برنامه نويسی به زبان اسمبلی است اگرچه
تعداد دستورات زبان اسمبلی ميکروکنترلر PIC کمتر از بيسيک است.
کامپايلر های مختلفی را برای اين منظور می توان يافت. اين کامپايلر ها تنها در چند دستور با هم متفاوتند لذا بهتر
است که فقط با يک نوع از آنها کار کرد.
کامپايلری که پيشنهاد می کنم و درباره آن توضيح می دهم، کامپايلر و شبيه ساز ميکروکنترلر PIC يعنی
IDE Simulator PIC می باشد که می توان جديد ترين نسخه آن را از وب سايت oshonsoft
دانلود کرد (نسخه رجيسترشده اين نرم افزار در بیشتر سايت ها موجود می باشد.).
در 3 قسمت دستورات اين کامپايلر شرح داده می شود. هيچ فرقی نمی کند که دستورات را با حروف کوچک
بنويسيد يا بزرگ . کامپايلر اين نرم افزار دستورات را تشخيص می دهد و آن ها را به رنگ آبی نمايش می دهد.
برای اينکه بتوانيد در اين نرم افزار به زبان بيسيک برنامه نويسی نمائيد ابتدا برنامه را باز کنيد و روی منوی
TOOLS رفته و سپس Compiler Basic را انتخاب نمائيد.
دستورات:
DIM
از اين دستور برای اعلام متغير ها استفاده می شود. متغيرها (ديتا) می توانند WORD , BYTE , BIT باشند.يک بيت يا صفر است يا يک ، يک بايت byte از 8 بيت تشکيل می شود و يک word) کلمه) از 2 بايت تشکيل
می شود.
اين دستور را می توان در هر جای برنامه استفاده نمود منتها قبل از استفاده از متغير.
تعداد متغيرهايی که می توان به عنوان word,byte,bit در برنامه تعريف نمود بستگی به حافظه RAM
ميکروکنترلر دارد.
به عنوان مثال در ميکروکنترلر 16, PIC F8416متغيربيت , 52 متغير بايت و 25 متغير کلمه می توان به
طور مجزا تعريف کرد.
شايد ندانيد که ميکروی PIC شما چند متغير بايت يا کلمه دارد . می توانيد به ديتا شيت آن مراجعه کنيد . البته بايد
بدانيد که دانستن اين موضوع چندان اهميتی ندارد و در برنامه نويسی به مشکلی بر نخواهيد خورد.
فرم کلی دستور DIM به صورت زير است:
DIM varname(array) datatype
که datatype می تواند bit , byte و يا word باشد. مثال:DIM A AS BIT
DIM B AS BYTE
DIM X AS WORD
اگر بخواهيم از array استفاده کنيم مطابق مثال زير اين کار را انجام می دهيم:DIM B AS BYTE
DIM X AS WORD
DIM A(10) AS BYTE
با اين دستور 10 متغير از نوع بايت با نام های A0 تا A9 تعريف می شود.Varname.BIT
اگر متغيری به صورت بايت تعريف شده باشد می توان با استفاده از دستور فوق به تک تک بيت های آن متغيردسترسی داشت. که BIT شماره بيت مورد نظر است که می تواند از 0 تا 7 باشد.
مثال:
Dim name As Byte
name.3 = 0دستور فوق عدد صفر را به چهارمين بيت از متغير name اختصاص می دهد.
SFRname.BITname
با استفاده از دستور بالا می توان به بيت های ثبات های با منظور خاص (SFRs (دست يافت.مثلا با دستور (1.PORTA (می توان به دومين بيت پورت A دست يافت و يا با دستور (INTF.INTCON (
می توان به بيت INTF ثبات INTCON دست يافت.
Varname.HB
Varname.LB
اگر متغيری به صورت کلمه تعريف شده باشد با دستورات بالا می توان به کم ارزش ترين و با ارزش ترين بايتVarname.LB
آن دسترسی داشت.
که HB با ارزشترين بايت است و LB کم ارزش ترين بايت.
DIM A AS BYTE
DIM C AS BYTE
DIM B AS WORD
A = B.HB
B.LB = C
=
با استفاده از علامت تساوی می توان محتويات يک متغير يا ثبات را تغيير داد. فرم کلی ای دستور به صورت زيرDIM C AS BYTE
DIM B AS WORD
A = B.HB
B.LB = C
=
است:
Dataname = statement
که statement می تواند يک عدد و يا نام يک متغير باشد:PORTA.1 = 1
B = A
SYMBOL
با استفاده از اين دستور می توان به متغير ها , بيت های ثبات های با منظور خاص و يا خود ثبات های با منظورB = A
SYMBOL
خاص , نام های ديگری که در برنامه معنی دار تر هستند اطلاق کردوسپس به جای نام آن متغير , از نام
سمبوليک آن استفاده می شود.
فرم کلی اين دستور به صورت زير است:
SYMBOL name = Dataname
مثال:SYMBOL LED1 = PORTB.0
اختصاص می دهد و سپس با دستور زير مقدار يک را LED1 نام B پورت (دستور بالا به بيت صفر (اولين بيت.را در آن ذخيره می سازد
LED1 = 1
HIGH
از اين دستور نيز برای تغيير مقدار يک بيت استفاده می شود و مقدار آن را يک می کند. همچنين اين دستور میHIGH
تواند پايه خاصی را تبديل به خروجی می کند و آن را در حال 1 منطقی قرار می دهد. فرم کلی اين دستور به
صورت زير است:
HIGH Pinname
مثال:HIGH PortB.0
LOW
از اين دستور نيز برای تغيير مقدار يک بيت استفاده می شود و مقدار آن را صفر می کند.همچنين اين دستور میLOW
تواند پايه خاصی را تبديل به خروجی می کند و آن را در حالت 0 منطقی قرار می دهد. فرم کلی اين دستور به
صورت زير است:
LOW Pinname
مثال:LOW ADCON0.ADON
.را صفر می کند ADCON0 از ثبات ADON دستور فوق بيتTOGGLE
از اين دستور نيز برای تغيير مقدار يک بيت استفاده می شود و مقدار آن را معکوس می سازد يعنی اگر آن بيت 0بوده آن را 1 می کند و بالعکس. همچنين اين دستور می توانداين دستور پايه خاصی را معکوس می سازد ( 1 را
به 0 و 0 را به 1 تبديل می کند) پايه مشخص شده به طور خودکار به يک پايه خروجی تبديل می شود. فرم کلی
اين دستور به صورت زير است:
TOGGLE Pinname
مثال:TOGGLE PORTA.1
نکته:اگر بخواهيم عددی را در مبنای هگز نشان دهيم ، يا در سمت راست عدد ، علامت H قرار می دهيم و يا در سمت
چپ آن 0x قرار می دهيم مانند (0x55 (يا ( 55H , (يعنی عدد 55 در مبنای هگز.
اگر بخواهيم عددی را در مبنای دو (باينری) نشان دهيم يا در سمت راست آن عدد علامت B قرار می دهيم و يا
در سمت چپ آن علامت % قرار می دهيم مانند (00011011 %)يا (000110011B) .
GOTO
اين دستور باعث می شود که برنامه به برچسب مشخص شده پرش کند و اجرای برنامه از آن برچسب ادامه میيابد:
GOTO Label
در انتهای يک برچسب بايد علامت " : " قرار گيرد. مثال:DIM A AS WORD
A = 0
loop:
A = A + 1
GOTO loop
WAITMS delay
WAITUS delay
WAITMS تاخيری بر حسب ميلی ثانيه ايجاد می کند و WAITUS تاخيری بر حسب ميکر ثانيه ايجاد می کند.A = 0
loop:
A = A + 1
GOTO loop
WAITMS delay
WAITUS delay
مثال:
WAITMS 10
WAITUS 50
اما دستورات read و write که به EEPROM مربوط می شوند.WAITUS 50
READ
فرم کلی دستور :READ Address,Var
با اين فرمان می توان محتويات حافظه EEPROM ( حافظه EEPROM داده نه برنامه) داخلی تراشه را کهآدرس آن در متغير Address ذخيره شده است را خواند. اطلاعات موجود در اين آدرس در متغير Var که از
نوع بايت است کپی می شود.
مقدار حافظه داده EEPROM تراشه 256 ، 16F876 PIC بايت است که از آدرس 00H شروع می شود و به
0FFH ختم می شود.
می توان آدرس حافظه EEPROM را در دستور فوق در مبنای هگز و يا دسيمال و يا باينری نوشت و يا به طور
غير مستقيم اين آدرس را با استفاده از يک متغير مشخص نمود:
DIM A AS BYTE
DIM B AS BYTE
DIM C AS BYTE
A = 10
READ A, B
READ 5, C
مجموعه دستورات فوق اطلاعات آدرس های 10 هگز و 5 هگز از حافظه داده EEPROM تراشه PIC را بهDIM B AS BYTE
DIM C AS BYTE
A = 10
READ A, B
READ 5, C
ترتيب درون متغيرهای C ,B می ريزد.
WRITE
فرم کلی اين دستور به صورت زير است :WRITE Address,Value
اين دستور مقدار Value را در حافظه EEPROM داخلی تراشه که آدرس آن توسط متغير Address مشخصشده است, می نويسد:
DIM A AS BYTE
DIM B AS BYTE
A = 10
B = 14
WRITE A, B
WRITE 11, B
داخلی تراشه مجموعه دستورات فوق عدد 14 را در آدرس های 10 هگز و 11 EEPROM هگز از حافظهDIM B AS BYTE
A = 10
B = 14
WRITE A, B
WRITE 11, B
.می ريزد PIC
GOSUB
فرم کلی اين دستور : Label GOSUBبا اين دستور برنامه به برچسب Label پرش می کند. اين برچسب در واقع يک زير برنامه ( سابروتين) است. در
انتهای زير برنامه بايد دستور RETURN باشد تا برنامه به عبارتی که بعد از GOSUB قرار دارد برگردد.
مثالی از اين دستور در انتهای اين قسمت آورده شده.
IF … THEN…ELSE…END IF
اين فرمان يک آزمون مقايسه ای را انجام می دهد. اگر شرط مورد نظر برقرار بود برنامه به عبارت بعد ازTHEN می رود در غير اينصورت به عبارت بعد از ELSE می رود و سپس دستور شرطی با IF END به
اتمام می رسد.مثال:
THEN 0 = IF PORTA.0
PORTB.0 = 1
ELSE
PORTB.0 = 0
ENDIF
IF……THEN
فرم کلی اين دستور به صورت زير است:PORTB.0 = 1
ELSE
PORTB.0 = 0
ENDIF
IF……THEN
GOTO label THEN statement IF
اين فرمان نيز يک آزمون مقايسه ای انجام می دهد. اگر شرط مورنظر برقرار بود برنامه به برچسب label پرشمی کند در غير ايصورت برنامه به عبارت بعد از اين دستور می رود. اين دستور نيازی به IF END ندارد.
نکته:
اگر تمام بيت های ثبات های TRISD,TRISC,TRISB,TRISA صفرباشند پورت مربوط به آن ثبات به
عنوان خروجی انتخاب می شود و اگر مقدار آنها 1 باشد پورت مربوط به آن ثبات به عنوان ورودی شناخته می
شود.
به عبارت ديگر با مقدار دهی بيت های ثبات های ياد شده می توان پين مربوط به آن بيت را به عنوان خروجی يا
ورودی مشخص نمود. مثلا با دستور15=TRISB چهار بيت کم ارزش تر پورت B به عنوان ورودی شناخته می
شود و 4 بيت با ارزش تر به عنوان خروجی.
اما نکته ديگری که بايد رعايت شود اين است که ميکروکنترلرهای PIC که دارای 28 يا 40 پين هستند دارای
مبدل آنالوگ به ديجيتال داخلی هستند (می توانيد به ديتا شيت آن ها مراجعه کنيد) اين مبدل معمولا روی پورت A
ميکروکنترلر قرار دارد بنابراين قبل از اينکه از اين پورت استفاده کنيد بايد مشخص سازيد که اين پورت به
صورت آنالوگ است يا ديجيتال برای اين کار بايد ثبات ADCON1 مقدار دهی شود. ما در اين قسمت درباره
مبدل آنالوگ به ديجيتال داخلی اين ميکروها صحبت نمی کنيم لذا در اينجا فقط متذکر می شوم که هرگاه بخواهيم
تمام پين های پورت A به صورت ديجيتالی کار کنند بايد مقدار 7 دسيمال را درون ثبات ADCON1 ريخت.:
ADCON1 = 7
مقدار دهی به ثبات های ADCON و TRIS را در ابتدای برنامه انجام دهيد.نکته:
اگر يک کاراکتر حرف يا عدد ميان دو گيومه قرار گيرد و به داخل متغيری ريخته شود ,در واقع کد اسکی آن
کاراکتر ريخته شده است مثلا دستور "F = "A کد اسکی حرف F را در متغير A قرار می دهد و يا دستور
"O = "PORTB کد اسکی حرف O را به پورت B ارسال می کتد.
END
اين دستور اجرای برنامه را خاتمه می دهد و باعث می شود که ميکرو کنترلر در حالت کاهش توان قرار گيرد.ممکن است که در برنامه از کدهای اسمبلی استفاده شود که در اينصورت قبل از استفاده از آنها بايد از دستورزير
استفاده نمود:
ASM
مثال:ASM: NOP
ASM:LABEL1: MOVLW 0xFF
دستورات منطقی و حسابی:ASM:LABEL1: MOVLW 0xFF
NOR AND + جمع
XOR OR - تفريق
XNOR NAND * ضرب
تقسيم / معکوس (مکمل) NOT
جذر ( ) SQR
مثال:XOR OR - تفريق
XNOR NAND * ضرب
تقسيم / معکوس (مکمل) NOT
جذر ( ) SQR
X = NOT A
X = A AND B
X = A OR B
X = A XOR B
X = A NAND B
X = A NOR B
X = A NXOR B
DIM A AS WORD
A = 3600
A = SQR(A)
A = A OR B
PORTB = PORTC AND %11110000
نکته:X = A AND B
X = A OR B
X = A XOR B
X = A NAND B
X = A NOR B
X = A NXOR B
DIM A AS WORD
A = 3600
A = SQR(A)
A = A OR B
PORTB = PORTC AND %11110000
1 -تمامی زير روال ها (زير برنامه ها) را بايد پس از دستور END وارد نمود.
" استفاده نمود . 2 -برای توضيحات برنامه بايد از کاراکتر ' "
:در انتها يک مثال از زيربرنامه می زنم
SYMBOL DISPLAY = PORTB.0
HIGH DISPLAY
GOSUB getadresult
END
getadresult:
LOW DISPLAY
RETURN
HIGH DISPLAY
GOSUB getadresult
END
getadresult:
LOW DISPLAY
RETURN
آخرین ویرایش: