09-26-2014، 04:13 PM
فصل دوم : دستورات اولیه بسکام
در اين فصل قبل از هر کاري ، اقدام به بررسي نحوه نوشتن برنامه و دستورات اوليه نموده ايم . بعد از اينکه با دستورات اوليه آشنا شديد ، نحوه کار با پورت ها وLCD کارکتري را خواهيد آموخت ، يادگيري نحوه کار با اين دو مورد شما را در درک ادامه اموزش و تست کردن مثال ها و پروژه ها ياري مي دهد .
براي درک بهتر مثال ها و پروژه ها ، آنها را در بسکام کپي کنيد و بعد از کامپايل کردن آنها ، عملکردشان را در عمل يا با نرم افزار پروتوس مشاهده کنيد ، مشاهده نحوه عملکرد دستورات ، شما را در يادگيري ياري ميدهد .
مراحل نوشتن يک برنامه جديد (بدنه يک برنامه) :
بعد از باز کردن برنامه بسکام گزينه New را از منوي File انتخاب کنيد صفحه جديدي که باز مي شود محل نوشتن برنامه مي باشد .
در زبان بيسيک هميشه اولين خط برنامه مربوط به معرفي ميکرو مي باشد:
$regfile = "micro name"
که گزينه micro neme کتابخانه ميکرو مورد استفاده را مشخص مي کند :
اگر در محل نصب بسکام دقت کرده باشين فايل هاي زيادي (در بسکام 1.11.9.8 تعداد 72 تاست) را با پسوند dat مشاهده مي کنيدکه داراي اسامي زير مي باشند
هر فايل مربوط به يک شماره ميکرو بوده و حاوي اطلاعات مورد نياز براي شناسايي ميکرو به بسکام مي باشد . شما مي توانيد با نرم افزار ويرايشگر متن مثل NotePad فايل هاي فوق رو باز کرده و اطلاعاتش رو مشاهده و حتی ویرایش کنيد .
مثال :
$regfile = "1200def.dat" 'for AT90S1200
$regfile = "2313def.dat" 'for AT90S2313
$regfile = "2323def.dat" 'for AT90S2323
$regfile = "2333def.dat" 'for AT90S2333
$regfile = "2343def.dat" 'for AT90S2343
$regfile = "4414def.dat" 'for AT90S4414
$regfile = "4433def.dat" 'for AT90S4433
$regfile = "4434def.dat" 'for AT90S4434
$regfile = "8515def.dat" 'for AT90S8515
$regfile = "8535def.dat" 'for AT90S8535
$regfile = "86rf401.dat" 'for AT86RF401
$regfile = "attiny12.dat" 'for ATtiny12
$regfile = "attiny13.dat" 'for ATtiny13
$regfile = "attiny15.dat" 'for ATtiny15
$regfile = "attiny22.dat" 'for ATtiny22
$regfile = "attiny24.dat" 'for ATtiny24
$regfile = "attiny25.dat" 'for ATtiny25
$regfile = "attiny26.dat" 'for ATtiny26
$regfile = "attiny44.dat" 'for ATtiny44
$regfile = "attiny45.dat" 'for ATtiny45
$regfile = "attiny84.dat" 'for ATtiny84
$regfile = "attiny85.dat" 'for ATtiny85
$regfile = "attiny88.dat" 'for ATtiny88
$regfile = "attiny261.dat" 'for ATtiny261
$regfile = "attiny461.dat" 'for ATtiny461
$regfile = "attiny861.dat" 'for ATtiny861
$regfile = "attiny2313.dat" 'for ATtiny2313
$regfile = "m103def.dat" 'for ATMega103
$regfile = "m1280def.dat" 'for ATMega1280
$regfile = "m128103.dat" 'for ATMega128
$regfile = "m128can.dat" 'for AT90CAN128
$regfile = "m128def.dat" 'for ATMega128
$regfile = "m161def.dat" 'for ATMEGA161
$regfile = "m162def.dat" 'for ATmega162
$regfile = "m163def.dat" 'for ATMEGA163
$regfile = "m164pdef.dat" 'for ATMEGA164P
$regfile = "m165def.dat" 'for ATMega165
$regfile = "m168def.dat" 'for ATmega168
$regfile = "m169def.dat" 'for ATmega169
$regfile = "m16def.dat" 'for ATmega16
$regfile = "m2560def.dat" 'for ATMega2560
$regfile = "m2561def.dat" 'for ATMega2561
$regfile = "m323def.dat" 'for ATMEGA323
$regfile = "m324pdef.dat" 'for ATMEGA324P
$regfile = "m325def.dat" 'for ATMEGA325
$regfile = "m329def.dat" 'for ATmega329
$regfile = "m32def.dat" 'for ATMEGA32
$regfile = "m48def.dat" 'for ATmega48
$regfile = "m406def.dat" 'for ATmega406
$regfile = "m603def.dat" 'for ATmega603
$regfile = "m640def.dat" 'for ATMega640
$regfile = "m644def.dat" 'for ATMEGA644
$regfile = "m64def.dat" 'for ATMEGA64
$regfile = "m649def.dat" 'for ATmega649
$regfile = "m645def.dat" 'for ATMEGA645
$regfile = "m8515.dat" 'for ATmega8515
$regfile = "m8535.dat" 'for ATmega8535
$regfile = "m88def.dat" 'for ATmega88
$regfile = "m8def.dat" 'for ATmega8
$regfile = "m1281def.dat" 'for ATMega1281
$regfile = "usb1287.dat" 'for AT90USB1287
$regfile = "usb162.dat" 'for AT90USB162
$regfile = "m644pdef.dat" 'for ATMEGA644P
$regfile = "m88pdef.dat" 'for ATmega88P
$regfile = "m168pdef.dat" 'for ATmega168P
$regfile = "m328pdef.dat" 'for ATmega328P
$regfile = "m1284pdef.dat" 'for ATMEGA1284P
$regfile = "usb646.dat" 'for AT90USB646
$regfile = "m32can.dat" 'for AT90CAN32
$regfile = "m32U4def.dat" 'for ATMEGA32U4
$regfile = "xm128A1def.dat" 'for ATXMega128A1
خط بعدي معرفي کريستال مي باشد :
$crystal=x
که x کريستال مورد استفاده بر حسب هرتز است .
مانند : (در اينجا کريستال 8 مگا هرتز است) .
$crystal = 8000000
اکثر AVR ها به صورت پيش فرض نوسان ساز RC داخلي 1MHz فعال است . در صورت تغيير بايد در فيوزبيت ها هم لحاظ شود . ( در بخش ضمايم نحوه کار با فيوزبيت ها موجود است )
معرفي کريستال به صورت دقيق براي زمان بندي هاي ميکرو لازم است .
در صورت تعریف اشتباه کریستال زمان بندی های میکرو تاخیر ها و ... هم عوض می شود .
فرضا اگر کریستال 1MHz داخلی استفاده شود و در برنامه 2MHz معرفی شود , تاخیرها نصف مقدار معمول طول می کشد .
توجه شود که اکثر دستورات ( همچون پورت سریال و ارتباطات دیگر - LCD و ... ) زمان پارمتر مهمی محسوب می شود و بسکام با توجه به کریستال زمان مورد نظر را ایجاد می کند و در صورت تعریف اشتباه دستور مورد اجرا نشده و یا دیتای اشتباه ارسال می کند !
شما همچنين ميتوانيد مقدار کريستال را بر يک عدد تقسيم کنيد ( اين کار براي مواردي که به يک کريستال دسترسي نداريد است می تواند مفید واقع شود )
Config Clockdiv = Constant
که Constant برابر اين مقادير است : 1 , 2 , 4 , 8 ,16 , 32 ,64 , 128 , 256.
مثال :
$regfile = "m8def.dat"
$crystal = 8000000
Config Clockdiv = 8
از اين به بعد ميکرو با فرکانس 1 مگا هرتز کار ميکند
بعد از معرفي کريستال نوبت به معرفي امکانات مي باشد (امکانات شامل تايمر ها و ADC (مبدل انالوگ به ديجتال) و ورودي يا خروجي قرار دادن پورت ها و .... مي باشد ) .
معرفي امکانات با دستور زير شروع مي شود مي باشد :
Config
مانند :
Config Lcd = 16 * 2
بعد از معرفي يا پيکر بندي امکانات جانبي نوبت به استفاده از آنها مي باشد معمولا براي استفاده از امکانات بايد آن را درون يک حلقه قرار ميدهند . ودر نهايت برنامه با end به پايان مي رسد .
پس هميشه يک برنامه در بسکام داراي قالب زير است :
معرفي ميکرو
تعيين مقدار کريستال
پيکربندي امکانات جانبي
معرفي متغير ها و.... (در صورت وجود )
شروع حلقه ( در صورت وجود )
برنامه اصلي
پايان حلقه ( در صورت وجود )
پايان برنامه
زير برنامه ها ( در صورت وجود )
در ادامه و با مثال هاي مختلف با نحوه برنامه نويسي آشنا خواهيم شد .
دستور ات مربوط به ورودي وخروجي ها :
در بسکام براي استفاده از يک پورت بايد آن را به صورت ورودي يا خروجي قرار داد :
يک پورت هنگامي به عنوان خروجي تعريف مي شود که بخواهيم از آن ولتاژ بگيريم و يک پورت هنگامي به عنوان ورودي قرار ميگيرد که بخواهيم به آن ولتاژ بدهيم . (دادن ولتاژ را به منزله کليدي که يک سر آن به 5 ولت است و گرفتن ولتاژ را به منزله LED که يک سر آن به گراند متصل است در نظر بگيريد)
براي قرار دادن يک پورت به عنوان ورودي از دستور زير استفاده ميکنيم:
Config PORTX = Input
که پورت x يکي از پورت هاي ميکرو مي باشد .
و براي قرار دادن يک پورت به عنوان خروجي از دستور زير استفاده ميکنيم :
Config PORTX = Output
که پورت x يکي از پورت هاي ميکرو مي باشد.
مانند:
Config PORTA = Output
پورت A به عنوان خروجي تعريف شده است .
Config PORTB = Input
پورت B به عنوان ورودي تعريف شده است.
همچنين شما مي توانيد يکي از پايه هاي پورت را به عنوان ورودي يا خروجي معرفي کنيد .
مانند :
Config PORTA.1 = Input
پايه شماره 1 از پورت A به عنوان ورودي تعريف شده است.
Config PORTB.7 = Input
پايه شماره 7 از پورت B به عنوان ورودي تعريف شده است .
Config PORTC.5 = Output
پايه شماره 5 از پورت C به عنوان خروجي تعريف شده است .
نکته : در صورتی که پورت یا پایه ای تعریف نشود ورودی می باشد !
دستورات مربوط به پورت ها :
Toggle :
اين دستور يک بايت يا بيت را برعکس ميکند، بايت ميتواند يک پورت يا هر چيز ديگر باشد.
Set :
اين دستور يک بيت يا بايت را يک ميکند، بيت ميتواند يک پين از پورت يا هر چيز ديگر باشد.
Reset :
اين دستور يک بيت يا بايت را صفر ميکند، بيت ميتواند يک پين از پورت يا هر چيز ديگر باشد.
Alias :
از اين دستور براي تغير نام متغير استفاده مي شود .
مانند:
Config PORTB.1 = Output
Led Alias PORTB.1
Set Led
حال شما مي توانيد در برنامه، بجاي PORTB.1 از نام LED استفاده نماييد .
Bitwait :
با اين دستور ميکرو مدام يک پين را چک مي کند ، هنگامي برنامه به خط بعدي مي رود که پايه 1 يا 0 شد ( صفر يا يک بودن در برنامه مشخص مي شود) اين دستور به فرم کلي زير است :
Bitwait X , Set/Reset
X : نام پايه است که قرار است چک شود ،مثل PINA.0 يا PINB.7 يا...
SET/RESET : شرط دستور ميتواند SET يا ريست شدن پايه مورد نظر باشد ، مثلا با دستور :
Bitwait PORTA.0 , Set
هنگامي که PORTA.0 يک شد ، دستورات ادامه اجرا مي شود .
هنگامي که PORTA.0 يک شد ، دستورات ادامه اجرا مي شود .
مثال : ( در مسير Example\1 - Bitwait موجود است .)
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTB.7 = Input
Config PORTB.6 = Output
Bitwait PINB.7 , Reset
Set PORTB.6
Bitwait PINB.7 , Set
Reset PORTB.6
End
در مثال بالا همانگونه که مشاهده مي کنيد از ميکرو مگا 16 (ATmega16) ، کليد و LED استفاده شده است . دوخط اول برنامه معرفي ميکرو و کريستال ميباشد ، ميکرو مگا 16 و کريستال 1 مگا هرتز است ( از کريستال داخلي ميکرو استفاده شده است) .
در خط سوم پورت B.7 (پايه 8 ميکرو) به عنوان ورودي تعريف شده است و کليد به آن متصل گرديده .
در خط چهارم پايه B.6 ( پايه 7 ميکرو ) به عنوان خروجي تعريف شده است و LED به آن متصل گرديده ، در خط پنجم توسط دستور Bitwait پايه B.7 چک مي شود و هنگامي که اين پايه ريست شده (به زمين متصل شد يا صفر شد) CPU ميکرو به خط بعدي ميرود ( توجه داشته باشيد که برنامه روي دستور Bitwait قفل مي شود و تا زماني که شرط (0 يا يک شدن پايه) بر قرار نباشد اين قفل شدن ادامه دارد و برنامه به خط بعدی نمی رود )
در خط بعدي يا خط ششم ، پايه B.6 يک مي شود و LED روشن مي شود ، در خط بعدي دو باره پايهB.7 چک مي شود ، اين بار شرط برعکس حالت قبل است ، يعني اگر پايه 1 شود CPU ميکرو به خط بعدي پرش ميکند و LED را خاموش ميکند.
برنامه با دستور End پايان ميابد.
وظيفه مقاومت در اينجا بالا نگه داشتن ( پول آپ ) پايه B.7 ميباشد ( سطح يک را تصحيح ميکند ، مثال را بدون مقاومت اجرا کنيد تا ... )
دستورات تاخير :
براي ايجاد تاخير در برنامه از دستور wait استفاده مي شود.
دستور wait به سه شکل زير است:
Waitus X :
اين دستور براي ايجاد تاخير ميکرو ثانيه اي مي باشد. X مقدار تاخير ميباشد که بين 1تا 65535 ميکرو ثانيه مي باشد. مانند :
Waitus 500
تاخير به مدت 500 ميکرو ثانيه .
Waitms X :
اين دستور براي ايجاد تاخير ميلي ثانيه اي مي باشد .X مقدار تاخير ميباشد که بين 1تا 65535 ميلي ثانيه مي باشد. مانند :
Waitms 720
تاخير به مدت 720 ميلي ثانيه .
Wait X :
اين دستور براي ايجاد تاخير ثانيه اي مي باشد .X مقدار تاخير ميباشد که عددي بيشتر از يک ثانيه مي باشد. مانند :
Wait 1000
تاخير به مدت 1000 ثانيه
Delay :
اين دستور در هر جا که استفاده شود يک تاخير 1ميلي ثانيه ايجاد مي شود .
توجه کنيد که هر جا دستور wait به کار رود برنامه در آنجا به اندازه زمان مورد نظر متوقف مي شود و دستورات تاخيري دقيق نبوده و در صورت استفاده از وقفه ها و فعال شدن وقفه در زمان تاخير مدت زمان اجراي برنامه وقفه هم به زمان تاخير اضافه مي شود . ( کار با وقفه ها در فصل هاي بعدي موجود است )
در تاخیر میکرو ثانیه نمی توان متغیری در نظر گرفت و فقط باید عدد وارد کرد
در اين فصل قبل از هر کاري ، اقدام به بررسي نحوه نوشتن برنامه و دستورات اوليه نموده ايم . بعد از اينکه با دستورات اوليه آشنا شديد ، نحوه کار با پورت ها وLCD کارکتري را خواهيد آموخت ، يادگيري نحوه کار با اين دو مورد شما را در درک ادامه اموزش و تست کردن مثال ها و پروژه ها ياري مي دهد .
براي درک بهتر مثال ها و پروژه ها ، آنها را در بسکام کپي کنيد و بعد از کامپايل کردن آنها ، عملکردشان را در عمل يا با نرم افزار پروتوس مشاهده کنيد ، مشاهده نحوه عملکرد دستورات ، شما را در يادگيري ياري ميدهد .
مراحل نوشتن يک برنامه جديد (بدنه يک برنامه) :
بعد از باز کردن برنامه بسکام گزينه New را از منوي File انتخاب کنيد صفحه جديدي که باز مي شود محل نوشتن برنامه مي باشد .
در زبان بيسيک هميشه اولين خط برنامه مربوط به معرفي ميکرو مي باشد:
$regfile = "micro name"
که گزينه micro neme کتابخانه ميکرو مورد استفاده را مشخص مي کند :
اگر در محل نصب بسکام دقت کرده باشين فايل هاي زيادي (در بسکام 1.11.9.8 تعداد 72 تاست) را با پسوند dat مشاهده مي کنيدکه داراي اسامي زير مي باشند
هر فايل مربوط به يک شماره ميکرو بوده و حاوي اطلاعات مورد نياز براي شناسايي ميکرو به بسکام مي باشد . شما مي توانيد با نرم افزار ويرايشگر متن مثل NotePad فايل هاي فوق رو باز کرده و اطلاعاتش رو مشاهده و حتی ویرایش کنيد .
مثال :
$regfile = "1200def.dat" 'for AT90S1200
$regfile = "2313def.dat" 'for AT90S2313
$regfile = "2323def.dat" 'for AT90S2323
$regfile = "2333def.dat" 'for AT90S2333
$regfile = "2343def.dat" 'for AT90S2343
$regfile = "4414def.dat" 'for AT90S4414
$regfile = "4433def.dat" 'for AT90S4433
$regfile = "4434def.dat" 'for AT90S4434
$regfile = "8515def.dat" 'for AT90S8515
$regfile = "8535def.dat" 'for AT90S8535
$regfile = "86rf401.dat" 'for AT86RF401
$regfile = "attiny12.dat" 'for ATtiny12
$regfile = "attiny13.dat" 'for ATtiny13
$regfile = "attiny15.dat" 'for ATtiny15
$regfile = "attiny22.dat" 'for ATtiny22
$regfile = "attiny24.dat" 'for ATtiny24
$regfile = "attiny25.dat" 'for ATtiny25
$regfile = "attiny26.dat" 'for ATtiny26
$regfile = "attiny44.dat" 'for ATtiny44
$regfile = "attiny45.dat" 'for ATtiny45
$regfile = "attiny84.dat" 'for ATtiny84
$regfile = "attiny85.dat" 'for ATtiny85
$regfile = "attiny88.dat" 'for ATtiny88
$regfile = "attiny261.dat" 'for ATtiny261
$regfile = "attiny461.dat" 'for ATtiny461
$regfile = "attiny861.dat" 'for ATtiny861
$regfile = "attiny2313.dat" 'for ATtiny2313
$regfile = "m103def.dat" 'for ATMega103
$regfile = "m1280def.dat" 'for ATMega1280
$regfile = "m128103.dat" 'for ATMega128
$regfile = "m128can.dat" 'for AT90CAN128
$regfile = "m128def.dat" 'for ATMega128
$regfile = "m161def.dat" 'for ATMEGA161
$regfile = "m162def.dat" 'for ATmega162
$regfile = "m163def.dat" 'for ATMEGA163
$regfile = "m164pdef.dat" 'for ATMEGA164P
$regfile = "m165def.dat" 'for ATMega165
$regfile = "m168def.dat" 'for ATmega168
$regfile = "m169def.dat" 'for ATmega169
$regfile = "m16def.dat" 'for ATmega16
$regfile = "m2560def.dat" 'for ATMega2560
$regfile = "m2561def.dat" 'for ATMega2561
$regfile = "m323def.dat" 'for ATMEGA323
$regfile = "m324pdef.dat" 'for ATMEGA324P
$regfile = "m325def.dat" 'for ATMEGA325
$regfile = "m329def.dat" 'for ATmega329
$regfile = "m32def.dat" 'for ATMEGA32
$regfile = "m48def.dat" 'for ATmega48
$regfile = "m406def.dat" 'for ATmega406
$regfile = "m603def.dat" 'for ATmega603
$regfile = "m640def.dat" 'for ATMega640
$regfile = "m644def.dat" 'for ATMEGA644
$regfile = "m64def.dat" 'for ATMEGA64
$regfile = "m649def.dat" 'for ATmega649
$regfile = "m645def.dat" 'for ATMEGA645
$regfile = "m8515.dat" 'for ATmega8515
$regfile = "m8535.dat" 'for ATmega8535
$regfile = "m88def.dat" 'for ATmega88
$regfile = "m8def.dat" 'for ATmega8
$regfile = "m1281def.dat" 'for ATMega1281
$regfile = "usb1287.dat" 'for AT90USB1287
$regfile = "usb162.dat" 'for AT90USB162
$regfile = "m644pdef.dat" 'for ATMEGA644P
$regfile = "m88pdef.dat" 'for ATmega88P
$regfile = "m168pdef.dat" 'for ATmega168P
$regfile = "m328pdef.dat" 'for ATmega328P
$regfile = "m1284pdef.dat" 'for ATMEGA1284P
$regfile = "usb646.dat" 'for AT90USB646
$regfile = "m32can.dat" 'for AT90CAN32
$regfile = "m32U4def.dat" 'for ATMEGA32U4
$regfile = "xm128A1def.dat" 'for ATXMega128A1
خط بعدي معرفي کريستال مي باشد :
$crystal=x
که x کريستال مورد استفاده بر حسب هرتز است .
مانند : (در اينجا کريستال 8 مگا هرتز است) .
$crystal = 8000000
اکثر AVR ها به صورت پيش فرض نوسان ساز RC داخلي 1MHz فعال است . در صورت تغيير بايد در فيوزبيت ها هم لحاظ شود . ( در بخش ضمايم نحوه کار با فيوزبيت ها موجود است )
معرفي کريستال به صورت دقيق براي زمان بندي هاي ميکرو لازم است .
در صورت تعریف اشتباه کریستال زمان بندی های میکرو تاخیر ها و ... هم عوض می شود .
فرضا اگر کریستال 1MHz داخلی استفاده شود و در برنامه 2MHz معرفی شود , تاخیرها نصف مقدار معمول طول می کشد .
توجه شود که اکثر دستورات ( همچون پورت سریال و ارتباطات دیگر - LCD و ... ) زمان پارمتر مهمی محسوب می شود و بسکام با توجه به کریستال زمان مورد نظر را ایجاد می کند و در صورت تعریف اشتباه دستور مورد اجرا نشده و یا دیتای اشتباه ارسال می کند !
شما همچنين ميتوانيد مقدار کريستال را بر يک عدد تقسيم کنيد ( اين کار براي مواردي که به يک کريستال دسترسي نداريد است می تواند مفید واقع شود )
Config Clockdiv = Constant
که Constant برابر اين مقادير است : 1 , 2 , 4 , 8 ,16 , 32 ,64 , 128 , 256.
مثال :
$regfile = "m8def.dat"
$crystal = 8000000
Config Clockdiv = 8
از اين به بعد ميکرو با فرکانس 1 مگا هرتز کار ميکند
بعد از معرفي کريستال نوبت به معرفي امکانات مي باشد (امکانات شامل تايمر ها و ADC (مبدل انالوگ به ديجتال) و ورودي يا خروجي قرار دادن پورت ها و .... مي باشد ) .
معرفي امکانات با دستور زير شروع مي شود مي باشد :
Config
مانند :
Config Lcd = 16 * 2
بعد از معرفي يا پيکر بندي امکانات جانبي نوبت به استفاده از آنها مي باشد معمولا براي استفاده از امکانات بايد آن را درون يک حلقه قرار ميدهند . ودر نهايت برنامه با end به پايان مي رسد .
پس هميشه يک برنامه در بسکام داراي قالب زير است :
معرفي ميکرو
تعيين مقدار کريستال
پيکربندي امکانات جانبي
معرفي متغير ها و.... (در صورت وجود )
شروع حلقه ( در صورت وجود )
برنامه اصلي
پايان حلقه ( در صورت وجود )
پايان برنامه
زير برنامه ها ( در صورت وجود )
در ادامه و با مثال هاي مختلف با نحوه برنامه نويسي آشنا خواهيم شد .
دستور ات مربوط به ورودي وخروجي ها :
در بسکام براي استفاده از يک پورت بايد آن را به صورت ورودي يا خروجي قرار داد :
يک پورت هنگامي به عنوان خروجي تعريف مي شود که بخواهيم از آن ولتاژ بگيريم و يک پورت هنگامي به عنوان ورودي قرار ميگيرد که بخواهيم به آن ولتاژ بدهيم . (دادن ولتاژ را به منزله کليدي که يک سر آن به 5 ولت است و گرفتن ولتاژ را به منزله LED که يک سر آن به گراند متصل است در نظر بگيريد)
براي قرار دادن يک پورت به عنوان ورودي از دستور زير استفاده ميکنيم:
Config PORTX = Input
که پورت x يکي از پورت هاي ميکرو مي باشد .
و براي قرار دادن يک پورت به عنوان خروجي از دستور زير استفاده ميکنيم :
Config PORTX = Output
که پورت x يکي از پورت هاي ميکرو مي باشد.
مانند:
Config PORTA = Output
پورت A به عنوان خروجي تعريف شده است .
Config PORTB = Input
پورت B به عنوان ورودي تعريف شده است.
همچنين شما مي توانيد يکي از پايه هاي پورت را به عنوان ورودي يا خروجي معرفي کنيد .
مانند :
Config PORTA.1 = Input
پايه شماره 1 از پورت A به عنوان ورودي تعريف شده است.
Config PORTB.7 = Input
پايه شماره 7 از پورت B به عنوان ورودي تعريف شده است .
Config PORTC.5 = Output
پايه شماره 5 از پورت C به عنوان خروجي تعريف شده است .
نکته : در صورتی که پورت یا پایه ای تعریف نشود ورودی می باشد !
دستورات مربوط به پورت ها :
Toggle :
اين دستور يک بايت يا بيت را برعکس ميکند، بايت ميتواند يک پورت يا هر چيز ديگر باشد.
Set :
اين دستور يک بيت يا بايت را يک ميکند، بيت ميتواند يک پين از پورت يا هر چيز ديگر باشد.
Reset :
اين دستور يک بيت يا بايت را صفر ميکند، بيت ميتواند يک پين از پورت يا هر چيز ديگر باشد.
Alias :
از اين دستور براي تغير نام متغير استفاده مي شود .
مانند:
Config PORTB.1 = Output
Led Alias PORTB.1
Set Led
حال شما مي توانيد در برنامه، بجاي PORTB.1 از نام LED استفاده نماييد .
Bitwait :
با اين دستور ميکرو مدام يک پين را چک مي کند ، هنگامي برنامه به خط بعدي مي رود که پايه 1 يا 0 شد ( صفر يا يک بودن در برنامه مشخص مي شود) اين دستور به فرم کلي زير است :
Bitwait X , Set/Reset
X : نام پايه است که قرار است چک شود ،مثل PINA.0 يا PINB.7 يا...
SET/RESET : شرط دستور ميتواند SET يا ريست شدن پايه مورد نظر باشد ، مثلا با دستور :
Bitwait PORTA.0 , Set
هنگامي که PORTA.0 يک شد ، دستورات ادامه اجرا مي شود .
هنگامي که PORTA.0 يک شد ، دستورات ادامه اجرا مي شود .
مثال : ( در مسير Example\1 - Bitwait موجود است .)
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTB.7 = Input
Config PORTB.6 = Output
Bitwait PINB.7 , Reset
Set PORTB.6
Bitwait PINB.7 , Set
Reset PORTB.6
End
در مثال بالا همانگونه که مشاهده مي کنيد از ميکرو مگا 16 (ATmega16) ، کليد و LED استفاده شده است . دوخط اول برنامه معرفي ميکرو و کريستال ميباشد ، ميکرو مگا 16 و کريستال 1 مگا هرتز است ( از کريستال داخلي ميکرو استفاده شده است) .
در خط سوم پورت B.7 (پايه 8 ميکرو) به عنوان ورودي تعريف شده است و کليد به آن متصل گرديده .
در خط چهارم پايه B.6 ( پايه 7 ميکرو ) به عنوان خروجي تعريف شده است و LED به آن متصل گرديده ، در خط پنجم توسط دستور Bitwait پايه B.7 چک مي شود و هنگامي که اين پايه ريست شده (به زمين متصل شد يا صفر شد) CPU ميکرو به خط بعدي ميرود ( توجه داشته باشيد که برنامه روي دستور Bitwait قفل مي شود و تا زماني که شرط (0 يا يک شدن پايه) بر قرار نباشد اين قفل شدن ادامه دارد و برنامه به خط بعدی نمی رود )
در خط بعدي يا خط ششم ، پايه B.6 يک مي شود و LED روشن مي شود ، در خط بعدي دو باره پايهB.7 چک مي شود ، اين بار شرط برعکس حالت قبل است ، يعني اگر پايه 1 شود CPU ميکرو به خط بعدي پرش ميکند و LED را خاموش ميکند.
برنامه با دستور End پايان ميابد.
وظيفه مقاومت در اينجا بالا نگه داشتن ( پول آپ ) پايه B.7 ميباشد ( سطح يک را تصحيح ميکند ، مثال را بدون مقاومت اجرا کنيد تا ... )
دستورات تاخير :
براي ايجاد تاخير در برنامه از دستور wait استفاده مي شود.
دستور wait به سه شکل زير است:
Waitus X :
اين دستور براي ايجاد تاخير ميکرو ثانيه اي مي باشد. X مقدار تاخير ميباشد که بين 1تا 65535 ميکرو ثانيه مي باشد. مانند :
Waitus 500
تاخير به مدت 500 ميکرو ثانيه .
Waitms X :
اين دستور براي ايجاد تاخير ميلي ثانيه اي مي باشد .X مقدار تاخير ميباشد که بين 1تا 65535 ميلي ثانيه مي باشد. مانند :
Waitms 720
تاخير به مدت 720 ميلي ثانيه .
Wait X :
اين دستور براي ايجاد تاخير ثانيه اي مي باشد .X مقدار تاخير ميباشد که عددي بيشتر از يک ثانيه مي باشد. مانند :
Wait 1000
تاخير به مدت 1000 ثانيه
Delay :
اين دستور در هر جا که استفاده شود يک تاخير 1ميلي ثانيه ايجاد مي شود .
توجه کنيد که هر جا دستور wait به کار رود برنامه در آنجا به اندازه زمان مورد نظر متوقف مي شود و دستورات تاخيري دقيق نبوده و در صورت استفاده از وقفه ها و فعال شدن وقفه در زمان تاخير مدت زمان اجراي برنامه وقفه هم به زمان تاخير اضافه مي شود . ( کار با وقفه ها در فصل هاي بعدي موجود است )
در تاخیر میکرو ثانیه نمی توان متغیری در نظر گرفت و فقط باید عدد وارد کرد