برای دیدن نسخه كامل اینجا را كلیك كنید : آموزش بسکام
omidvarshoei
2011/1/22, 02:18 PM
کی میخواد برنامه نویسی bascom یاد بگیره اونایی که میخوان بگن اگه تعداد زیاد باشه مرجحله مرحله دستورا با مثال براتون میگم
ولی همش بر میگرده به فعالیت خودتون به قول استادی اگه سوالی پرسیده نشه همون بهتر که اصلا گفته نشه
فقط یه چیزی اگه اشنایی با کامپایلر بسکام دارین بگین چقدر
omidvarshoei
2011/1/23, 04:33 PM
مثل اینکه اینجا علاقه مند نداره
ولی من یه مقدار در مورد دستوراتش توضیج میدم
فصل اول : آشنايي مختصر با محيط بسکام
کار با نرم فزار بسکام بسيار ساده است ، کافي است کد خود را در اديتور موجود تايپ کنيد و از منوي Program گزينه ي Compile را انتخاب نماييد .
در زير به بيان برخي از ويزگي هاي اين کامپايلر پرداخته ايم :
- امکان شبيه سازي برنامه نوشته شده .
- امکان پروگرام کردن مستقيم ميکرو (بدون نياز به نرم افزار جانبي )
- داراي کليه ابزار ها و برنامه هاي مورد نياز براي کار با امکانات جانبي (برنامه هاي براي ايجاد کد LCD کاکتري و گرافيکي و رنگي ، ترمينال براي پورت سريال و...)
- اديتور قدرتمند با قابليت شناسايي دستور
- امکان ايجاد گزارش از برنامه نوشته شده .
- نمايش تصوير ميکرو کنترلر موجود در برنامه .
- و....
در اين فصل قصد نداريم تا با توضيحات اضافه شما را خسته کنيم ، به همين دليل فقط موارد اصلي را بررسي نموده و موارد ديگر را به ضمائم انتقال داده ايم . در صورتي که مايليد از شبيه ساز نرمِ افزار استفاده کنيد ، بعد از خواندن اين فصل به بخش ضمائم برويد . در صورتي که به نرم افزار قدرتمند پروتوس دسترسي داريد ، آموزش هاي پروتئوس در مسير زير را نگاه کنيد . قطعا پروتوس امکانات بيشتري را در اختيار شما ميگزارد :
\Ebook\Proteus
نحوه تهيه و نصب نرم افزار بسکام در بخش ضمائم آورده شده است .
آشنايي مختصر با محيط بسكام
File :
1- New : با زدن اين گزينه يك صفحه جديد براي نوشتن برنامه جديد باز مي شود . اين صفحه مجهز به ويرايشگر دستورات مي باشد ، يعني در صورتي كه دستوري درست وارد شود به رنگ آبي در ميايد ولي اگر دستور اشتباه باشد به رنگ معمولي (مشكي ) است (اين مورد براي تعداد كمي از دستورات اجرا نمي شود) .
2- Open : با زدن اين گزينه مي توانيد برنامه اي را كه از قبل ذخيره كرده ايد باز كنيد (برنامه ها با پسوند .BAS ذخيره ميشوند ، شما همچنين ميتوانيد برنامه خود را در داخل برنامه هاي ويرايشگر ديگر مانند Notepad بنويسيد و از اين پنجره آن را باز کنيد ).
3-Close : با انتخاب اين گزينه پنجره اي كه براي نوشتن برنامه باز شده ؛ بسته مي شود. در صورتي که شما صفحه برنامه را که در پنجره جديد نوشته ايد ذخيره نکرده باشيد ، از شما در مورد ذخيره کردن برنامه سوال مي شود.
4-Save و Save as : اين دو گزينه براي ذخيره كردن پروژه به كار ميروند.
5-Print Preview وPrint : اين دو گزينه براي چاپ كردن برنامه استفاده ميشوند با زدن گزينه Print Preview مي توانيد نسخه قابل چاپ را قبل از چاپ مشاهده كنيد.
6- Exit : با زدن اين گزينه برنامه بسكام به طور كامل بسته مي شود ؛ اما اگر برنامه شما ذخيره نشده باشد ؛در مورد ذخيره برنامه از شما پرسيده مي شود.
7- زير گزينه Exit : چند گزينه ديگر وجود دارد كه اين گزينه ها براي دسترسي سريع به آخرين فايل هاي كه باز بوده اند مي باشد.
Edit :
1- UndoوRedo : اين دو گزينه براي دست يابي به اخرين تغييرات انجام شده مي باشد.
2- Copyو CutوPaste : اين سه گزينه براي برداشتن يا كپي كردن قسمتي از متن به جاي ديگر ميباشد.
3- Find next وFind : اين دو گزينه براي پيدا كردن قسمتي از متن در برنامه مي باشد. نحوه كار به اين صورت است كه بعد از انتخاب گزينه Find ، پنجره جديدي باز مي شود كه بايد در قسمت Text to find متن مورد نظر را تايپ كنيد. بعد روي Ok كليك كنيد تا متن مورد نظر در برنامه انتخاب شود .
Findnext متن هاي كه در خط هاي بعدي برنامه وجود دارد پيدا مي كند .
4- Replace : با اين گزينه شما مي توانيد متني را جايگزين متن موجود در برنامه نماييد ، يعني در قسمت Text To Find متن يا کلمه مورد جستجو که بايد توسط متن يا کلمه ديگري جايگزين شود را تايپ کنيد و در قسمت Replace Wath متني را که بايد جايگزين شود تايپ مي کنيم .
5- دو گزينه بعدي براي گذاشتن علامت در خطوط مختلف و پرش به آنها مي باشد .
6- IndentBlock و UnindentBlock : اين دو گزينه متن انتخاب شده را به اندازه يك Tab به چپ يا راست منتقل ميكند .
7- Remark/Unremark Block : با اين گزينه ميتوانيد بخشي از برنامه نوشته شده را علامت گزاري کنيد .
8- insert ascii : با انتخاب اين گزينه ي پنجره اي باز مي شود که در آن کد اسکي کارکتر هاي مختلف وجود دارد ، با کليک کردن روي هر مورد ، کد مذکور به برنامه اضافه مي شود .
View :
1- Pin Layout: با انتخاب اين گزينه پنجره اي باز مي شود ، که در آن پايه هاي ميکرو مورد استفاده و شکل آن آورده شده است ، با بردن موس روي هر پايه نقش آن در زير تصوير نوشته مي شود .
2- Pdf Veiwer: با انتخاب اين گزينه شما ميتوانيد مشخصات ميکرو مورد استفاده را ببينيد .
3- Error Panel: با انتخاب اين گزينه پنجره ي خطاها باز مي شود ، اين پنجره بعد از کامپايل کردن برنامه ، در صورت و جود خطا خودکار باز مي شود .
4-Tip : با انتخاب اين گزينه ي پنجره Tip باز مي شود ، در اين پنجره نکاتي در مورد برنامه نويسي و ... وجود دارد .
Program :
1- Compile : با انتخاب اين گزينه برنامه نوشته شده به زبان ماشين ترجمه مي شود وفايل هاي از قبيل هگز و گزارش و...ساخته مي شود .اگر در اين مرحله برنامه داراي خطا باشد پنجره اي باز مي شود كه در آن خطاها نمايش داده مي شوند ؛ با كليك كردن روي هر خطا ، خط مربوط كه داراي خطا است قرمز مي شود .
2- Syntax check : با انتخاب اين گزينه برنامه از نظر غلط املايي چك مي شود (با زدن گزينه Compile ديگر نيازي به زدن اين گزينه نمي باشد).
3- Show result : با انتخاب اين گزينه پنجرهاي باز مي شود كه در آن گزارش كلي از برنامه وجود دارد.
4-Simulate : با انتخاب اين گزينه پنجره شبيه سازي باز مي شود و شما در اين پنجره كه داراي LCD و كيبرد و مبدل انالوگ به ديجتال و...ميباشد مي توانيد برنامه خود را شبيه سازي كنيد (براي دريافت اطلاعات بيشتر به ضمائم مراجعه کنيد).
5-Send To Chip : با انتخاب اين گزينه وارد محيط پروگرام كردن ميكرو مي شويد كه در قسمت ضمائم مفصلا توضيح داده شده است .
Tools و Options :
در اين دو منو ابزاري براي کار برنامه و ساير قطعات جانبي وجود دارد ، با زير منو هاي موجود در اين منوها در طول برنامه آشنا خواهيم شد .
مفهوم برخي از عبارتي که از اين به بعد ميبينيم :
1- VCC وGND : منظور از اين دو کلمه پايه هاي تغذيه مي باشد که معمولا VCC ، 5 ولت وGND صفر ولت است ، شما مي توانيد اين تغذيه را از پورت USB کامپيوتر خود بگيريد .
2- پورت (PORT) : هرميکرو داراي چندين پورت مي باشد و هر پورت داراي چندين پايه است (معمولا 8 پايه) براي مثال ميکرو مگا 32 (ATmega32) داراي 4 پورت A,B,C,D مي باشد که هر پورت 8 پايه دارد و پورت A (PORTA) از پايه 33 تا 40 ميکرو و پايه شماره 40 پين A.0 (PINA.0) و پايه 39 پين (PINA.1) A.1 ... و پايه 33 پين (PINA.7) A.7 مي باشد )براي ديدن ساير اطلاعات ميکروها به ديتاشيت آنها مراجعه کنيد) .
3- پين (PIN): به هر پايه هاي ميکرو پين نيز گفته مي شود . مثلا پين A.1 ، يعني پايه شماره يک پورت A ، که در ميکرو مگا 16 پايه شماره 39 ميباشد .
4- کريستال : ميکرو براي تنظيم زمان براي انجام کارها به يک نوسان ساز نياز دارد که به اين نوسان ساز کريستال گفته مي شود حداکثر کريستال مورد استفاده برايAVR هاي معمولي 16 مگاهرتز مي باشد . همچنين ميکرو هاي AVR داراي نوسان ساز داخلي مي باشد ،که در صورت نياز مي توانيد از آن استفاده کنيد. کريستال به دو پايه Xtal 1 و Xtal2 متصل مي شود ، اين پايه ها براي ميکرو ATmega32 پايه هاي 12 و 13 مي باشد .
5- پين هايAVR داراي چندين نقش ميباشد ، مثلا پين A.0 (PINA.0) (پايه شماره 40 ) در ATmega32 علاوه براينکه ميتواند به عنوان ورودي يا خروجي استفاده شود ميتواند به عنوان ورودي مبدل انالوگ به ديجتال استفاده گردد . شما نميتوانيد در يک زمان از دونقش يک پين يا پورت استفاده کنيد . براي فهميدن نقش ديگر پين ها به ديتاشيت آنها مراجعه نماييد .
6- رجيستر حافظه : مکان هاي از حافظه ي ميکرو ميباشد که اعداد و متغير ها در آنجا ذخيره ميشوند .
7- آدرس حافظه : براي سادگي کار با حافظه ها ، آن ها را به بخش هاي کوچکي تقسيم ميکنند ، شما ميتوانيد اين خانه ها را آدرس دهي کنيد و متغير يا ثابت هاي مورد نظر را ذخيره کنيد .
8- پروگرامر : پروگرامر دستگاهي است که کد هگز ايجاد شده توسط کامپايلر را از کامپيوتر به ميکرو منتقل ميکند ، پروگرامر ها از يک طرف به ميکرو و از طرف ديگر به يکي از پورت هاي کامپيوتر متصل ميشوند
omidvarshoei
2011/1/23, 04:35 PM
اگه احیانا علاقهمند شدین بگین یا خواستین میتونین تشکر کنین
فردا الباقی بحث براتون پست میکنم
ramos_kk77
2011/1/23, 10:28 PM
سلام عزیز.ممنون به خاطر ایده قشنگت.کار خوبیه لطفا اگه میشه به طور کامل بسکام رو آموزش بدین.من خودم تقریبا با دستوراتش آشنام برنامه هم زیاد باهاش نوشتم اما مطمئنم بازم توضیحاتتون به دردم میخوره مخصوصا اگه در مورد سخت افزارمیکرو هم توضیحاتی بدین و همینطور یه توضیح سلیس و روون در مورد فیوز بیتها اگه بدین خیلی عالیه .
ممنون و تشکر ;););)
omidvarshoei
2011/1/23, 11:19 PM
سلام عزیز.ممنون به خاطر ایده قشنگت.کار خوبیه لطفا اگه میشه به طور کامل بسکام رو آموزش بدین.من خودم تقریبا با دستوراتش آشنام برنامه هم زیاد باهاش نوشتم اما مطمئنم بازم توضیحاتتون به دردم میخوره مخصوصا اگه در مورد سخت افزارمیکرو هم توضیحاتی بدین و همینطور یه توضیح سلیس و روون در مورد فیوز بیتها اگه بدین خیلی عالیه .
ممنون و تشکر ;););)
حتما دوست عزیز من تمام سعیم میکنم که به صورت کامل وجامع توضیح میدم تمام این توضیحات تا 2 ماه اینده در کتاب آموزش بسکام که تالیف خودم میتونین تهیه کنین
omidvarshoei
2011/1/24, 12:20 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 به کار رود برنامه در آنجا به اندازه زمان مورد نظر متوقف مي شود و دستورات تاخيري دقيق نبوده و در صورت استفاده از وقفه ها و فعال شدن وقفه در زمان تاخير مدت زمان اجراي برنامه وقفه هم به زمان تاخير اضافه مي شود . ( کار با وقفه ها در فصل هاي بعدي موجود است )
در تاخیر میکرو ثانیه نمی توان متغیری در نظر گرفت و فقط باید عدد وارد کرد
omidvarshoei
2011/1/24, 12:22 PM
فردا دستورات پرش وحلقه میزارم http://www.pic4ever.com/images/chase.gif
omidvarshoei
2011/1/24, 10:26 PM
دستورات حلقه وپرش :
گاهي اوقات نياز است برنامه مدام اجرا شود يا در هنگام اجراي برنامه از يک خط به خط ديگري پرش شود.
براي اين کار از حلقه ها و دستورات پرش استفاده مي شود ، دراينجا به معرفي حلقه Do – Loop را پرداخته و بقيه حلقه ها در بخش بعدي موجود است .
شروع اين حلقه با Do و پايان آن با Loop است :
Do
برنامه
Loop
در اين حلقه ، هنگامي که CPU به دستور Loop مي رسد ، به ابتداي حلقه يا دستور DO پرش مي کند .
براي پرش از يک قسمت برنامه به قسمت ديگر مي توان از دستور Jmp يا Goto استفاده کرد (از دستورات فوق به عنوان حلقه نيز مي توان استفاده کرد) .
مانند :
Q:
برنامه نوشته شده
Jmp Q
مثال دوم :
W:
برنامه نوشته شده
Goto W
حال با توجه به توضيحات بالا برنامه يک مدار چشمک زن را با هم مي نويسيم :
(ميکرو مورد استفاده مگا 16 (ATmega16 ) و کريستال 8 مگا هرتز است و 8 عدد LED با مقاومت 330 اهم به پورت (PORTA) A متصل است)
مر حله اول معرفي ميکرو مي باشد
$regfile = "m16def.dat"
مرحله بعد معرفي کريستال مي باشد
$crystal = 1000000
(دو مرحله بالا در همه برنامه ها ثابت مي باشد(وجود دارد))
مرحله بعد قرار دادن پورت A به عنوان خروجي مي باشد (چون ما ميخواهيم از آن ولتاژ بگيريم بايد آن را به عنوان خروجي قرار دهيم)
Config PORTA = Output
مرحله بعد ايجاد يک حلقه مي باشد (در اينجا براي ايجاد حلقه مي توانيد ، از تمام موارد گفته شده در بالا استفاده کنيد)
Do
مرحله بعد روشن کردن Led ها مي باشد(ما در اينجا آنها را يک در ميان روشن ميکنيم)
Set PORTA.0
(روشن کردن LED متصل شده به پايه 40 ميکرو (PORTA.0))
Reset PORTA.1
(خاموش کردن LED متصل شده به پايه 39 ميکرو (PORTA.1))
Set PORTA.2
(روشن کردن LED متصل شده به پايه 38 ميکرو (PORTA.2))
Reset PORTA.3
(خاموش کردن LED متصل شده به پايه 37 ميکرو (PORTA.3))
Set PORTA.4
(روشن کردن LED متصل شده به پايه 36 ميکرو (PORTA.4))
Reset PORTA.5
(خاموش کردن LED متصل شده به پايه 35 ميکرو (PORTA.5))
Set PORTA.6
(روشن کردن LEDمتصل شده به پايه 34 ميکرو (PORTA.6))
Reset PORTA.7
(خاموش کردن LED متصل شده به پايه 33 ميکرو (PORTA.7))
مرحله بعد ايجاد يک تاخير زماني است
Waitms 300
(تاخير به مدت 300 ميلي ثانيه (براي اينکه روشن بودن LED ها ديده شود))
مرحله بعد برعکس کردن وضعيت پايه هاي موجود است (براي اينکه LED هاي روشن ، خاموش شود و LED هاي خا موش ، روشن شود) .
Toggle PORTA
(اين دستور همانگونه که قبلا گفته شد يک بايت را برعکس ميکند که در اينجا بايت مورد نظر 8 پايه پورت A است) .
مرحله بعد ايجاد تاخير زماني است :
Waitms 300
مرحله بعد نوشتن پايان حلقه مي باشد :
Loop
(هنگامي که ميکرو اين خط را ميخواند به خط Do پرش ميکند)
و در نهايت برنامه با دستور زير پايان مي يابد :
End
چون برنامه هیچگاه پایان نمی یاد و پیوسته دستورات موجود در حلقه تکرار می شود پس می توان از دستور فوق چشم پوشی کرد !
برنامه بالا را به دو شکل زير مي توان نوشت :
برنامه اول : (در مسير Example\2 - Flasher موجود است .)
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTA = Output
Do
Set PORTA.0
Reset PORTA.1
Set PORTA.2
Reset PORTA.3
Set PORTA.4
Reset PORTA.5
Set PORTA.6
Reset PORTA.7
Waitms 300
Toggle PORTA
Waitms 300
Loop
End
برنامه دوم : ( در مسير Example\2 - Flasher موجود است )
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTA = Output
Do
Set PORTA.1
Reset PORTA.0
Set PORTA.3
Reset PORTA.2
Set PORTA.5
Reset PORTA.4
Set PORTA.7
Reset PORTA.6
Waitms 300
Set PORTA.0
Reset PORTA.1
Set PORTA.2
Reset PORTA.3
Set PORTA.4
Reset PORTA.5
Set PORTA.6
Reset PORTA.7
Waitms 300
Loop
End
مدار به کار رفته اين برنامه در شکل مقابل مشاهده مي شود :
روش هاي ديگر هم براي نوشتن برنامه بالا وجود دارد که به عهده شما گذاشته مي شود .
LCD کاراکتري :
اين نوع LCD در چندين نوع ساخته ميشوند و داراي چند سطر و ستون مي باشند که نام گذاري آنها برمبناي سطر وستون مي باشد .
در زير نام اين LCD آورده شده است :
16*1: که داراي يک سطر و 16 ستون مي باشد.
16*1a: که داراي يک سطر و 16 ستون مي باشد و مي توان ستون هشتم به بعد آن را در خط دوم آدرس دهي کرد .
16*2: که داراي 2 سطر و 16 ستون مي باشد.
16*4 : که داراي 4 سطر و 16 ستون مي باشد .
20*2 : که داراي 2 سطر و 20 ستون مي باشد.
20*4 : که داراي 4 سطر و 20 ستون مي باشد.
40*2 : که داراي 2 سطر و 40 ستون مي باشد.
40*4: که داراي 4 سطر و40 ستون مي باشد.
تمام LCD هاي کاراکتري داراي 16 پايه مي باشد که در زير آورده شده است :
پايه شماره 1 : Vss ، اين پايه ،پايه گراند LCD است و بايد به زمين مدار وصل شود.
پايه شماره 2 : VDD اين پايه VCC، LCD است که بايد به 5 ولت وصل شود.
پايه شماره 3 : VEE اين پايه روشنايي کنتراست پيکسل هاي LCD را تعيين ميکند واتصال آن طبق مدار روبرو است :
پايه شماره 4 : Rs در LCD دو رجيستر به نام دستورالعمل وداده وجود دارد اگر RS=0 باشد LCD براي گرفتن دستورالعمل اماده مي شود در غير اين صورت براي داده . مثلا دستور CLS يک دستورالعمل است و "ANT" که بايد روي LCD نوشته شود يک داده است .
پايه شماره 5 : RW اين پايه دو وضعيت دارد ، RW=1 براي خواندن از LCD و RW=0 براي نوشتن در LCD .
پايه شماره 6 : E با اين پايه مي توان LCD را انتخاب کرد.
پايه شماره 7 : DB0 اين پايه براي گرفتن ديتا (اطلا عات) از LCD ميباشد (پايه ديتا ي صفر) .
پايه شماره 8 : DB1 اين پايه براي گرفتن ديتا (اطلا عات) از LCD ميباشد (پايه ديتا ي يک).
پايه شماره 9 : DB2 اين پايه براي گرفتن ديتا (اطلا عات) از LCD ميباشد (پايه ديتا ي دو).
پايه شماره 10 : DB3 اين پايه براي گرفتن ديتا (اطلا عات) از LCD ميباشد (پايه ديتا ي سه).
پايه شماره 11 : DB4 اين پايه براي ارسال ديتا (اطلا عات) به LCD ميباشد (پايه ديتا ي چهار).
پايه شماره 12 : DB5 اين پايه براي ارسال ديتا (اطلا عات) به LCD ميباشد (پايه ديتا ي پنج).
پايه شماره 13 : DB6 اين پايه براي ارسال ديتا (اطلا عات) به LCD ميباشد (پايه ديتا ي شش).
پايه شماره 14 : DB7 اين پايه براي ارسال ديتا (اطلا عات) به LCD ميباشد (پايه ديتا ي هفت).
پايه شماره 15 : اين پايه و پايه شماره 16 تغذيه LED پشت LCD مي باشد که به 5 ولت متصل مي شود.
پايه شماره 16 : اين پايه و پايه شماره 15 تغذيه LED پشت LCD مي باشد که به زمين متصل مي شود.
راه اندازي LCD :
LCD مي تواند از دو طريق 8 سيمه و 4 سيمه به ميکرو متصل شود.
Config Lcdbus = Constant
Constant مي تواند 4 به معناي استفاده از مد 4 سيمه يا 8 به معناي مد هشت سيمه باشد (در صورتي که اين دستور نوشته نشود ، مد 4 سيمه در نظر گرفته مي شود .)
در مد چهار سيمه فقط ميتوان روي LCD نوشت ولي در مد هشت سيمه ميتوان اطلاعاتي را که قبلا روي LCD نوشته شده است را خواند و به ميکرو ارسال کرد . به طور کلي از خطوط ديتاي 0 تا 3 براي خوانده از LCD و از خطوط 4 تا 7 براي نوشتن در LCD نوشته مي شود .
در حالت نوشتن در LCD بايد پايه RW (پايه 5) پايين نگه داشته شود (صفر شود) ودر حالت خواندن از LCD بايد پايه RW يک شود ) 5 ولت وصل شود) .
از آنجا که با وجود حافظه ميکرو و راحت شدن کار برنامه نويسي نيازي به خواندن از LCD نمي باشد ، از پايه DB0 تا DB3 استفاده نمي شود و پايه RW نيز به GND (صفر ولت) متصل مي شود .
دومين مرحله براي راه اندازي LCD معرفي کردن نام آن است :
براي اين کار بعد از معرفي ميکرو وکريستال با استفاده از دستور زير مي توان LCD را معرفي کرد:
Config Lcd = Lcdname
که Lcdname يکي از نام هاي بالا ميباشد. مثلا معرفي LCD 2*16 :
Config Lcd = 16 * 2
مرحله بعد معرفي پايه هاي از ميکرو است که LCD به آنها وصل مي شود .
مد 4 سيمه :
Config Lcdpin = Pin , Db4 = Pinx.y , Db5 = Pinx.y , Db6 = Pinx.y , Db7 = Pinx.y , Rs = Pinx.y , E = Pinx.y
x نام پورت است که يکي از پورت هاي A يا B يا C يا D يا ... مي باشد و y شماره پايه هست که از 0 تا 7 مي باشد . ( دقت شود دستور فوق در يک خط نوشه شود يا براي خط دوم از _ استفاده شود ).
براي مثال در زير LCD کاراکتري 16*2 به پورت C ((PORTC متصل است .
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PINC.0 , Db5 = PINC.1 , Db6 = PINC.2 _
, Db7 = PINC.3 , Rs = PINC.4 , E = PINC.5
در اين مثال که از ميکرو مگا16 (ATmega16) استفاده شده ، اتصال ميکرو وLCD به قرار زير است :
پايه شماره 1 : VSS اين پايه بايد به زمين مدار وصل شود .
پايه شماره 2 : VDDاين پايه بايد به 5 ولت وصل شود .
پايه شماره 3 : VEE اين پايه با يک مقاومت ( مقدار مقاومت بستگي به روشنايي مورد نظر شما دارد) به زمين وصل مي شود.
پايه شماره 4 : RS اين پايه به پورت C پين شماره 4 يا پين C.4 متصل مي شود (پايه 26) .
پايه شماره 5 :RW اين پايه به GND یا زمین متصل مي شود .
پايه شماره 6 : E اين پايه به پورت C پين شماره 5 يا پين C.5 متصل مي شود (پايه 27) .
پايه شماره 7 : DB0 اين پايه به جايي متصل نمي شود. ( مي توان آن را به زمين وصل کرد ) .
پايه شماره 8 : DB1 اين پايه به جايي متصل نمي شود. ( مي توان آن را به زمين وصل کرد ) .
پايه شماره 9 : DB2 اين پايه به جايي متصل نمي شود. ( مي توان آن را به زمين وصل کرد ) .
پايه شماره 10 : DB3 اين پايه به جايي متصل نمي شود. ( مي توان آن را به زمين وصل کرد ) .
پايه شماره 11 : DB4 اين پايه به پورت C پين شماره 0 يا پين C.0 متصل مي شود (پايه 22) .
پايه شماره 12 : DB5 اين پايه به پورت C پين شماره 1 يا پين C.1 متصل مي شود (پايه 23) .
پايه شماره 13 : DB6 اين پايه به پورت C پين شماره 2 يا پين C.2 متصل مي شود (پايه 24) .
پايه شماره 14 : DB7 اين پايه به پورت C پين شماره 3 يا پين C.3 متصل مي شود (پايه 25) .
پايه شماره 15 : اين پايه تغذيه مثبت LED پشت LCD مي باشد که به 5 ولت متصل مي شود .
پايه شماره 16 : اين پايه تغذيه زمين LED پشت LCD مي باشد که به زمين متصل مي شود .
توجه کنيد که اگر پايه VEE به زمين متصل شود پيکسل هاي LCD داراي بيشترين کنتراست و اگر به 5 ولت وصل شود داراي کمترين کنتراست مي باشند .
اتصال پايه هاي 15 و16 اختياري است . ( در پروتئوس اين پايه ها وجود ندارند )
مد 8 سيمه :
در مثال زیر پايه DB0 به پورت D.0 و پايه DB1 به پورت D.1 و ... پايه DB7 به پايه D.7 و پايه Rs به پايه C.5 و پايه E به پايه C.6 و پايه Rw به پايه C.7 متصل مي گردد ، در اين حالت يازده پايه از LCD اشغال مي شود .
Config Lcdpin = PORTD , Rs = PINC.5 , E = PINC.6 , Rw = PINC.7
دستورات LCD :
بعد از راه اندازي LCD نوبت کار کردن با آن است .
براي نوشتن روي LCD از دستور زير استفاده مي شود :
Lcd "x"
که X مي تواند هر چيز ي باشد (البته در محدوده کارکتر هاي اسکي ) .
مانند:
Lcd "A.N.T"
Lcd "1nafar"
براي پاک کردن LCD از دستور Cls استفاده مي شود .
مانند :
Lcd "DSA@GJK!?"
Wait 1
Cls
Lcd "asdfgfghk"
با دستور زير مي توان در سطرها و ستون هاي ديگر LCD نوشت.
Locate x,y
که x آدرس سطر و y آدرس ستون مي باشد .
مثال :
Locate 1 , 2
Lcd "qwert"
Locate 2 , 8
Lcd "mnbv"
توجه کنيد براي يک LCD ، مثلا 16*2 حداکثر x برابر2 و حداکثرy برابر 16 است .
البته این مدل LCD دارای حافظه 40*2 می باشد که فقط 16*2 تای اول آن نمایش داده می شود و می توان در بقیه حافظه نوشت و با دستورات انتقال متن فوق را نمایش داد .
با دستورات زير ميتوان به سطر هاي مختلف LCD پرش کرد و در آنجا متن را نوشت :
Upperline
با اين دستور به خط بالاي پرش مي شود
Lowerline
با اين دستور به خط پاييني پرش مي شود
Home
با اين دستور به سطر اول ، ستون اول پرش مي شود
Thirdline
Fourthline
با دو دستور بالا مي توان به ترتيب به خط سوم و چهارم پرش کرد (اين دستور براي LCD هاي است که 4 سطر دارند) .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = PINC.0 , Db5 = PINC.1 , Db6 = PINC.2 , Db7 = PINC.3 , Rs = PINC.4 , E = PINC.5
Lowerline
Lcd "qwert"
Thirdline
Lcd "vcxz"
Fourthline
Lcd "erff"
Wait 2
Home
Lcd "123654"
End
متن نمایش داده شده بر روی LCD در شکل بالا مشاهده می شود :
با دستور زير مي توان تعداد فضاي خالي دلخواه را بر روي LCD ايجاد کرد :
Lcd Spc(X)
تعداد X ستون خالي بوده ، و بعد از ستون X نوشتن ادامه مي یابد.
با استفاده از دستور زير ميتوانيد LCD را روشن يا خاموش کنيد:
Display On / Off
On : LCD روشن مي شود
Off : LCD خاموش مي شود.
با استفاده از دستور زير ميتوانيد کنتراست (ميزان نور (کم رنگي وپر رنگي) متن ) متن را تغيير دهيد :
Lcdcontrast x
X ميزان کنتراست است که ميتوانيد بين 0 تا 3 باشد ، به ازاي 0 کمترين کنتراست و به ازاي 3 بيشترين کنتراست مشاهده مي شود. (توجه شود فقط بعضي از LCD ها داراي قابليت فوق مي باشند)
LCD داراي يک مکان نما مي باشد که با دستور زير ميتوان آن را روشن يا خاموش يا چشمک زن يا ثابت قرارداد .
Cursor On
با اين دستور مکان نما روشن مي شود (در حالت عادي مکان نما روشن است ).
Cursor Off
با اين دستور مکان نما خاموش مي شود.
Cursor Blink
با اين دستور مکان نما چشمک مي زند .
Cursor Noblink
با اين دستور مکان نما ديگر چشمک نمي زند .
با دستور زير مي توانيد کاراکتر هاي روي lcd را به چپ يا راست شيفت دهيد.
Shiftlcd Left
اين دستور کارکترها را به اندازه يک ستون به چپ منتقل ميکند.
Shiftlcd Right
اين دستور کارکترها را به اندازه يک ستون به راست منتقل ميکند .
با دستور زير ميتوانيد مکان نما را به راست يا چپ منتقل کنيد:
Shiftcursor Left | Right
Left اين دستور مکان نما را به اندازه يک ستون به چپ منتقل مي کند .
Right اين دستور مکان نما را به اندازه يک ستون به راست منتقل مي کند.
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = PIND.2 , Db5 = PIND.3 , Db6 = PIND.4 , _
Db7 = PIND.3 , Rs = PIND.0 , E = PIND.1
Lcdcontrast 1
Locate 2 , 1
Lcd "12356"
Shiftcursor Right
Wait 1
Display Off
Wait 1
Display On
Lcdcontrast 2
Locate 4 , 1
Lcd Spc(5)
Lcd "qwer"
Shiftcursor Left
End
نمایش کارکتر دلخواه روي LCD :
Lcd هاي کاراکتري داراي يک حافظه دائم مي باشد که درون آن فقط کد ، کارکترهاي اسکي وجود دارد (کد کارکترهاي فارسي در آن وجود ندارد) . در LCD حافظه موقتي وجود دارد که در آن مي توان تا 8 کاراکتر دلخواه را قرار داد .
براي ساخت کاراکتر دلخواه مراحل زير را دنبال کنيد:
از منوي Tools گزينه Lcd Designer را انتخاب کنيد ، پنجره جديدي باز مي شود که شما مي توانيد در آن کاراکتر دلخوا ه خود را ايجاد کنيد.
بعد از ايجاد کاراکتر دلخواه روي Ok کليک کنيد ،پنجره بسته مي شود و يک خط به برنامه شما اضافه مي شود. مانند زير :
Deflcdchar ?,32,32,7,5,31,16,16,16
به جاي علامت سوال ؟ بايد يکي از اعداد 0 تا 7 گذاشته شود .
بعد از ساخت کاراکتر جديد بادستور زير مي توانيد آن را روي LCD نشان دهيد:
Lcd chr(?)
به جاي علامت سوال بايد شماره کاراکتر که يکي از اعداد 0تا 7 مي باشد گذاشته شود .
مانند:
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PIND.2 , Db5 = PIND.3 , Db6 = PIND.4 , _
Db7 = PIND.3 , Rs = PIND.0 , E = PIND.1
Deflcdchar 0 , 32 , 32 , 7 , 5 , 31 , 16 , 16 , 16
Lcd Chr(0)
End
ramos_kk77
2011/1/24, 11:11 PM
خسته نباشین آقا دستت درد نکنه:D:D:D.1سوال داشتم
توی توضیحاتتون دستور waitو همینطور حلقه do-loopرو توضیح دادین.که با اینا میشه برنامه یکledچشمک زن رو نوشت.من چند هفته پیش یه مداری میخاستم ببندم که از این دو دستور هم توبرنامه اش استفاده شده بود .قبلا البته همون سخت افزار رو با همون برنامه بسته بودم .قبل بستن سخت افزاری مدار برنامه رو در proteus هم امتحان کرده بودم اما وقتی سخت افزار کاملش دیدم سرعت تاخیرها10برابر شده یعنی اگه تو برنامه مینوشتم wait 10در عمل تاخیر یک ثانیه ایجاد میکرد.توی سگمنت هم اگه میخاستم برام اعداد 1 تا 9 روهر 1ثانیه نشون بده اگه برنامه عادی و درستشو مینوشتم 1تا 9 رو اونقدر تند نشون میداد که هیچی نمیدیدی.منظورم اینه که همون ده برابر سریع تر نشون می داد. به نظر ت تنظیمات خاصی به هم خورده بوده؟:eek::eek::eek:
omidvarshoei
2011/1/25, 02:42 PM
خسته نباشین آقا دستت درد نکنه:D:D:D.1سوال داشتم
توی توضیحاتتون دستور waitو همینطور حلقه do-loopرو توضیح دادین.که با اینا میشه برنامه یکledچشمک زن رو نوشت.من چند هفته پیش یه مداری میخاستم ببندم که از این دو دستور هم توبرنامه اش استفاده شده بود .قبلا البته همون سخت افزار رو با همون برنامه بسته بودم .قبل بستن سخت افزاری مدار برنامه رو در proteus هم امتحان کرده بودم اما وقتی سخت افزار کاملش دیدم سرعت تاخیرها10برابر شده یعنی اگه تو برنامه مینوشتم wait 10در عمل تاخیر یک ثانیه ایجاد میکرد.توی سگمنت هم اگه میخاستم برام اعداد 1 تا 9 روهر 1ثانیه نشون بده اگه برنامه عادی و درستشو مینوشتم 1تا 9 رو اونقدر تند نشون میداد که هیچی نمیدیدی.منظورم اینه که همون ده برابر سریع تر نشون می داد. به نظر ت تنظیمات خاصی به هم خورده بوده؟:eek::eek::eek:
تنظیماتی خاصی نداره که بخواد بهم بخوره شما وقتی مینویسید wait 1 براتون تو مدار سخت افزاری 1 ثانیه تاخیر ایجاد میکنه اینکه میبینید تو پروتئوس یا برنامه های دیگر کامپیوتر یه این شکل نشون میده بستگی به سرعت کامپیوتر در اون لحظه داره
بهترین برنامه برای تست کردن برنامه هایی به این شکل که میخواین جواب واقعی ازش بگیرین برنامه مطلب قسمت سیمولینکش
بازهم سوالی بود من در خدمتم
ramos_kk77
2011/1/25, 03:01 PM
مرسی از جوابتون اما مثه اینکه منظورمو بد گفتم ببینین منظورو این بود که توی برنامه مینوشتم wait 1 اما در عمل وقتی مدار رو روی برد میبستم 0.1ثانیه تاخیر ایجاد میشد.وقتی مینوشتم wait 10تاخیر 1ثانیه ای در عمل می دیدم.درنهایت تاخیرها رو ده برابر کردن و مدار رو بستم وتحویل دادم اماراستش علت اینو متوجه نشدم چی بود
omidvarshoei
2011/1/25, 03:14 PM
مرسی از جوابتون اما مثه اینکه منظورمو بد گفتم ببینین منظورو این بود که توی برنامه مینوشتم wait 1 اما در عمل وقتی مدار رو روی برد میبستم 0.1ثانیه تاخیر ایجاد میشد.وقتی مینوشتم wait 10تاخیر 1ثانیه ای در عمل می دیدم.درنهایت تاخیرها رو ده برابر کردن و مدار رو بستم وتحویل دادم اماراستش علت اینو متوجه نشدم چی بود
فیور بیتارو درست انتخاب کردین
ramos_kk77
2011/1/25, 03:41 PM
نسبت به دفعه قبل که همون برنامه ر وی همون میکرو پروگرم کردم هیچ فیوزبیتی رو تغییر ندادم
omidvarshoei
2011/1/25, 04:17 PM
نسبت به دفعه قبل که همون برنامه ر وی همون میکرو پروگرم کردم هیچ فیوزبیتی رو تغییر ندادم
با چی پروگرام میکنی
ramos_kk77
2011/1/25, 04:59 PM
با پروگرمر هاتل .از همین پروگرمر جیبی هایی که تو بازاره .جالبه فقط همون یه میکرو این مشکل رو پیدا کرد که atmega 16 هم بود دیگه با هیچ میکرویی به این مشکل نخوردم.الانم دیگه دادمش رفته.وگرنه الان به کمک راهنماییهاتون حداقل فیوزبیتاشو چک میکردم .
omidvarshoei
2011/1/25, 05:06 PM
منم با همینا پروگرام میکنم ولی تا الان چنین مشکلی نداشتم
من میگم برنامت چک کن احتمال زیاد دو تا delay poshte سر هم گذاشتی
cleopatra
2011/1/25, 10:20 PM
سلام دوست عزیز
دست گلت درد نکنه
مطالبت خیلی به دردم خورد
من تو برنامه ی LED روان مشکل دارم
یعنی برنامه ای که دارم کار نمیکنه
ممنون میشم اگه راهنماییم کنی.
ramos_kk77
2011/1/25, 10:52 PM
پس میگین احتمالا اشکال نرم افزاریه . نمیدونم ممکنه . حالا میرم بازم برنامه رو چک میکنم. مرسی بازم که وقت گذاشتین .
ramos_kk77
2011/1/26, 02:10 AM
سلام دوست عزیز
دست گلت درد نکنه
مطالبت خیلی به دردم خورد
من تو برنامه ی LED روان مشکل دارم
یعنی برنامه ای که دارم کار نمیکنه
ممنون میشم اگه راهنماییم کنی.
سلام مشکلت چیه میشه برنامه رو بذاری.یا حداقل اگه از قسمت خاصیش مشکل داری همون قسمتو بذاری؟
omidvarshoei
2011/1/26, 11:21 AM
سلام دوست عزیز
دست گلت درد نکنه
مطالبت خیلی به دردم خورد
من تو برنامه ی LED روان مشکل دارم
یعنی برنامه ای که دارم کار نمیکنه
ممنون میشم اگه راهنماییم کنی.
برنامتون بزارین تا اشکالش بگیریم
اخه اینکه بگین من تو برنامه چراغ چشمک رن مشکل دارم که نمیشه عیب یابی کرد به شکل های مختلف میشه این برنامرو نوشت
اگرم یه برنامه چشمک رن میخواین بگین تا براتون بزارم البته من میگم خودتون یه برنامه بنویسین مشکل داشتین کمکتون میکنم چون کار زیاد سختی نیست این برنامه
omidvarshoei
2011/1/26, 11:37 AM
فصل سوم : معرفي ساير دستورات بسکام
در اين فصل دستورات به 7 دسته زير تقسم شده اند :
1- اعداد و متغيير ها در بسکام
2- دستورات مربوط به کار با رشته ها
3- دستورات حلقه و پرش و شرط
4- دستورات اجرايي (اين دستورات ، دستورات خاص براي کامپايلر هستند که براي اجراي بهتر برنامه استفاده ميشوند)
5- زير برنامه ها و فراخواني توابع
6- توابع رياضي و محاسباتي
7- توابع تبديل 55
کدها و متغيير ها به يکديگر
در اين فصل نيازي به حفظ کردن دستورات نيست ، براي يادگيري آنها کافيست آنها را اجرا کنيد و چند بار ورودي را تغيير دهيد .
در ادامه و در بخش راه اندازي سخت افزار هاي جانبي ، با کاربرد هاي عملي اين دستورات بيشتر آشنا خواهيم شد .
اعداد و متغيير ها در بسکام :
دستور زير معرفی يک متغير را نشان ميدهد . با اين دستور مي توانيد متغيرهايي که در برنامه به کار برده مي شوند تعريف کنيد .
Dim X As Data Type
X نام متغيري است، که در برنامه بکار برده مي شود و Data Type نوع داده است که مي تواند طبق موارد STRING يا WORD ياLONG يا INTEGER يا BYTEيا BITيا SINGLE يا Double باشد . ( Xهمچنين ميتواند XRAM يا SRAM يا ERAM يا OVERLAY يا location باشد که همگي متغير هاي از انواع حافظه ها هستند باشد ، که در بخشهاي بعدي توضيح داده مي شود.)
در صورت استفاده از متغير STRING بيشترين طول آن نيز بايد نوشته شود .
Bit :
اين متغيير ميتواند صفر يا يک باشد .
Byte :
اين متغيير مي تواند از0 تا 255 تغيير کند و فقط شامل اعداد صحيح مثبت مي شود .
Word :
اين متغيير مي تواند از0 ت65535 تغيير کند و فقط شامل اعداد صحيح مثبت مي شود.
Integer :
اين متغيير مي تواند از32767- تا 32767+ تغيير کند و فقط شامل اعداد صحيح مثبت و منفي مي شود.
Long :
اين متغيير مي تواند از214783648- تا 214783647+ تغيير کند و فقط شامل اعداد صحيح مثبت و منفي مي شود.
Single :
اين متغيير ميتواند از 45-^10×5/1 تا 38^10×4/3 تغيير کند و فقط شامل اعداد صحيح واعشاري صحيح مثبت و منفي مي شود.
Double :
اين متغير مي تواند از324-^10×5 تا 308^10×7/1 تغيير کند و فقط شامل اعداد صحيح واعشاري مثبت و منفي مي شود.
String :
اين متغيير مي تواند از1 تا 255 بايت تغيير کند تغيير کند و براي حروف وعلائم استفاده مي شود. در صورت استفاده از متغير String بيشترين طول آن نيز بايد نوشته شود .
مثال :
Dim B As Bit
Dim A As Byte
Dim K As Integer
Dim Micro As Word
Dim Hasan As String * 16
شما همچنين ميتوانيد يک متغير آرايه اي (با يک نام چندين متغيير) بسازيد .
مانند :
Dim A(10) As Word
در اين حالت شما ميتوانيد از 10 متغير A یعنی A(1) تا A(10) در برنامه استفاده کنيد .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim A(4) As Byte
Dim Ali As Word
Dim Wqew As Byte
A(1) = 10
A(2) = 11
Wqew = 5
Locate 1 , 1
A(2) = A(3) + A(4)
Ali = A(2) + Wqew
Lcd Ali
Locate 2 , 1
Ali = A(1) * Wqew
Lcd Ali
End
متن نمایش داده شده برنامه بالا در شکل بالا مشاهد می شود :
اين شکل سخت افزار استفاده شده در کليه مثال هاي اين فصل است .
نکته : در صورتي که در يک متغير بيشتر از اندازه اش مقدار قرار دهيد با خطا مواجه مي شويد
مانند:
Dim A As Byte
A = 300
مورد بالا غلط مي باشد ، چون بايت مي تواند از 0 تا 255 تغيير کند ومقدار 300 بيشتر از اندازه (بعد) بايت است .
omidvarshoei
2011/1/26, 11:38 AM
Const :
براي تعريف يک ثبات از اين دستور استفاده مي شود :
Const Symbol= Numconst
Const Symbol= Stringconst
Const Symbol= Expression
Symbol نام ثابت و Numconst مقدار عددي انتساب يافته به Symbol و Stringconst رشته انتساب يافته به Symbol و Expression مي تواند عبارتي باشد که نتيجه آن به Symbol انتساب يابد .
مانند:
Const S = "TEST"
Const A = 5
Const B1 = &B1001
Const X =(b1 * 3 ) + 2
Incr و Decr :
دستور Incr يک واحد به متغيير عددي X مي افزايد و دستور Decr يک واحد از آن کم مي کند .
Incr X
Decr X
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim A As Byte
Dim B As Long
Dim Bp As Byte
Do
Incr A
Decr B
Locate 1 , 1
Lcd B
Locate 2 , 1
Lcd A
Waitms 500
Loop
End
Swap:
با اجراي اين دستور محتواي متغير Var1 در متغير Var2 و محتواي متغير Var2 در متغير Var1 قرار مي گيرد .
Swap Var1 , Var2
دو متغير Var1 وVar2 بايستي از يک نوع باشند .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , Db7 = PORTD.3 , _
E = PORTD.4 , Rs = PORTD.5
Dim A As Byte
Dim B As Byte
Cls
A = 10
B = 20
Swap A , B 'swap them
Locate 1 , 1
Lcd 'A=20
Locate 2 , 1
Lcd B 'B=10
End
با مشاهده متن نمایش داده شده می توان به جابجایی داده دو متغیر پی برد :
Config Single :
با اين دستور ميتوان تعداد رقم اعشار متغير از جنس Singleرا معين کرد ، اين دستور به فرم کلي زير است:
Config Single = Scientific , Digits = x
X : عددي بين 1 تا 7 است که تعداد رقم اعشار را نشان ميدهد ، درصورت که از اين دستور استفاده کنيد ، کليه متغير هاي Singleموجود در برنامه تحت پوشش قرار مي گيرند .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Config Single = Scientific , Digits = 1
Cls
Dim A As Single
A = 10
A = A / 9
Lcd A
End
و نمایش اطلاعات برنامه فوق در شکل بالا مشاهده می شود .
Format :
اين دستور يک متغير عددي را شکل دهي مي کند .
X = Format (Var , "Form")
Var رشته اي است که شکل دهي شود و نتايج در X قرار مي گيرد .Form نوع شکل دهي است .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim S As String * 10 , I As Integer
S = " 123"
S = Format(s , " ")
Locate 1 , 1 '5 Space
Lcd S ' S = " 123"Two Space First , Then 123
S = "12345"
S = Format(s , "000.000")
Locate 1 , 8
Lcd S ' S = "012.345"
S = Format(s , "+")
Locate 2 , 1
Lcd S ' S = "+12345"
End
Fusing :
از اين دستور براي روند کردن يک متغير عددي استفاده مي شود .
Target = Fusing (Source , "Mask")
Source رشته موردنظر براي شکل دهي و نتايج در Target قرار مي گيرد .Mask نوع شکل دهي است . عمل Mask حتما بايد با علامت # شروع شود و حداقل بايد يکي از علامات # يا & را بعد از مميز داشته باشد. با استفاده از # عدد روند مي شود و در صورت استفاده از & روندي صورت نمي گيرد .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim S As Single
Dim A As Byte
Cls
S = 10
A = 6
S = S / A
Locate 1 , 1
Lcd S 'lcd 1.66666666666666
Locate 2 , 1
Lcd Fusing(s , "#.##") 'lcd 1.67
Locate 3 , 1
Lcd Fusing(s , "#.####") 'lcd 1.6667
Locate 4 , 1
Lcd Fusing(s , "#.&&&") 'lcd 1.666
End
با مشاهده متن نمایش داده شده می توان بیشتر به چگونگی روند کردن پی برد :
Shift :
با اين دستور ميتوان تمام بيت ها را يک بيت به سمت راست يا چپ منتقل کرد ، اين دستور به فرم کلي زير است :
Shift Var , Left/Right
Var : نام متغير يا عدد ثابتي است که ميخواهيم آن را شيفت دهيم (منتقل کنيم) Left/Rightجهت شيفت را مشخص ميکند ، که ميتواند راست يا چپ باشد .
مانند:
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTA = Output
PORTA = 128
Do
Shift PORTA , Right
Wait 1
Loop
End
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim A As Byte
A = 5
Locate 1 , 1
lcd a
Shift A , Left
Locate 2 , 1
Lcd A
End
در مثال بالا مقدار اوليه 5 (0101 باينري) براي A در نظر گرفته شده است ، اين مقدار بر روي سطر وستون اول LCD به نمايش در ميايد ، سپس با دستور Shift A , Left تمام بيت هاي متغير A به سمت چپ منتقل ميشوند ، پس مقدار A برابر با 10 (1010 باينري ) مي شود .
Rotate:
اين دستور تقريبا مانند دستور Shift ميباشد و تمام بيت هاي يک متغير را به سمت راست يا چپ جابجا مي کند با این تفاوت که بیتی بیرون نمی رود و چرخش داده می شود ، شما همنچنين با اين دستور ميتوانيد پين هاي روشن يک پورت را جابجا کنيد وبه فرم کلي زير است:
Rotate Var , Left/Right
Var : نام متغير يا عدد ثابتي يا پورتي است که ميخواهيم آن را شيفت دهيم (منتقل کنيم)
Left/Right : جهت انتقال را مشخص مي کند ، که ميتواند را ست يا چپ باشد .
مثال : ( در پوشه Example\3 - Flasher Rotate موجود است )
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTA = Output
Dim B As Byte
B = 1
Do
Rotate B , Right
PORTA = B
Waitms 250
Loop
End
براي نشان دادن اعداد به فرم باينري از &B و براي نشان دادن اعداد به فرم هگز از &H استفاده مي شود .
مانند :
&B01010111
&Hf6
در اينجا تمامي دستورات مر بوط به اعداد ومتغيير ها که در زبان بيسيک براي ميکرو AVR است گفته شد. در درسهاي بعدي با اين دستورات به صورت کاربردي آشنا مي شويد.
(مثال ها را در بسکام کپي کنيد و طرز کار دستورات را ببينيد )
دستورات مربوط به کار با رشته ها :
Asc :
اين دستور اولين کاراکتر يک متغير از نوع داده String را به مقدار اسکي آن تبديل مي کند .
Var = Asc (String)
براي ديدن کارکترهاي اسکي و کد متناظر با آنها از منوي Edit گزينه ي Insrt Ascii را انتخاب کنيد .
Instr :
اين دستورمحل و موقعيت يک زير رشته را در رشته ديگر مشخص مي کند .
Var =Instr (start , String ,Subset)
Var =Instr (String ,Subset)
Var عددي است که مشخص کننده محل Substr در رشته اصلي String مي باشد و زمانيکه زير رشته مشخص شده در رشته اصلي نباشد صفر برگردانده مي شود .Start نيز عددي دلخواه است که مکان شروع جستجو زير رشته در رشته اصلي را مشخص مي کند . در صورتيکه Start قيد نشود تمام رشته از ابتدا جستجو مي شود . رشته اصلي تنها بايد از نوع رشته باشد ولي زير رشته (substr ) مي تواند رشته و عدد ثابت هم باشد .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim S As String * 15
Dim Z As String * 5
Dim Bp As Byte
Cls
S = "This is a test"
Z = "is"
Bp = Instr(s , Z)
Lcd Bp
Bp = Instr(4 , S , Z)
Home L
Lcd Bp
End
با مشاهده اعدا نمایش داده شده بیشتر می توان به عدد برگشتی تابع فوق پی برد :
: CHECKSUM
اين دستور مجموع کد دسيمال اسکي رشته X را برمي گرداند که البته اگر مجموع کد اسکي رشته از عدد 255 بيشتر شود مقدار 256 از مجموع کم مي شود .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim S As String * 10 ' Dim Variable
S = "test"
Locate 1 , 1 ' Assign Variable
Lcd Checksum(s) ' print value (192)
S = "testNext"
Locate 2 , 1 ' assign variable
Lcd Checksum(s) ' lcd value 95
End
omidvarshoei
2011/1/26, 11:39 AM
الباقیشم برای روزی دیگه
omidvarshoei
2011/1/27, 07:18 PM
High و Low و Highw :
: Low اين دستور (LSB (Least Significant Byte يک متغير را برمي گرداند . (LSB بايد کمتر از 8 بيت باشد)
High : اين دستور( MSB (Most Significant Byte يک متغير را برمي گرداند . (MSB بايد کمتر از 8 بيت باشد)
Highw : اين دستور( MSB (Most Significant Byte يک متغير را برمي گرداند . (MSB بايد کمتر از 16 بيت باشد)
Var = High (s)
MSB متغير S در Var قرار مي گيرد . (Var بايد از جنس Byte باشد)
Var = Low (s)
LSB متغير S در Var قرار مي گيرد . (Var بايد از جنس Byte باشد)
X = Highw )s(
MSB متغير S در Var قرار مي گيرد . (Var بايد از جنس Word باشد)
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim I As Integer
Dim Z As Byte
Dim Q As Byte
Cls
I = &H1001
Z = Low(i) '1
Locate 1 , 1
Lcd Z
Q = High(i) '16
Locate 2 , 1
Lcd Q
End
و اعدا نمایش داده شده در شکل بالا مشاهده می شود .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Word , L As Long
L = &H12345678
X = Highw(l) ' 4660(des)=1238(hex)
Locate 2 , 1
Lcd X
End
Lcase و Ucase :
دستور Lcase : اين دستور تمام حروف رشته مورد نظر را تبديل به حروف کوچک مي کند .
Target = Lcase (source)
تمام حروف رشته source کوچک شده و در رشته Target جاي داده مي شود .
دستور Ucase : اين دستور تمام حروف رشته مورد نظر را تبديل به حروف بزرگ مي کند .
Target = Ucase (source)
تمام حروف رشته source بزرگ شده و در رشته Target جاي داده مي شود .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 _
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim S As String * 12
Dim Z As String * 12
Dim Q As String * 12
S = "Hello World"
Q = "QWERTGFDD"
Z = Ucase(s) 'Z = "HELLO WORLD"
Locate 1 , 1
Lcd Z
Z = Lcase(q) 'Z = "qwertgfdd"
Locate 2 , 1
Lcd Z
End
Right و Left :
دستور Right: با اين دستورقسمتي از يک رشته را جدا مي کنيم .
Var = Right (Var1 , N)
از سمت راست رشته Var1 به تعداد کاراکتر N , رشته اي جدا شده و در رشته Var قرار مي گيرد .
دستور Left: با اين دستور کاراکترهاي سمت چپ يک رشته را به تعداد تعيين شده جدا مي کند .
Var = Left (Var1 , N)
از سمت چپ رشته Var1 به تعداد کاراکتر N , رشته اي جدا شده و در رشته Var قرار مي گيرد .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 _
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim S As String * 15 , Z As String * 15
Cls
S = "abcdefg"
Z = Left(s , 5) 'Z = abcde
Locate 1 , 1
Lcd Z
Z = Left(s , 1) 'Z = a
Locate 1 , 8
Lcd Z
Z = Right(s , 5) 'Z = CDEFG
Locate 2 , 1
Lcd Z
Z = Right(s , 2) 'Z = FG
Locate 2 , 8
Lcd Z
End
و مشاهده متن اصلی و متن جدا شده :
Mid :
با اين دستور مي توان قسمتي از يک رشته را برداشت و يا قسمتي از يک رشته را با قسمتي از يک رشته ديگر عوض کرد .
Var = Mid (Var1 , St [,L])
1- قسمتي از رشته Var1 با شروع از کاراکتر Stام و طول L برداشته شده و در متغير Var قرار مي گيرد.
Mid (Var , St [,L]) = Var1
2- رشته Var1 در رشته Var با شروع از کاراکتر St ام و طول L قرار مي گيرد .
در صورت قيد نکردن گزينه اختياري L بيشترين طول در نظر گرفته مي شود .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim S As String * 10
Dim Z As String * 10
Cls
S = "adswer"
Z = Mid(s , 2 , 3)
Locate 1 , 1
Lcd Z 'lcd "dsw"
Z = "5685"
Mid(s , 2 , 3) = Z
Locate 2 , 1
Lcd S 'lcd "a568er"
End
Len :
اين دستور طول، يا به عبارتي تعداد کاراکترهاي يک رشته را برميگرداند .
Var = Len (String)
طول رشته String در متغير عددي Var قرار مي گيرد . رشته String نهايتا مي تواند 255 بايت طول داشته باشد . توجه داشته باشيد که فضاي خالي (Space Bar) خود يک کاراکتر به حساب مي آيد .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim S As String * 12
Dim A As Byte
Cls
S = "test"
A = Len(s)
Locate 1 , 1 '4
Lcd Len(s)
S = "test "
A = Len(s)
Locate 2 , 1
Lcd A '6
End
Ltrim:
اين دستور فضاي خالي يک رشته را حذف مي کند .
Var = Ltrim (Q)
فضاي خالي رشته Q برداشته مي شود و رشته بدون فضاي خالي در متغير رشته اي Var قرار مي گيرد .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim S As String * 10
Dim A As String * 10
Cls
S = "1 2 3 4"
S = Ltrim(s)
Locate 1 , 1
A = S
Lcd A '1234
S = "Q Q Q"
Locate 2 , 1
Lcd Ltrim(s) 'QQQ
End
Space :
براي ايجاد فضاي خالي در ميان يک رشته ، ازاين دستور استفاده مي شود .
Var = space (X)
X تعداد فضاي خاليست که بعنوان رشته در متغير رشته اي var جاي مي گيرد.
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim S As String * 10
Dim Z As String * 10
Cls
S = Space(5)
Z = "qwer"
Locate 1 , 1
Lcd "(" ; S ; Z ; ")"
End
ديگر دستور ات حلقه و پرش و شرط :
گاهي نياز است که يک قسمت از برنامه چندين بار اجرا شود يا در حين اجراي برنامه در يک خط به خط ديگري رجوع شود ، براي اين کار از دستورات حلقه و پرش که چندين نوع است ، استفاده مي شود .
Goto :
با اين دستورات مي توان به برچسب Label پرش کرد .
برچسب Label بايد با علامت : (colon) پايان يابد و مي تواند تا 32 کارکتر طول داشته باشد .
Label:
برنامه
Goto Label
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTA = Output
Q:
Set PORTA.0
Waitms 200
Reset PORTA.0
Waitms 200
Goto Q
End
Gosub :
با اين دستور ميتوان به يک زیرروال پرش کرد ، باز گشت ار زیرروال با دستور Return انجام مي شود ، اين دستور به فرم کلي زير است :
Gosub Label
Label:
برنامه
Return
مثال:
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTA = Output
Do
Gosub Q
Set PORTA.0
Waitms 600
Loop
End
Q:
Reset PORTA.0
Waitms 600
Return
On Var:
اين دستور به فرم کلي زير است:
On Var [Goto] [Gosub] Label1 [, Label2 ] [,Check]
در اين دستور به ازاي متغير Var به برچسب nم پرش مي شود ، مثلا اگر Var=2 باشد به پرچسب سوم پرش مي شود ( تعداد برچسب ها نامحدود است ( بستگي به حافظه ميکرو دارد) . در صورتي که از دستور Gosub استفاده کنيد باز گشت از زير برنامه (برچسب) با دستورReturn انجام مي شود و در صورت استفده از Goto بايد به حلقه اصلي پرش کرد که شما ميتوانيد از دستور Goto يا ديگر دستورات استفاده کنيد .
مثال با دستور Gosub:
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTA = Output
Dim S As Byte
Do
On S Gosub Q , W , E
Incr S
Wait 1
Loop
End
Q:
Set PORTA.0
Return
W:
Set PORTA.1
Return
E:
Set PORTA.2
Return
مثال با دستور Goto:
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTA = Output
Dim S As Byte
A:
Wait 1
On S Goto Q , W
End
Q:
Incr S
Goto A
W:
Set PORTA.1
Goto A
در مثال هاي بالا ، در اول کار مقدار S صفر است پس به پرچسب اول پرش شده و پورت PORTA.0 يک مي شود مي شود و به S يک واحد افزوده مي شود ، بعد از اين عمل دوباره به حلقه اصلي پرش ، S برابر با 1 مي شود ، پس به پرچسب دوم پرش مي شود در آنجا پورت ...
Do - Loop :
فرم کلي دستورات DO … LOOP بصورت زير مي باشد .
Do
برنامه
Loop
اين حلقه يک حلقه بينهايت است ، که با Exit Do مي توان از درون حلقه خارج شد و اجراي برنامه در خط بعد از Loop ادامه يابد.
همچنان می توان شرطی تعریف کرد که با بر قرار شدن شرط از حلقه خارج شویم :
Do
برنامه
Loop Until A = X
هر گاه متغیر A برابر X شد از حلقه خارج می شویم , تست شرط در آخر حلقه انجام می شود پس حلقه فوق حداقل یک بار اجرا می شود . در مثال زير در هر بار تکرار حلقه يک واحد به A اضافه مي گردد و هرگاه مقدار A به 10 رسيد خط بعد از حلقه اجرا مي گردد.
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTA = Output
Dim A As Byte
Do
Incr A
Set PORTA.0
Waitms 600
Reset PORTA.0
Waitms 600
Loop Until A = 10
Toggle PORTA
End
omidvarshoei
2011/1/27, 07:20 PM
یه تشکر ساده هم مارو راضی میکنه http://www.pix2pix.org/my_unzip/123290843324.gif
omidvarshoei
2011/1/27, 07:23 PM
For - Next :
فرم کلي دستورات FOR .. NEXT بصورت زير مي باشد .
For Var = Start To End [Step Value]
برنامه
Next Var
Var بعنوان يک کانتر عمل مي کند که Start مقداراوليه آن و End مقدار پاياني است و هر دو مي توانند يک ثابت عددي يا متغير عددي باشند . Value مقدار عددي Step را نشان مي دهد که مي تواند مثبت يا منفي باشد . وجود نام Var بعد از Next الزامي نيست .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim A As Byte
Dim B As Byte
Dim C As Integer
For A = 1 To 10 Step 2
Locate 1 , 1
Lcd A
Next A
For C = 9 To -5 Step -1
Locate 1 , 6
Lcd C
Next
For B = 1 To 10
Locate 2 , 1
Lcd B
Next
End
While - Wend :
فرم کلي اين دستور به شکل زير است:
While Condition
برنامه
Wend
دستورالعمل While - Wend تشکيل يک حلقه تکرار مي دهد که تکرار اين حلقه تا زماني ادامه مي يابد که عبارت بکاربرده شده نتيجه را FALSE کند و يا مقدار صفر بگيرد . دستورالعمل While بصورت ورود به حلقه به شرط مي باشد , بنابراين While ممکن است در حالتهايي اصلا اجرا نشود .
برنامه تا وقتي که حاصل Condition صفر يا False نشده است تکرار خواهد شد .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim A As Byte
A = 1
While A < 10
Locate 1 , 1
Lcd A
Incr A
Waitms 600
Wend
End
if :
فرم کلي اين دستور به شکل زير است:
If A = 1 Then :
...
Elseif A = 2 Then :
..
Elseif B1 > A Then :
...
Else :
...
End If
در صورتي که شرط اول برقرار باشد (A=1) دستورات زير If A = 1 Then تا Elseif A = 2 Then اجرا مي شود ، در صورتي که شرط اول برقرار نباشد و شرط دوم برقرار باشد (A=2) دستورات بين Elseif A = 2 Then تا Elseif B1 > A Then اجرا مي شود ،در صورتي که .... و اگر هيچ کدام از شرط ها برقرار نباشد ؛ دستورات بين Else تا End If اجرا مي شود. اين دستور ميتواند هر پيزي را چک کند ( متغير ها ، واحد هاي حافظه ، پين ها ، پورت ها و...) .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.2 , Db5 = PORTD.3 , Db6 = PORTD.4 _
, Db7 = PORTD.5 , E = PORTD.1 , Rs = PORTD.0
Dim A As Byte
Do
Incr A
Wait 1
If A = 1 Then :
Locate 1 , 1
Lcd "CLAUSE1 true"
Locate 2 , 1
Lcd "a=1"
Elseif A = 2 Then :
Locate 1 , 1
Lcd "CLAUSE2 true"
Locate 2 , 1
Lcd "a=2"
Elseif A = 3 Then :
Locate 1 , 1
Lcd "CLAUSE3 true"
Locate 2 , 1
Lcd "a=3"
Elseif A = 4 Then :
Locate 1 , 1
Lcd "CLAUSE4 true"
Locate 2 , 1
Lcd "a=4"
Elseif A = 5 Then :
Locate 1 , 1
Lcd "CLAUSE5 true"
Locate 2 , 1
Lcd "a=5"
Elseif A = 6 Then :
Locate 1 , 1
Lcd "CLAUSE6 true"
Locate 2 , 1
Lcd "a=6"
Else :
Locate 1 , 1
Lcd "CLAUSE4 false"
Locate 2 , 1
Lcd "a>6"
End If
Loop
End
در مثال بالا ، هر يک ثانيه يک واحد به متغير A افزوده مي شود ، هنگاميکه مقدار آن 1 است روي سطر اول LCD عبارت "CLAUSE1 true" و روي سطر دوم LCD مقدار A نوشته مي شود ، هنگامي که مقدار آن 2 است روي سطر اول LCD عبارت "CLAUSE2 true" و روي سطر دوم LCD مقدار A نوشته مي شود ،.... هنگامي مقدار آن بزرگتر از 6 شد ، چون مقدار Aدر هيچ کدام از شرط ها صدق نمي کند ، دستور بين Else وEnd If اجرا مي شود . شما ميتوانيد از اين دستور به فرم هاي مختلف ، يک شرطي يا چند شرطي استفاده کنيد با اين دستوردر ادامه بيشتر آشنا مي شويم .
#if :
اين دستور مانند دستورIf است با اين تفاوت که در با اين دستور ميتوان شروط مربوط به کارکترها را اجرا کرد ، اين دستور به فرم کلي زير است:
#if Condition
Case 1
#else
Case 2
#Endif
در صورتي که شرط درست باشد Case 1 اجرا مي شود و در صورت نا درست بودن Case 2 اجرا مي شود .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
#if Varexist( "S")
Dim A As Byte
#else
Dim S As Byte
#endif
End
Select Case :
اين دستور تقريبا مانند دستور if است و به فرم زير ميباشد :
Select Case Var
Case Test1 : Statements1
[Case Test2 : Statements2 ]
.
.
.
Case Else : Statements3
End Select
در اين دستور يک متغيير چک مي شود ، در صورتي که مقدار آن با شرط Test1 برابر باشد Statements1 اجرا مي شود، در صورتيکه مقدار آن با Test2 برابر باشد Statements2 اجرا مي شود و در صورتي که مقدار آن با هيچ يک از شروط برابر نباشد Statements3 اجرا مي شود .
نکته : برعکس دستور If که در صورتی برقراری شرط اول بقیه شرطها چک نمی شد در Select Case تمام مقادیر چک می شوند .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , _
Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
Dim A As Byte
Do
Incr A
Wait 1
Select Case A
Case 1:
Locate 1 , 1
Lcd "CLAUSE true"
Locate 2 , 1
Lcd "a=1"
Case 2:
Locate 1 , 1
Lcd "CLAUSE true"
Locate 2 , 1
Lcd "a=2"
Case 3 To 5:
Locate 1 , 1
Lcd "CLAUSE true"
Locate 2 , 1
Lcd "a=3-5"
Case Else:
Locate 1 , 1
Lcd "CLAUSE false"
Locate 2 , 1
Lcd "a>6"
End Select
Loop
End
در مثال بالا هر يک ثانيه يک واحد به متغير A افزوده مي شود ،در صورتي که مقدار آن يک باشد شرط اول اجرا شده و بر روي lcd عبارات "CLAUSE true" و "A=1" نمايش داده مي شود ، در صورتي که مقدار آن دو باشد عبارت هاي "CLAUSE true" و "A=2" بر روي LCD نمايش داده مي شود ، در صورتي که مقدار آن بين 3 تا 5 (3 و 4 و 5) باشد عبارت هاي "CLAUSE true" و "A=3-5" بر روي LCD نمايش داده مي شود ،... در صورتي که هيچ کدام از شرط ها بر قرار نباشد دستورات بين Case Else و End Select اجرا مي شود.
Exit :
با دستور Exit ميتوان از تمام حلقه هاي بالا خارج شد ، فرم دستور براي هر حلقه در زير آورده شده است:
Exit For
Exit Do
Exit While
Exit Sub
Exit Function
مورد اول براي خروج از حلقه ي For - Next و مورد دوم براي خروج از حلقه ي Do - Loop و مورد سوم براي خروج از حلقه ي While- Wend و مورد چهارم براي خروج از زير برنامه و مورد آخر براي خروج از تابع است ( دو مورد آخر در بخش هاي بعدي مورد بررسي قرار مي گيرند)
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , _
Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
Dim A As Byte
For A = 1 To 100
Locate 1 , 1
Lcd "Exit FOR-NEXT"
Locate 2 , 1
Lcd "when A=4 a is "
Lcd A
If A = 4 Then :
Exit For
End If
Wait 1
Next
A = 1
Do
Locate 1 , 1
Lcd "Exit do-loop"
Locate 2 , 1
Lcd "when A=5 a is "
Lcd A
Wait 1
If A = 5 Then :
Exit Do
End If
Incr A
Loop
A = 1
While A < 6
Locate 1 , 1
Lcd "Exit While-Wend"
Locate 2 , 1
Lcd "when A=6 a is "
Lcd A
Incr A
Wait 1
If A = 6 Then :
Exit While
End If
Wend
End
دستورات اجرايي :
براي اينکه بتوانيد با کامپايلر بسکام راحت تر کار کنيد تعدادي دستور به دستورات بيسيک براي AVR اضافه شده است ، اين دستورات کدي را براي ريختن روي ميکرو توليد نمي کند و فقط جايگزين يک دستور مي شود يا آن را خلاصه ميکند ، استفاده از اين دستورات کاملا اختياري است ، مثلا شما مي توانيد با دستور $prog که در زير توضيح داده مي شود ، فيوز بيت دلخواه خود را پروگرام کنيد ، ميتوانيد اين کار را از طريق پروگرامر انجام دهيد و.... اين دستورات با علامت $ شروع مي شوند در زير آنها را توضيح ميدهيم : ( بعضي از دستورات مانند دستور baud$ يا .. در بخش مربوطه گفته مي شود)
دستورات : (دونقطه) (شيفت + ک) , (کما) (شيفت +و) ; (ويرگول)(حرف ک) _ (خط فاصله) (شيفت + منفي) ’ ( نقل قول تکي)
:
(شيفت +گ) (البته در حالت کيبرد انگيسي) : (دونقطه) (شيفت + ک) : با استفاده از اين دستور شما ميتوانيد چندين دستور را پشت سر هم بنويسيد .
مانند :
Incr A : Wait 1 : Lcd A : Locate 2 , 1 : Lcd B : Wait 2 : Cls : Incr B
,
(کما) (شيفت + و) : با اين دستور ميتوانيد چندين متغير را در يک خط معرفي کنيد ( Dim فقط براي متغير اول آورده مي شود)
مانند :
Dim A As Byte , B As Integer , C As Word , Q As Bit
;
(ويرگول) (حرف ک) : با اين دستور ميتوانيد چندين متغير يا کارکتر را در يک خط بنويسيد ، کارکتري بعدي از اولين فضاي خالي بعد از کارکتر قبلي نمايش داده مي شود مانند:
Lcd "a" ; A ; "b" ; B
_
(خط فاصله) (شيفت + منفي) با اين دستور ميتوان يک خط طولاني را نصف کرد .
مانند:
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
’
( نقل قول تکي) (شيفت +گ) : با گذاشتن اين دستور در برنامه ، کليه حروف واعدادي که بعد از اين دستور ميايند ،کامپايل نمي شوند ، شما ميتوانيد بعد از اين دستور توضيحاتي را به برنامه اضافه کنيد ، (يادشتها به رنگ سبز در مي آيد.) شما همچنين ميتوانيد به جاي اين علامت کلمه Rem را به کار ببريد
مانند :
Start Adc 'roshan shodan adc
براي درک مطالب مثال زير را شبيه سازي کنيد :
$regfile = "m16def.dat" : $crystal = 1000000 : Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5 ' rah andazi lcd
Dim A As Byte , B As Integer , C As Word , D As Byte
A = 1 : B = 2 : C = 5 : D = 7
Locate 1 , 1 : Lcd A ; " " ; B ; " " ; C ; " " ; D
Locate 2 , 1 : Lcd "a" ; A ; "b" ; B
End rem payan brname
$asm :
با اين دستور شما ميتوانيد دربين دستورات بيسيک ،دستورات اسمبلي به کار ببريد دستورات اسمبلي بين $asm و $end Asm قرار ميگيرند . ( براي ديدن دستورات اسمبلي که براي AVR مورد استفاده قرار ميگيرد در HELP بسکام گزينه Assembler mnemonics را جستجو کنيد).
مانند:
$regfile = "m16def.dat"
$crystal = 1000000
$asm
Ldi R24,1 ; load register R24 with the constant 1
St X,R24 ; store 1 into variable c
$end Asm
End
$dbg :
با نوشتن اين دستور و کامپايل و پروگرام کردن آن در ميکرو ، شما ميتوانيد توسط پروگرامر سريال برنامه داخل ميکرو را اشکال زدايي کنيد . تنها کافي است اين دستور را در برنامه خود به کار ببريد.
$dbg
Debug :
اين دستور به فرم کلي زير است:
Debug On|Off|Var
با اين دستور ميتوان تغييرات متغير Var را مشاهده کرد ، هنگامي که از اين دستور استفاده مي کنيد ، متغير var توسط پروگرامر سريال به پورت کام فرستاده مي شود و شما مي توانيد آن را در محيط شبيه ساز مشاهده کنيد ، On و Off براي شروع و پايان ارسال متغير هستند .
مانند:
$regfile = "m16def.dat" : $crystal = 1000000 : Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim A As Byte
Do
Incr A : Wait 1 : Locate 1 , 1 : Lcd A
Debug On A
Loop
End
در مثال بالا متغيرA بهد از هر باز افزوده شدن به پورت کام فرستاده مي شود .
$default:
با اين دستور ميتوانيد متغير هاي تعريف شده را در حافظه هاي مختلف به صورت خود کار ذخيره کنيد (ذخيره سازي از اولين خانه خالي حافظه شروع مي شود) ، اين دستور به فرم کلي زير است:
$default = Var
Var : ميتواند يکي از گزينه هاي Sram , Xram , Eram باشد .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
$default Eram
Dim A As Byte , B As Byte
$default Sram
Dim D As Byte
A = 1 : B = 1
D = A * B
End
در مثال بالا متغيير هاي A و B در حافظه ي Eeprom و متغيير D در حافظه Sram ذخيره مي شود . (توجه داشته باشيد که ميکرو شما بايد داراي حافظه هاي انتخاب شده باشد)
$external :
با اين دستور شما ميتوانيد از کتابخانه های اسمبلي در بسکام استفاده کنيد ، با دستور $asm شما به تعدادي از دستورات دسترسي داريد ، با اين دستور ميتوانيد لايبري هاي زبان اسمبلي را در پوشه lib موجود در محل نصب بسکام کپي کرده و در برنامه فراخواني کنيد .
مانند:
$regfile = "m16def.dat"
$crystal = 1000000
$external Test
Declare Sub Test(byval X As Byte , Y As Byte)
Dim Z As Byte
Call Test(1 , Z)
End
$map :
با نوشتن اين دستور در برنامه ، گزارشي به نام Map به انتهاي فايل Report افزوده مي شود ، اين متن شماره خط هاي که در آنها کد توليد شده است را نمايش مي دهد (براي ديدن فايل گزارش به آدرس : Program > Show Result برويد)
$include:
با اين دستور شما ميتوانيد برنامه ديگري را وارد برنامه خود کنيد ، برنامه ديگر بايد در محل ذخيره برنامه اصلي موجود باشد ، اين دستور به فرم کلي زير است:
$include "file"
File: نام برنامه اي است که ميخواهيد آن را وارد کنيد ، نام بايد کامل و با پسوند باشد مانند:
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
$include "123.bas"
End
برنامه اي که به نام 123 ذخيره شده در زير آورده شده است :
Locate 1 , 1
Lcd "12365"
Locate 2 , 1
Lcd "qwert"
$programmer :
با اين دستور شما ميتوانيد نوع پروگرامر مورد استفاده را ، در برنامه تعيين کنيد ، اين دستور به فرم کلي زيراست:
$programmer = Number
Number : يکي از اعداد جدول صفحه بعد است :
همچنين ميتوانيد از مسير زير در برنامه بسکام نوع پروگرامر را تغيير دهيد :
Options > Programmer
براي اطلاعات بيشتر در مورد پروگرامر ها به قسمت ضميمه ها مراجعه کنيد .
$sim:
هنگامي که اين دستور را در برنامه به کار ببريد،کليه دستورات تاخير غير فعال ميشوند ، اين دستور هنگامي که از شبيه ساز داخلي بسکام استفاده مي کنيد کاربرد دارد ، هنگامي که مي خواهيد برنامه را روي ميکرو بريزيد يا آن را با پروتوس شبيه سازي کنيد اين دستور را پاک کنيد.
$lib :
با اين دستور شما ميتوانيداز ديگر لايبري هاي که براي بسکام نوشته شده است استفاده کنيد (مثلا لايبري lcd گرافيکي) اين دستور به فرم کلي زير است :
$LIB "Libname"
Libname1: نام لايبري ميباشد که در محل ذخيره برنامه وجود دارد ، شما همچنين ميتوانيد آن را در پوشه lib موجود در محل نصب بسکام کپي کنيد ، در اين صورت ديگر به اين دستور نيازي نيست ، مانند :
$lib "glcdSED1520.lbx"
nocompile$ :
با نوشتن اين دستور در برنامه ، برنامه کامپايل نشده و کد هگزي توليد نمي شود همچنین برنامه چک نشده و اتوماتيک ذخيره نمي شود :
$nocompile
Pushall و Popall :
دستور Popall باعث مي شود که بعد از ريست شدن ميکرو همه ريجستر هاي حافظه به حالت پيشفرض برگردند و استفاده از دستور Pushall باعث مي شود تا ريجستر ها ذخيره شود . ( در حالت عادي بعد از ريست شدن ميکرو کليه ريجستر ها به حالت پيش فرض برمي گردند.) براي استفاده از اين دستورات آن ها را در برنامه خود تايپ کنيد.
omidvarshoei
2011/1/28, 05:04 PM
من دوست دارم بقیه این اموزش بزارم ولی مثل اینکه خودتون علاقه ندارین
و من در اول بحثمم گفتم در حالی این کارو میکنم که خودتون مشتاق باشین که نیستین
cleopatra
2011/1/28, 05:38 PM
سلام دوست عزیز
فهمیدم مشکلم کجا بود
در ضمن,حتما باید 100 نفر ازت تشکر کنن؟
مطالبی که گذاشتی خیلی منو راه انداخت
من خودم 100 بار ازت تشکر می کنم
omidvarshoei
2011/1/28, 05:44 PM
سلام دوست عزیز
فهمیدم مشکلم کجا بود
در ضمن,حتما باید 100 نفر ازت تشکر کنن؟
مطالبی که گذاشتی خیلی منو راه انداخت
من خودم 100 بار ازت تشکر می کنم
نه دوست عزیز نیاز به تشکر نیست من اکه این مطالب اینجا میزارم صرفآ جهت کمک بشماست ولی وقتی میبینم تو بخش الکترونیک اینقدر فعالیت کمه حالم میگیره
من از دوستان خواهش کردم پروژه هاشون بیان بزارن این اولین سایتی که من میبینم اینقدر بخش الکترونیک کم کارن
نمیخوام اسم سایتای دیگه بیارم
مثلا خود شما میتونین همین مدار ساده ای که دارین میسازین بزارین تو سایت مطمئن باش به درد خیلی ها میخوره اولین کسی هم که تشکر میکنه ازتون خودمم
royalblue
2011/1/29, 03:16 PM
دوست عزیز ممنون که اینقدر فعال هستین و دارین کار سازنده ای تو باشگاه انجام میدن
ولی سایتهای دیگه که فعال هستن هم به درد نمیخورن چون من یه بار یه مشکلی با lcdام پیدا کردم هر چقدر صبر کردم شاید یکی پیدا بشه جواب منو بده بسی بی فایده بود پاسم دادن به بخش های دیگه
omidvarshoei
2011/1/29, 05:14 PM
دوست عزیز ممنون که اینقدر فعال هستین و دارین کار سازنده ای تو باشگاه انجام میدن
ولی سایتهای دیگه که فعال هستن هم به درد نمیخورن چون من یه بار یه مشکلی با lcdام پیدا کردم هر چقدر صبر کردم شاید یکی پیدا بشه جواب منو بده بسی بی فایده بود پاسم دادن به بخش های دیگه
دوست من من میخام این سایت مخصوصآ قسمت الکترونیکش پر محتواترین سایت باشه و هر کسی جواب میخواد به راحتی به جوابش برسه اینکه هر کی هر وقت سوال داشته باشه بیاد تو فروم فایده نداره
فروم یعنی اینکه یه نفر سوال کنه 10 نفر جوابش بدن نه اینکه 10 نفر سوال کنن یه نفر جواب بده
ramos_kk77
2011/1/29, 06:25 PM
سلام راس میگی تعریف فروم رو خوب اومدی البته Cleopatraهم حرفش قشنگ بود. من دو روز یه مسافرت اجباری داشتم و به نت دسترسی نداشتم فعلا بابت همه مطالب مفیدی که گذاشتی تشکر با تاخیرمو داشته باش تا یه چند تا سوالی که دارم اینجا با همه دوستان ایشاا... مطرح کنم.:D:gol:
omidvarshoei
2011/1/29, 06:33 PM
سلام راس میگی تعریف فروم رو خوب اومدی البته Cleopatraهم حرفش قشنگ بود. من دو روز یه مسافرت اجباری داشتم و به نت دسترسی نداشتم فعلا بابت همه مطالب مفیدی که گذاشتی تشکر با تاخیرمو داشته باش تا یه چند تا سوالی که دارم اینجا با همه دوستان ایشاا... مطرح کنم.:D:gol:
اینشالا سفرتون به خوشی گذشته باشه
omidvarshoei
2011/1/30, 04:52 PM
از این موضوع تا الان 255 نفر دیدن کردن فقط یه نفر مشکل داشته تو برنامه نویسی یا سوال داشته
این واقعا امار خیره کننده ایه
omidvarshoei
2011/1/30, 04:58 PM
$map :
با نوشتن اين دستور در برنامه ، گزارشي به نام Map به انتهاي فايل Report افزوده مي شود ، اين متن شماره خط هاي که در آنها کد توليد شده است را نمايش مي دهد (براي ديدن فايل گزارش به آدرس : Program > Show Result برويد)
$include:
با اين دستور شما ميتوانيد برنامه ديگري را وارد برنامه خود کنيد ، برنامه ديگر بايد در محل ذخيره برنامه اصلي موجود باشد ، اين دستور به فرم کلي زير است:
$include "file"
File: نام برنامه اي است که ميخواهيد آن را وارد کنيد ، نام بايد کامل و با پسوند باشد مانند:
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
$include "123.bas"
End
برنامه اي که به نام 123 ذخيره شده در زير آورده شده است :
Locate 1 , 1
Lcd "12365"
Locate 2 , 1
Lcd "qwert"
$programmer :
با اين دستور شما ميتوانيد نوع پروگرامر مورد استفاده را ، در برنامه تعيين کنيد ، اين دستور به فرم کلي زيراست:
$programmer = Number
Number : يکي از اعداد جدول صفحه بعد است :
همچنين ميتوانيد از مسير زير در برنامه بسکام نوع پروگرامر را تغيير دهيد :
Options > Programmer
براي اطلاعات بيشتر در مورد پروگرامر ها به قسمت ضميمه ها مراجعه کنيد .
$sim:
هنگامي که اين دستور را در برنامه به کار ببريد،کليه دستورات تاخير غير فعال ميشوند ، اين دستور هنگامي که از شبيه ساز داخلي بسکام استفاده مي کنيد کاربرد دارد ، هنگامي که مي خواهيد برنامه را روي ميکرو بريزيد يا آن را با پروتوس شبيه سازي کنيد اين دستور را پاک کنيد.
$lib :
با اين دستور شما ميتوانيداز ديگر لايبري هاي که براي بسکام نوشته شده است استفاده کنيد (مثلا لايبري lcd گرافيکي) اين دستور به فرم کلي زير است :
$LIB "Libname"
Libname1: نام لايبري ميباشد که در محل ذخيره برنامه وجود دارد ، شما همچنين ميتوانيد آن را در پوشه lib موجود در محل نصب بسکام کپي کنيد ، در اين صورت ديگر به اين دستور نيازي نيست ، مانند :
$lib "glcdSED1520.lbx"
nocompile$ :
با نوشتن اين دستور در برنامه ، برنامه کامپايل نشده و کد هگزي توليد نمي شود همچنین برنامه چک نشده و اتوماتيک ذخيره نمي شود :
$nocompile
Pushall و Popall :
دستور Popall باعث مي شود که بعد از ريست شدن ميکرو همه ريجستر هاي حافظه به حالت پيشفرض برگردند و استفاده از دستور Pushall باعث مي شود تا ريجستر ها ذخيره شود . ( در حالت عادي بعد از ريست شدن ميکرو کليه ريجستر ها به حالت پيش فرض برمي گردند.) براي استفاده از اين دستورات آن ها را در برنامه خود تايپ کنيد.
زير برنامه ها و فراخواني توابع :
: Declare Function
از اين دستور براي معرفي تابع در ابتداي برنامه استفاده مي شود . زماني که بخواهيم تابعي را معرفي کنيم بايستي تابع معرفي شده باشد . در صورت استفاده از تابع مي بايستي يک داده برگردانده شود .
Declare Function Test [([Byref / Byval] Var As Type1)] As Type2
Test نام تابع موردنظر است . انتقال داده بصورت Byval باعث مي شود که يک کپي از متغير به تابع فرستاده شود و در محتواي آن هيچ تغيري ايجاد نشود .ولي در حالت Byref آدرس متغير ارسال و تغيرات در آن اثر مي گذارد و داده برگشتي در صورت انجام عمليات بر روي آن با مقدار اوليه خود برابر نخواهد بود . در صورت عدم استفاده از گزينه [Byref/Byval] بصورت پيش فرض داده بصورت Byref فرستاده مي شود. Type1 نوع داده ارسال شده وType2 نوع داده برگشتي است . که هر دو مي توانند داده نوع Byte , Integer, word , Long ,String باشند .
مثال :
در مثال زير I بصورت Byval فرستاده شده است بنابراين يک کپي از مقدار I به زير تابع فرستاده مي شود و هيچ تغييري در محتواي آن ايجاد نمي شود. S بصورت Byref فرستاده مي شود و تغير در آن صورت مي گيرد . فراخواني تابع Myfunction با K و Z از نوع داده Integer و String است و مقدار برگشتي از نوع Integer است که در متغير T قرار مي گيرد . شما مي توانيد در محدوده تابع يک متغير محلي تعريف کنيد .
مثال :
$regfile = "m16def.dat" : $crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 _
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Declare Function Myfunction(byref I As Word , S As String )as Word
Dim K As Word , Z As String * 10 , T As Word
K = 5 : Z = "123 " : T = Myfunction(k , Z)
Locate 1 , 1
Lcd T '10
Locate 1 , 9
Lcd Z 'Bascom
Locate 2 , 1
Lcd K '24
End
Function Myfunction(byref I As Word , S As String )as Integer
I = 4 * 6
S = "Bascom"
Myfunction = 10
End Function
از اين دستور براي معرفي زير برنامه استفاده مي شود . زير برنامه اي که قصد فراخواني آن را داريم بايستي در ابتداي برنامه يا حداقل قبل از فراخواني آن معرفي شده باشد .
Declare Sub Test [([Byref / Byval] Var As Type)]
زير برنامه برخلاف تابع مقداري برنمي گرداند .در زمان ارسال داده بصورت Byref آدرس داده به زير برنامه فرستاده مي شود و در محتواي آن تغير ايجاد مي شود .ولي در حالت Byval يک کپي از داده فرستاده مي شود و به هيچ وجه در محتواي آن تغيري ايجاد نمي شود . Test نام زيربرنامه و Var نام متغير ارسالي به زير برنامه و Type نوع آن است که مي تواند داده نوع Byte , Integer , Word , String باشند .
براي نوشتن زير برنامه ابتدا نام آنرا توسط دستور زير تعريف کرده و سپس شروع به نوشتن زيربرنامه مي کنيم .
Sub Name [(Var1)]
Name نام زيربرنامه که بايد توسط دستور Declare معرفي شده باشد و با دستور End Subپايان مي يابد .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Cls
Dim A As Byte , B1 As Byte , C As Byte
Declare Sub Test(a As Byte)
A = 1 : B1 = 2 : C = 3
Lcd A ; B1 ; C '123
Call Test(b1)
End
Sub Test(a As Byte)
Locate 2 , 1
Lcd A ; B1 ; C '223
End Sub
Call :
توسط اين دستور زير برنامه يا تابعي را فراخ واني مي کنيم .
Call Test (Var1 , Var2 , ....)
Var1 , Var2 متغيرهايي که به زير برنامه انتقال مي يابند , هستند . مي توان زير برنامه را بصورت زير نيز فراخواني کرد .
TEST VAR1 , VAR2
لازم بتذکر است که نام زير برنامه قبل از فراخواني آن , بايد توسط دستور Declare فراخواني شود. اگر بخواهيم عدد ثابت را به زير برنامه انتقال دهيم بايستي حتما با آرگومان BYVAL آن را انتقال دهيم .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 _
, Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Dim A As Byte , B As Byte
Declare Sub Test(b1 As Byte , Byval B2 As Byte)
A = 65
Call Test(a , 5)
Test A , 5
Locate 2 , 1
Lcd A
End
Sub Test(b1 As Byte , Byval B2 As Byte)
B1 = 10
B2 = 15
Locate 1 , 1
Lcd B1
Locate 1 , 9
Lcd B2
End Sub
Local :
از اين دستور براي تعريف و بکارگیری متغير محلي در زيربرنامه استفاده مي کنيم .
Local Var As Type
Var نام متغير و Type نوع داده است که مي توانند String , Word , Integer , Byte , Single , Long باشند .
نوع داده هاي Eram , Sram , Xram و آرايه ها نمي توانند محلي تعريف شوند .
يک متغير محلي يک متغير موقت است که فقط در هنگام فراخواني زير برنامه مربوطه براي آن فضا در نظر گرفته مي شود و با برگشت از زير برنامه عمر متغير (Life Time) به اتمام مي رسد .
تذکر متغيرهاي بيتي نمي توانند بصورت محلي تعريف شوند .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E =PORTD.4 , Rs = PORTD.5
Declare Sub Test2
Do
Call Test2
Loop
Sub Test2
Local A As Byte
Incr A
Home : Lcd A
Waitms 200
End Sub
دستورات رياضي و محاسباتي و تبديل متغير هاي رياضي
از عملگرهاي رياضي زير مي توان در محيط BASCOM استفاده کرد و عمليات رياضي را انجام داد.
* علامت ضرب *
/ علامت تقسيم /
+ علامت جمع +
- علامت تفريق -
. علامت مميز .
> علامت بزرگتر از >
< علامت کوچکتر از <
= علامت مساوي =
^ علامت توان ^
<= علامت کچکتر يا مساوي <=
=> علامت بزرگتر يا مساوي =>
<> علامت مخالف <>
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 _
, Db7 = PO RTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim Q As Word
Dim W As Word
Dim E As Word
Dim R As Word
Dim T As Word
Q = 2
W = Q + 3
Home : Lcd W '5
E = W * Q
Locate 1 , 8 : Lcd E '10
R = E ^ Q
Locate 2 , 1 : Lcd R '100
T = R - E
Locate 2 , 8 : Lcd T '90
End
Sqr:
اين دستور جدر (ريشه دوم) متغير يا عدد ثابت Source را محاسبه کرده و نتيجه را در متغير Var قرار مي دهد .
Var = Sqr (Source)
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Single , A As Byte
Cls
X = Sqr(9)
Locate 1 , 1 'X = 3
Lcd X
X = X * 27
A = Sqr(x)
Locate 2 , 1
Lcd A ' A = 9
End
Sgn :
اين دستور علامت يک متغير شناور را نشان مي دهد ، در صورتي که متغير منفي باشد (X<0) مقدار Var برابر با 1- و در صورت مثبت بودن متغير (X>1) مقدار Var برابر با 1 مي شود .
Var = sgn (X)
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As single , A As Single
Cls
X = -9
X = Sgn(x)
Locate 1 , 1
Lcd X 'X =0
A = Sgn(x)
Locate 2 , 1
Lcd A 'A =1
End
Power:
اين دستور فرم ديگر دستور ^ (توان) است و حاصل Source به توان Raise را محاسبه کرده و حاصل را در متغير Var قرار ميدهد .
Var = Power (Source , Raise)
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E =PORTD.4 , Rs = PORTD.5
Dim X As Single , A As Single , B As Single
Cls
A = 2.3
X = 10
B = A ^ X
Locate 1 , 1
Lcd B
B = Power(a , X)
Locate 2 , 1
Lcd B
End
Abs :
اين دستور به معناي رياضي |Var = |Var2 (قدرمطلق) است (اعداد منفي را به مثبت تبديل مي کند).
Var = Abs (Var2)
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , _
Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Dim A As Integer , C As Integer
A = -100
C = Abs(a) 'C = |a|
Lcd C 'C = 100
End
Exp :
Target برابر با e بتوان Source است . Target متغيري از نوع داده Single است .
Target = Exp (Source)
مانند :
$regfile = "m16def.dat"
$crystal = 12000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = Portd.1 , Db6 = PORTD.2 _
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Single
X = Exp(1.1)
Locate 1 , 1
Lcd X 'X = 3.004166124
X = 5
X = Exp(x)
Locate 2 , 1
Lcd X 'X = 148.413085937
End
Log :
اين دستور لگاريتم طبيعي يک داده از نوع Single را برمي گرداند .
Target = Log (source)
لگاريتم متغير يا ثابت Source از نوع داده Single گرفته مي شود و در متغير Target قرار مي گيرد . مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Single
X = Log(100)
Locate 1 , 1
Lcd X 'X = 4.6051
X = Log(1000)
Locate 2 , 1
Lcd X 'X = 6.9077
End
omidvarshoei
2011/1/30, 04:58 PM
Log10 :
اين دستور لگاريتم Source که از نوع Single يا Double ميباشد را در مبناي 10 محاسبه کرده ونتيجه را در متغيير Target که از نوع جنس Single يا Double ميباشد مي باشد قرار مي دهد.
Target = Log10 (Source)
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Single
X = Log10(100)
Locate 1 , 1
Lcd X 'X = 2
X = Log10(100000)
Locate 2 , 1
Lcd X 'X = 5
End
Rnd :
اين دستور يک عدد را تصادفي برمي گرداند .
Var= Rnd (Limit)
عدد تصادفي بين 0 و 1 - Limit بدست آمده و در متغير Var قرار مي گيرد . با هربار استفاده از اين دستور عدد مثبت تصادفي ديگري بدست خواهد آمد .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Byte
Do
X = Rnd(100)
Lcd X 'get random number (0-99)
Waitms 500
Loop
End
Frac:
اين دستور مقدار اعشاري يک متغير از جنس Single را جدا مي کند و در يک متغير Single ديگر (Var) مي ريزد .
Var = frac (Single)
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Single , A As Single
X = 57.35456
Locate 1 , 1
Lcd Frac(x) 'X = 0.35456
X = 123.000456789
A = Frac(x)
Locate 2 , 1
Lcd A 'A = 0.000456789
End
Int:
اين دستور مقدار صحيح يک متغير از جنسSingle يا Doubleرا محاسبه مي کند و حاصل را در متغير Var قرار مي دهد ( محدوده متغير Var بايد با محدوده جواب مناسب باشد) .
Var = Int (Source)
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Single , A As Byte
Cls
X = 57.35456
Locate 1 , 1
Lcd Int(x) 'X =57
X = X * 3
A = Int(x)
Locate 2 , 1
Lcd A 'A = 172
End
Sin و Cos و Tan :
اين دستور سينوس يا کسينوس يا تانژانت ثابت يا متغير Source را در متغير Var از نوع Single قرار مي دهد .
Var = Sin | Cos | Tan (Source)
تمام دستورات مثلثاتي با راديان کار مي کنند و ورودي اين دستور بايستي راديان باشد .
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Single
X = Cos(3.14159)
Locate 1 , 1
Lcd Fusing(x , "#.#")
X = Sin(3.14159)
Locate 1 , 9
Lcd Fusing(x , "#.#")
X = Tan(3.14159)
Locate 2 , 1
Lcd Fusing(x , "#.#")
X = cos(0.78539)
Locate 2 , 9
Lcd Fusing(x , "#.#")
End
SinH و CosH و TanH :
اين دستور کسينوس هايپربوليک يا سينوس هايپربوليک يا تانژانت هايپربوليک ثابت يا متغير Source را در متغير Var از نوع Single قرار مي دهد .
Var = Cosh | Sinh | Tanh (Source)
تمام دستورات مثلثاتي با راديان کار مي کنند و ورودي اين دستور بايستي راديان باشد .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Single
Dim Q As Single
Q = .512
X = Cosh(q)
Locate 1 , 1
Lcd Fusing(x , "#.#####")
X = Sinh(q)
Locate 1 , 10
Lcd Fusing(x , "#.#####")
X = Tanh(q)
Locate 2 , 1
Lcd Fusing(x , "#.#####")
End
Asin و Acos و Atan :
اين دستور آرک سينوس يا آرک کسينوس يا آرک تانژانت ثابت يا متغير Source را در متغير Var از نوع Single قرار مي دهد .
Var = Asin | Acos | Atn (source)
تمام دستورات مثلثاتي با راديان کار مي کنند و ورودي اين دستور بايستي راديان باشد .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Single
Dim Q As Single
Q = .512
X = Acos(q)
Locate 1 , 1 : Lcd Fusing(x , "#.#####")
X = Asin(q)
Locate 1 , 10 : Lcd Fusing(x , "#.#####")
X = Atn(q)
Locate 2 , 1 : Lcd Fusing(x , "#.#####")
Q = -1 : X = Acos(q)
Locate 2 , 10 : Lcd Fusing(x , "#.#####")
End
: Rad2deg
براي تبديل راديان به درجه از اين دستوراستفاده مي شود .
Var = Rad2deg (Single)
راديان Single به درجه تبديل مي شود و در متغير Var از نوع داده Single قرار مي گيرد .
Deg2rad :
براي تبديل درجه به راديان از اين دستوراستفاده مي شود .
Var = Deg2rad (single)
زاويه Single به راديان تبديل مي شود و در متغير Var از نوع داده Single قرار مي گيرد .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Single
Dim Q As Single
Q = 180
X = Deg2rad(q)
Locate 1 , 1
Lcd X
Q = Rad2deg(x)
Locate 2 , 1
Lcd Q
End
: Round
متغير يا داده X از نوع Single روند شده و در متغير Var از نوع داده Single قرار مي گيرد .
VAR = Round (X)
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Single
Dim Q As Single
X = 2.8
Q = 5.2
Locate 1 , 1
Lcd Round(x)
Locate 2 , 1
Lcd Round(q)
End
Max و Min:
با اين دو دستور مي توان کمترين و بيشتر مقدار يک متغير آرايه اي از جنس Word يا Byte را بدست آورد ، اين دو دستور به فرم کلي زير هستند :
Var1 = Min (Var2)
Var1 = Max (Var2)
Var2 : نام متغير آرايه است و Var يک متغير ديگري است که نتيجه در آن ريخته مي شود .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim A(10) As Byte , B(3) As Byte , C As Byte
A(5) = 10 : B(1) = 100 : B(2) = 25 : B(3) = 6
Do
Locate 1 , 1 : Lcd Max(a(1))
C = Min(b(1))
Locate 2 , 1 : Lcd C
Loop
End
FIX :
با اين دستور کوچکترين عدد صحيح نزديک به داده اعشاري از نوع بدست ميايد ( جزء صحيح) . اين دستور به فرم کلي زير است :
Var = Fix (X)
X ميتواند يک عدد اعشاري يا يک داده از نوع Single باشد ، با اجراي دستور کوچکترين عدد نزديک به داده در متغير Var ريخته مي شود ، مثلا کوچکترين عدد صحيح نزديک به 2/2 عدد 2 است .
مثال:
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim A As Single , S As Single
A = -45.56
S = Fix(25.9)
A = Fix(a)
Locate 1 , 1: Lcd S
Locate 2 , 1: Lcd A
End
توابع تبديل کدها و متغيير ها به يکديگر
Hex :
اين دستور يک داده از نوع Byte , Integer , Word , Long را به مقدار هگزادسيمال تبديل مي کند .
Var = Hex (X)
مقدار HEX متغير يا ثابت X در متغير VAR جاي مي گيرد .
: Bin
اين دستور يک داده از نوع BYTE,INTEGER , WORD , LONG را به مقدار باينري تبديل مي کند .
Var = Bin (X)
مقدار باينري متغير يا ثابت X در متغير Var جاي مي گيرد .
Str :
با اين دستور مي توان يک متغير عددي ( X) را به رشته (Var) تبديل کرد .
Var = Str (X)
Val :
با اين دستور مي توان يک رشته (S) را به متغير عددي (Var) تبديل کرد .
Var = Val (S)
Hexval :
اين دستور يک داده هگزدسيمال را به مقدار عددي تبديل مي کند .
Var = Hexval (X)
مقدار عددي داده هگزدسيمال X که مي تواند Long , Word , Integer , Byte باشد در متغير Var جاي مي گيرد .
Binval :
اين دستور يک داده باينري را به مقدار عددي تبديل مي کند .
Var = Binval (X)
مقدار عددي داده باينري X که مي تواند Long , Word , Integer , Byte باشد در متغير Var جاي مي گيرد .
Bcdو Makebcd :
اين دستور متغير يا ثابت var2 را تبديل به مقدار BCD اش مي کند و در متغير var1 جاي مي دهد .
Var1 = Makebcd (Var2)
مثال :
Print Bcd(var)
lcd bcd( var)
با دو دستور بالا ميتوان مقدار BCD يک متغيير را مستقيما روي Lcd نمايش داد يا آن را به پورت سريال فرستاد (کار پورت سريال در بخش هاي بعدي امده است)
Makedec :
براي تبديل يک داده BCD نوع Integer , Word , Byte به مقدار Decimal از اين دستور استفاده مي شود . مقدار دسيمال متغير يا ثابت VAR2 در متغير VAR1 جاي مي گيرد .
Var1 = Makedec (Var2)
Makeint :
اين دستور دو بايت را به هم متصل مي کند و يک داده نوع Word يا Integer مي سازد که Lsb بايت کم ارزش و Msb بايت پر ارزش متغير دو بايتي Varn را تشکيل مي دهد .
Varn = Makeint (Lsb , Msb)
یعنی :
Varn = (256 * Msb) + Lsb
String :
اين دستور کد اسکي M را با تعداد تکرار N تبديل به رشته کرده و در متغير Var قرار مي دهد
Var = String (M , N)
در صورت قرار دادن M =0 يک رشته بطول 255 کاراکتر توليد مي شود و قرار دادن n = 0 قابل قبول نيست .
Bin2grey :
متغير Var2 که مي تواند داده اي از نوع Word , Integer , Byte , Long باشد به کد گري تبديل شده و در متغير Var1 قرار مي گيرد .
Var1 = Bin2grey (Var2)
Grey2bin :
کد گري Var2 به مقدار باينري تبديل شده و در متغير Var1 که مي تواند داده اي از نوعWord , Integer , Byte , Long باشد قرار مي گيرد .
Var1 = Grey2bin (Var2)
مثال براي موارد بالا :
$regfile = "m16def.dat"
$crystal = 12000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim A As Byte
Dim S As String * 10
S = "ABC"
A = Asc(s)
Locate 1 , 1
Lcd A
S = Hex(a)
Locate 1 , 8
Lcd S
A = Hexval(a)
Locate 2 , 1
Lcd S
A = 50
A = Makebcd(a)
Locate 2 , 8
Lcd A
End
omidvarshoei
2011/1/30, 05:00 PM
برای فردا
کار با حافظه داخلي ميکرو (EEPROM)
omidvarshoei
2011/1/31, 07:15 PM
کار با حافظه داخلي ميکرو (EEPROM) :
تعداد زيادي از ميکرو هاي AVR داراي حافظه داخلي مي باشند ، حجم اين حافظه بسته به نوع ميکرو متفاوت است ، اطلاعات اين حافظه بر اثر قطع برق پاک نم يشود و مي تواند تا سالهاي زيادي محفوظ بماند .
EEPROM داخلي ميکرو هميشه اماده به کار است و کافي است شما در آن بنويسيد يا از آن بخوانيد ، نوشتن در EEPROM با دستور زير انجام مي شود :
Writeeeprom Var , Address
Var: متغير يا عدد ثابتي است که قصد ذخيره آن را داريد.
Address: مکاني از حافظه ميباشد که متغير در آن ذخيره مي شود . (در صورتي که آدرسي درج نشود متغير در اولين مکان خالي ذخيره مي شود و پيدا کردن آن با خداست)
ذخيره متغير اتوماتيک است و اخرين آدرس بستگي به نوع ميکرو دارد ( به ديتا شيت ميکرو مراجعه کنيد).
شما همچنين با دستور زير ميتوانيد اطلاعات داخل حافظه را بخوانيد:
Readeeprom Var , Address
Var : يک متغير متناسب با مقدار اطلاعات مي باشد ، که اطلاعات خوانده شده از آدرس درج شده ،در آن ريخته مي شود .
Address : آدرسي است که بايد اطلاعات از آن خوانده شود.
مانند:
$regfile = "m16def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Dim A As Byte , C As Byte
C = 12
Writeeeprom C , 1
Wait 1
Readeeprom A , 1
Locate 1 , 1 : Lcd A
End
در اين مثال مقدار 12 در متغير C ريخته شده است ، من اين متغير را در آدرس 1 حافظه داخلي ذخيره کردم ، و بعد از گذشت 1 ثانيه خانه 1 حافظه را خواندم و حاصل را در متغيرA ريختم و آن را روي LCD نمايش دادم . همانگونه که مشاهده خواهيد کرد عدد خوانده شده برابر 12 مي شود .
مثال ديگر:
$regfile = "m16def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Adc = Single , Prescaler = Auto
Dim A As Word , B As Byte , C As Byte
Start Adc
Do
A = Getadc(0) : A = A / 2
Locate 1 , 1 : Lcd A
Wait 1 : Incr B
If B > 180 Then
Writeeeprom A , C
C = C + 1 : B = 0
End If
If C > 3 Then
Readeeprom A , 0 : Locate 1 , 1 : Lcd A
Readeeprom A , 1 : Locate 1 , 9 : Lcd A
Readeeprom A , 2 : Locate 2 , 1 : Lcd A
Readeeprom A , 3 : Locate 2 , 9 : Lcd A
C = 0 : Else : Loop
End If
End
در برنامه بالا هر سه ساعت يک بار دماي محيط اندازه گرفته مي شود ودر حافظه داخلي ميکرو ذخيره مي شود ، بعد از گذشت 12 ساعت دما هاي ذخيره شده بر روي LCD به نمايش در ميايد .
omidvarshoei
2011/1/31, 07:16 PM
فصل چهارم : راه اندازي امکانات جانبي
Shiftin :
با اين دستور ميتوان تعداد بيت را درون يک متغير شيفت داد ، بيت ها بصورت سريال به يکي از پايه اي ميکرو اعمال ميشوند . اين دستور به فرم کلي زير است :
Shiftin Pin , Pclock , Var , Option [, Bits , Delay ]
Pin : نام پايه اي است که اطلاعات سريال به آن وارد مي شوند .
Pclock : نام پايه اي است که خط کلاک دستگاه ديگر به آن متصل مي شود .
Var: نام متغيري است که اطلاعات در آن ذخيره ميشوند .
Option: نوع شيفت دادن و کلاک را معين ميکند و يکي از اعداد زير است :
1 : هنگامي که فرکانس کلاک کم باشد ابتدا MSB ( بيت باازشتر) شيفت داده مي شود.
2 : هنگامي که فرکانس کلاک زياد باشد ابتدا MSB ( بيت باازشتر) شيفت داده مي شود.
3 : هنگامي که فرکانس کلاک کم باشد ابتدا LSB ( بيت کم ارزش) شيفت داده مي شود.
4 : هنگامي که فرکانس کلاک زياد باشد ابتدا LSB ( بيت کم ارزش) شيفت داده مي شود.
Bits : مشخص کننده تعداد بيت است که وارد متغير مي شود و نهايتا مي تواند 255 باشد (اين گزينه اختياري است)
Delay : تاخير زماني برحسب ميکرو ثانيه مي باشد که در بين دريافت هر بيت رخ مي دهد ( استفاده از اين گزينه اختياري است) (درصورت بالا بودن کلاک از اين گزينه استفاده نکنيد).
مانند:
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config PORTA =input
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 _
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim A As Word
Shiftin PINA.0 , PINA.1 , A , 0
End
در مثال بالا پايه کلاک پين A.1 و پايه ديتا پايه A.0 ميباشد ، که از ميکرو ديگر که برنامه آن را در دستور بعدي مشاهده مي فرمايد ، گرفته شده است .
Shiftout:
با اين دستور ميتوان يک متغير را بصورت سريال از يک پايه به بيرون داد . اين دستور به فرم کلي زير است:
Shiftout Pin , Pclock , Var , Option [, Bits , Delay ]
Pin : نام پايه اي است که اطلاعات سريال از آن خارج ميشوند.
Pclock : نام پايه اي است که خط کلاک دستگاه ديگر به آن متصل مي شود.(خروجي کلاک است)
Var: نام متغيري است که اطلاعات در آن وجود دارد و بايد ارسال شود.
Option: نوع شيفت دادن و کلاک را معين ميکند و يکي از اعداد زير است:
1 : هنگامي که فرکانس کلاک کم باشد ابتدا MSB ( بيت باازشتر) شيفت داده مي شود.
2 : هنگامي که فرکانس کلاک زياد باشد ابتدا MSB ( بيت باازشتر) شيفت داده مي شود.
3 : هنگامي که فرکانس کلاک کم باشد ابتدا LSB ( بيت کم ارزش) شيفت داده مي شود.
4 : هنگامي که فرکانس کلاک زياد باشد ابتدا LSB ( بيت کم ارزش) شيفت داده مي شود.
Bits : مشخص کننده تعداد بيت از متغير است که به بيرون شيفت داده مي شود و نهايتا مي تواند 255 باشد (اين گزينه اختياري است)
Delay: تاخير زماني برحسب ميکرو ثانيه ميباشد که دربين ارسال هر بيت رخ مي دهد ( استفاده از اين گزينه اختياري است) (درصورت بالا بودن کلاک از اين گزينه استفاده نکنيد).
مانند:
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTA = Output
Dim A As Word
A = &B11001000 '200
Shiftout PINA.0 , PINA.1 , A , 0
End
نکته : در بعضي از کتاب ها از دستورات Shift In/Out ، با نام SPI نرم افزاري ياد شده است که اشتباه است !
Pulseout :
فرم کلي اين دستور به شکل زير است:
Pulseout PORTX , Y , Period
با اين دستور ميتوان يک پالس بر روي پورت PORTX و پايه Y دلخواه با زمان تناوب Period دلخواه بر حسب ميکرو ثانيه ايجاد کرد ( پایه ای که پالس بر روي آن ايجاد مي شود بايد به عنوان خروجي تعريف شود)
در صورتي که از حلقه استفاده نکنيد ، دستور فقط يک با اجرا مي شود ، اين پالس مربعي است ( در واقع و ضعيت پايه از صفر به يک يا بلعکس تغيير مي کند) .
مثال : ( در مسیر Example\4 - Puls موجود است . )
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTC.0 = Output
Do
Pulseout PORTC , 0 , 1000
Pulseout PORTC , 1 , 1000
Loop
و خروجی برنامه فوق در تست پروتئوس :
Pulsein:
توسط اين دستور ميتوان زمان تناوب يک پالس مربعي را اندازه گرفت ، فرم کلي اين دستور به شکل زير است:
Pulsein Var , PINX , Y , State
اين دستورزمان تناوب پالس اعمال شده به پورت PINX و پين Y دلخواه را در متغير Var که بايد از جنس Word باشد قرار مي دهد .
شما ميتوانيد مشخص کنيد که زمان بين از صفر به يک رفتن يا از يک به صفر رفتن پالس اندازه گرفته شود ، براي حالت اول به جاي STATE صفر و براي حالت دوم به جاي STATE يک قرار دهيد .
مثال : ( در مسیر Example\5 - Time Puls موجود است )
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cursor Off
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Dim X As Word
Config PORTC.0 = Input
Do
Bitwait PINC.0 , Reset
Pulsein X , PINC , 0 , 1
Locate 1 , 1 : Lcd "1 = " ; X ; " "
Bitwait PINC.0 , Set
Pulsein X , PINC , 0 , 0
Locate 2 , 1 : Lcd "0 = " ; X ; " "
Loop
End
در مثال بالا زمان تناوب پالس مثبت و منفی که به پين C.0 اعمال شده اندازه گرفته مي شود و سپس بر روي LCD نمايش داده مي شود . (زمان تناوب نبايد از 65535 ميلي ثانيه بيشتر باشد ، اين دستور از تايمر هاي ميکرو استفاده نمي کند .)
Sound :
توسط اين دستور ميتوان پالسي را بر روي يکي از پايه هاي ميکرو ظاهر کرد ، فرم کلي دستور به شکل زير است:
Sound PORTX.Y , Duration , Pulses
PORTX.Y نام پايه دلخواهي است که پالس از آن خارج مي شود ، Durationمشخص کننده تعداد پالس هاي خروجي است و Pulses زمان تناوب پالس برحسب ميکرو ثانيه است که حداکثر مقدار آن 65535 است.
مانند:
$regfile = "m16def.dat"
$crystal = 1000000
Config PORTC.0 = Output
Do
Sound PINC.0 , 10 , 60000
Loop
End
در مثال بالا پالس از پين c.0 خارج مي شود ، زمان تناوب آن 60 ميلي ثانيه است و 10 بار تکرار مي شود . از اين دستور معمولا براي راه اندازيBUZZER استفاده مي شود.
استفاده از کليد وکيبرد و کي پد و ...
استفاده از کليد :
براي اتصال کليد به avr در محيط بسکام روش هاي مختلفي وجود دارد که در زير به بيان هر يک ميپردازيم .
نکته ، پيني که کليد به آن متصل مي شود بايد به عنوان ورودي تعريف شود .
استفاده از دستور شرطي If:
با دستور IF قبلا آشنا شديد اکنون يکي از قابليت هاي را بررسي مي کنيم :
کليد ها داراي دو پايه مي باشد که يک پايه آن به يکي از پايه هاي ميکرو و ديگري به VCC يا GND متصل مي شود با استفاده از دستور شرطي If ميتوان فشرده شدن کليد را چک کرد ، هنگامي که کليد فشرده مي شود پايه اي که کليد به آن متصبل است صفر (به گراند متصل مي شود) يا يک (به 5 ولت متصل مي شود) مي شود.
مثال : در اين مثال يک سرکليد به VCC و سر ديگر به پورت C پايه 4 متصل شده است
If Portc.4 = 1 Then
Set Porta.0
end IF
در مثال بالا ، اگر کليد فشرده شودPORTC.4 به VCC متصل ميگردد(1مي شود) . شرط به اين قرار است که اگر PORTC.4 يک شد PORTA.0 نيز يک شود در غير اين صورت PORTA.0 صفر بماند .
$regfile = "m16def.dat"
$crystal = 12000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Portc = Input
Debounce Pinc.0 , 1 , A
If Portc.1 = 1 Then
Lcd "qwer"
End If
End
A:
Lcd "12345"
Return
در برنامه بالا اگر پين C.0 يک شود روي LCD عبارت 12345 نشان داده مي شود و اگر پين C.1 يک شود روي LCD عبارت QWER نشان داده مي شود.
Debounce:
فرم کلي اين دستور به شکل زير است:
Debounce PX.Y , State , Label [,Sub]
توسط اين دستور پينX.Y چک مي شود و هنگامي که مقدار آن برابر با State شد CPU ميکرو به Label پرش ميکند ، گزينه Sub اختياري است ، شما ميتوانيد از اين گزينه براي پرش به يک زير برنامه استفاده کنيد.
به جاي گزينه State ميتوانيد 0 يا 1 قرار دهيد ، در صورتي که State صفر باشد ، هنگامي که پايه مورد نظر از یک به صفر تغییر وضعیت داد ، به برچسب مورد نظر پرش مي شود و هنگامي که State يک باشد هنگامي که پايه به ولتاژ 5 ولت متصل شد پرش صورت مي گيرد (پيني که کليد به آن متصل است بايد به عنوان ورودي تعريف شود) .
این دستور برای دریافت از کلیدها می باشد و مدت زمان 20 میلی ثانیه را به عنوان حداقل زمان فشار دادن کلید برای لرزش گیری در نظر می گیرد )
مانند :
$regfile = "m16def.dat"
$crystal = 12000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2_
, Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Config PORTC = Input
W:
Locate 1 , 1
Lcd "pinc.0 ro 1 kon"
Debounce PINC.0 , 1 , Q
Goto W
Q:
Locate 1 , 1
Lcd "pinc.1 ro 1 kon"
Debounce PINC.1 , 1 , W
Goto Q
پیشنهاد می شود برای تشخیص فشردن کلید از دستور فوق استفاده شود .
هنگامي که کليد فشرده مي شود ، براثر لرزش دست چندين با دو کنتاکت آن به هم برخورد مي کنند و در نهايت ثابت ميشوند اگر از دستور Debounce استفاده نشود لرزش به منزله فشردن کليد است
Encoder :
ENCODER نوعي کليد دوطرفه مي باشند که تصوير آن را در شکل روبرو مشاهده مي کنيد :
از اين قطعه در کيبردها و لوازم صوتي تصويري و ... براي کم و زياد کردن صدا و نور و ... استفاده مي شود.در واقع اين قطعه از دو کليد تشکيل شده است ، هنگامي که شما سري را به سمت راست مي چرخانيد ، کليد سمت راست (که يک پايه آن به پايه وسط و پايه ديگر به پايه سمت راست متصل است) قطع و وصل مي شود ، و هنگامي که سري را به سمت چپ مي چرخانيد کليد سمت چپ ( که يک پايه آن به سر وسط و پايه ديگر به پين سمت چپ متصل است ) قطع و وصل مي شود ، با استفاده از دستور زير ميتوان عمليات مناسب با جهت چرخش ( قطع و وصل شدن هر کليد ) را انجام داد:
Var = Encoder (PIN1 , PIN2 , Leftlabel , Rightlabel , Wait(
Var : يک متغيير از جنس دلخواه ميباشد که به ازاي پالس هاي فرد مقدار آن صفر و به ازاي پالس هاي زوج مقدار آن يک است (مقدار آن حول صفر ويک تغيير مي کند)
PIN1 : نشان دهنده پايه اي است که پين 1 (چپ يا راست ) انکدر به آن متصل مي شود.
PIN2 : نشان دهنده پايه اي است که پين 2 (چپ يا راست ) انکدر به آن متصل مي شود.
Leftlabel : نام برچسبي است که در هنگام به چپ چرخيدن انکودر به آن پرش مي شود . باز گشت از برچسب با دستور Return انجام مي شود.
Rightlabel : نام برچسبي است که در هنگام به راست چرخيدن انکودر به آن پرش مي شود. باز گشت از برچسب با دستور Return انجام مي شود.
Wait : در صورتي که شما به جاي اين کلمه 1 بگذاريد CPU ميکرو بر روي اين دستور متوقف مي شود ، هنگامي که انکدور چرخيد CPU به زير برنامه مي رود و بعد از انجام دستورات موجود در زير برنامه دوباره روي اين دستور متوقف شده و منتظر مي ماند تا پالسي اعمال شود و درصورتي که 0 قرار دهيد CPU مدام در حلقه گردش ميکند و اگر دستور انکودر در حلقه باشد آن را چک مي کند و اگر نباشد که هيچ .
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2 : Cls
Config Lcdpin = Pin , Db4 = PORTD.0 , Db5 = PORTD.1 , Db6 = PORTD.2 , _
Db7 = PORTD.3 , E = PORTD.4 , Rs = PORTD.5
Config PORTB = Input
Dim C As Word , A As Byte : Lcd C
Do
A = Encoder(PINB.0 , PINB.1 , Q , W , 0)
Home L : Lcd A ; " "
Loop
End
Q:
Decr C
Home : Lcd C ; " "
Return
W:
Incr C
Home : Lcd C ; " "
Return
در مثال بالا پايه مشترک انکدر به گراند و پايه چپ آن به پين B.0 و پايه راست آن به پين B.1 متصل شده است .
omidvarshoei
2011/1/31, 07:17 PM
اتصال کي پد :
ابتدا در مورد چگونگي کار کي پد بحث کنيم .
در زير شکل اين وسيله را مشاهده مي کنيد .
'گاهي به تعداد زيادي کليد نياز داريم ، ما بايد اين کليد ها را به ميکرو متصل کنيم و مدام آنها را چک نماييم . براي اين کار دو راه وجود دارد که روش اول اتصال هر کليد به يک پايه و روش دوم استفاده از صفحه کليد ماتريسي است .
روش اول، چون تعداد زيادي از پايه هاي ميکرو اشغال مي شود،کمتر مورد استفاده قرار مي گيرد .دستور بسکام براي استفاده از صفحه کليد ماتريسي که از اين به بعد به آن KBD مي گوييم به شرح زير است :
Config Kbd = PORTX [, Debounce = Value , Delay = Value]
که PORTX ، پورتي است که KBD به آن متصل مي شود .
Debounce تاخير کليد است که بين 1 تا 255 ميلي ثانيه است . (اگر تعریف نشود 20 میلی ثانیه در نظر گرفته می شود )
Delay هم تاخیر بین هر فشردن کلید است که در بین 1 تا 255 میلی ثانیه قابل تنظیم است . (اگر تعریف نشود 100 میلی ثانیه در نظر گرفته می شود )
بعد از تعريف KBD در برنامه نوبت به استفاده از آن است براي اين کار از دستور زير استفاده مي شود
Var = Getkbd()
که Var يک متغيير از جنس بايت است که عدد گرفته شده از KBD در آن گذاشته مي شود و در صورتي که کليدي فشرده نشود عدد 16 در داخل آن گذاشته مي شود ، براي حذف عدد 16 مي توان از دستور شرطي If استفاده کرد.
مانند :
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Kbd = Portb,DEBOUNCE = 50
Dim A As Byte
Q:
A = Getkbd()
If A > 15 Then
Goto Q
End If
Locate 1 , 1
Lcd A
Goto Q
End
دو خط اول برنامه مثل هميشه معرفي ميکرو و کريستال است (که در اينجا از ميکرو مگا 16 و کريستال 8 مگاهرتز استفاده شده است) .
در خط سوم و چهارم و پنجم LCD راه اندازي شده است ( که در اينجا از LCD 6*2 استفاده شده وLCD به پورتD متصل است) .
در خط ششم KBD معرفي شده (که در اينجا KBD به پورت B متصل شده وDebounce پنجاه ميلي ثانيه گرفته شده است ) .
در خط هفتم يک متغيير از جنس بايت معرفي گرديده .
در خط هشتم يک برجسب به نام Q قرار داده شده است .
در خط نهم عدد گرفته شده از KBD در متغيير A قرار مي گيرد (در صورتي که هيچ کليدي فشرده نشود مقدار 16 (A=16) در A ريخته مي شود ) .
در خط ده ويازده و دوازده يک دستور شرطي قرار گرفته که اين دستور شرطي ميگويد : اگر A بزرگتر از 15 شد به برچسب Q پرش کن (در صورتي که شرط درست باشد دستورات بين If و Endif اجرا مي شود و اگر شرط درست نباشد برنامه از خط بعد از Endif ادامه مي يابد ).
در خط سيزده و چهارده مقدار A در سطر اول و ستون اول LCD نمايش داده مي شود .
و در خط پانزده برنامه به برچسب Q پرش ميکند و مراحل قبل دوباره تکرار ميگردد .
خط اخر برنامه هميشه End است . مدار مورد استفاده :
مثال : در اين مثال به ازاي هر کليد در LCD يک نام نوشته مي شود :
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Kbd = Portb , Debounce = 20
Dim A As Byte
Q:
A = Getkbd()
If A > 15 Then : Goto Q : End If
If A = 0 Then : Locate 1 , 1 : Lcd "qwer" : End If
If A = 1 Then : Locate 1 , 1 : Lcd "asdf" : End If
If A = 3 Then : Locate 1 , 1 : Lcd "FDFD" : End If
If A = 4 Then : Locate 1 , 1 : Lcd "aFDf" : End If
If A = 5 Then : Locate 1 , 1 : Lcd "SAKr" : End If
If A = 6 Then : Locate 1 , 1 : Lcd "1234" : End If
If A = 7 Then : Locate 1 , 1 : Lcd "5687" : End If
If A = 8 Then : Locate 1 , 1 : Lcd "7541" : End If
If A = 9 Then : Locate 1 , 1 : Lcd "IO12" : End If
If A = 10 Then : Locate 1 , 1 : Lcd "wqsf" : End If
If A = 11 Then : Locate 1 , 1 : Lcd "1l2k" : End If
If A = 12 Then : Locate 1 , 1 : Lcd "3,m5" : End If
If A = 13 Then : Locate 1 , 1 : Lcd ")(*(" : End If
If A = 14 Then : Locate 1 , 1 : Lcd "****" : End If
If A = 15 Then : Locate 1 , 1 : Lcd "++++" : End If
Locate 2 , 1 : Lcd A : Goto Q
End
در برنامه بالا براي اينکه حجم کمتري اشغال شود دستورات به صورت سطري نوشته شده اند ، شما ميتوانيد با قرار دادن علامت دونقطه (:) در بين دو دستور آنها را در يک خط بنويسيد ، هعمچنين با قرار دادن علامت ويرگول (;) چندين علامت را روي LCD در يک خط نمايش دهيد ، همچنين با دستور کما (,) چندين متغيير را در يک خط معرفي کنيد .
برنامه بالا را با استفاده از جدول lookupstr مي نويسيم :
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Kbd = Portb , Debounce = 20
Dim A As Byte
Dim B As String * 5
Q:
A = Getkbd()
If A > 15 Then
Goto Q
End If
B = Lookupstr(a , W)
Locate 1 , 1: Lcd B
Locate 2 , 1: Lcd A
Goto Q
End
W:
Data "qwer" , "asdf" , "gdfh" , "jlhl" , "hkn," , "yryh" , "bmn4" , "2452" , "jkym" , "jytj" , "njhf" , "uyjn" , "dyr4" , "e5yh" , "9768" , "hnbh"
جدولLookupstr نيز مانند جدول Lookup است اما جدول Lookup براي باز گرداني اعداد و جدول Lookupstr براي بازگرداني حروف به کار مي رود .
شما جاي پايه هاي KBD که به پايه ميکرو متصل است را تغيير دهيد ونتيجه راببينيد. هميشه نياز نيست که ورودي يک کليد باشد بعضي وقت ها مي توان صفر يا يک شدن يک پين را هم چک کرد.
بعضي وقت ها به کيپد با تعداد کليد بيشتر نياز است شما با دستور زير 2 سطر ديگر به تعدا سطر هاي کيپد اضافه کنيد (در مجموع 24 کليد)
Config Kbd = Portx , Debounce = Value , Rows = 6 , Row5 = PINA.B, Row6 = PINA.B
X نام پورتي است که کيپد به آن متصل شده است (4سطر و4ستون اصلي).
Value مقدار تاخير در فشردن کليد براي گرفتن لرزش است.
A.B نام پورت و پيني است که دوسطر ديگر به آن متصل شده اند.
$regfile = "m16def.dat"
$crystal = 12000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Kbd = Portb , Debounce = 20 , Rows = 6 , Row5 = Pina.0 , Row6 = Pina.1
Dim A As Byte
Q:
A = Getkbd()
If A > 16 Then : Goto Q : End If
Locate 1 , 1 : Lcd A : Goto Q
End
اتصال کيبرد کامپيوتر :
اتصال کيبرد به avr در بسکام کار ساده اي مي باشد ، چون تمامي توابع تعريف شده هستند ونياز به نوشتن برنامه اضافه نمي باشد.
کيبرد کامپيوتر داراي 4 سيم ميباشد که دوتا از آنها مربوط به تغذيه کيبرد و يکي ديتا کيبرد و ديگري کلاک (پالس همزماني ) مي باشد .
پيکربندي کيبرد به صورت زير است :
Config Keyboard = PINX.Y , Data = PINX.Y , Keydata = Table
که PINX.Yيکي از پايه هاي دلخواه ميکرو مي باشد وTable نام جدول کد هاي کيبرد است (از آنجا که کدهاي گرفته شده از کيبرد هگز ميباشد ،بايد به وسيله يک جدول آنها را به کد اسکي براي نمايش تبديل کرد) .
مقدار گرفته شده از کيبرد بعد از تبديل به کد اسکي بايد در يک متغيير (مثلا B) ريخته شود که اين کار با دستور زير انجام مي شود .
B = Getatkbd()
اگر کليدي فشرده نشود مقدار صفر در B ريخته مي شود .
به همين سبب در برنامه يک دستور شرط (If) قرار داده مي شود تا موقعي که کليد فشرده نشود مقدار صفر در B قرار نگيرد.
براي درک بيشتر موضوع به مثال زير توجه کنيد :
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Keyboard = Pind.2 , Data = Pind.4 , Keydata = Keydata
Dim B As Byte
Do
B = Getatkbd()
If B > 0 Then
Loacate 1,1
Lcd, B
End If
Loop
End
Keydata:
'normal keys lower case
Data 0 , 0 , 0 , 0 , 0 , 200 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &H5E , 0
Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0
Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 , 13 , 0 , 0 , 92 , 0 , 0
Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0
'shifted keys UPPER case
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 34 , 0
Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0
Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0
omidvarshoei
2011/1/31, 07:18 PM
اتصال به عنوان کيبرد کامپيوتر :
نکته مهم : اتصال AVR به عنوان کيبرد به کامپيوتر، که در بسکام به نام ATEMU نام گذاري شده رايگان نبوده و کامپايلر در هنگام کامپايل کردن برنامه هاي مربوطه ( که در زير دو مورد آن موجود است ) از شما خطاي عدم وجود لايبري را مي گيرد ، شما بايد در HELP بسکام گزينه ي AT_EMULATOR را جستجو کنيد ، در صفحه پيدا شده طريقه تهيه لايبري امده است.
شما ميتوانيد بر عکس حالات بالا را با چند دستور ساده زير انجام دهيد ، يعني يک ميکروAVR را به پورت کيبرد که در پشت کامپيوتر قرار دارد ، متصل کنيد و اطلاعات مورد نياز را براي کامپيوتر ارسال کنيد ، راه اندازي اين مورد به صورت زير است :
Config Atemu = Int , Data = Data , Clock=Clock
Int : شما ميتوانيد از وقفه صفر يا يک براي اين مورد استفاده کنيد (INT0 يا INT1)
Data : نام پايه اي از ميکرو است که سيم ديتاي پورت کيبرد کامپيوتر (که شکل آن را در مبحث قبل مشاهده کرديد) به آن متصل مي شود (سيم ديتاي سوکت کيبرد بايد به پايه ورودي وقفه متصل شود (شما مجازيد از دوپايه INT0 و INT1 ( پايه 16 و 17 ميکرو مگا 16 )استفاده کنيد ))
Clock :نام پايه اي از ميکرو است که سيم کلاک پورت کيبرد کامپيوتر به آن متصل مي شود. با دستور زير ميتوانيد کد هاي دلخواه را به کيبرد را به کامپيوتر ارسال کنيد
Sendscankbd Label | Var
Label نام برچسبي است که کد در آن قرار دارد ( شما ميتوانيد چند کد را مانند مثال پشت سر هم نوشته و آنها را به کامپيوتر بفرستيد )
Var :
شما همچنين ميتوانيد يک متغيير را به کامپيوتر بفرستيد .در زير نام کليد هاي صفحه کليد و کدي که هر يک مي سازند را مشاهده مي فرماييد :
در مثال زير ميخواهيم عبارت "1nafar " را به کامپيوتر بفرستيم ، بعد از ساخت سخت افزار و اتصال آن به کامپيوتر در صورتي که برنامه Notepad يا Word را باز کنيد ، عبارت مذکور در آن نوشته مي شود.
مانند تمامي برنامه ها ابتدا ميکرو و کريستال را معرفي ميکنيم:
$regfile = "m16def.dat"
$crystal = 8000000
قدمي بعدي فعال سازي وقفه سراسري (هنگامي که ميخواهيم از وقفه استفاده کنيم بايد آن را فعال کنيم ، با دستور که نام برده مي شود تمامي وقفه ها فعال مي شوند) است :
Enable Interrupts
مرحله بعدي معرفي پايه هاي ميکرو است که بايد به پورت کيبرد موجود در پشت کامپيوتر متصل شود:
Config Atemu = Int1 , Data = PIND.3 , Clock = PINB.0
در حالت بالا پايه کلاک پورت کيبرد به پورت B.0 و پايه ديتا آن به ورودي وقفه 1 (پورت D.3) متصل است ، (در صوتي که از وقفه 0 استفاده شود ، پايه ديتا بايد به پورت D.2 متصل شود)
در مرحله بعد يک حلقه ايجاد مي کنيم تا ميکرو مدام عبارت را به کامپيوتر ارسال کند :
Do
و در نهايت با دستور زير برچسبي که در آن عبارت "1nafar" وجود دارد به کامپيوتر ارسال مي شود:
Sendscankbd data1
يک تاخير زماني ، براي اينکه صفحه مدام پر نشود :
Wait 2
پايان حلقه و پايان برنامه :
Loop
End
و در نهايت ايجاد برچسب :
Data1:
Data 18 , &H16 , &HF0 , &H16 , &H31 , &HF0 , &H31 , &H1C , &HF0 , &H1C , &H2B , &HF0 , &H2B , &H1C , &HF0 , &H1C , &H2D , &HF0 , &H2D
اولين داده جدول تعداد بايت ارسالي است ، در اينجا تمامي بايت ها ( که تعداد آنها 18 تاست) با هم ارسال شده اند (منظور پشت سرهم است ) ، شما ميتوانيد مانند جدول lookup ، جدول را آدرس دهي کنيد و داده هاي مورد نظر را بفرستيد ، توجه داشته باشيد که تعداد بايد نبايد از 3 کمتر باشد ، در اين صورت داده کامل منتقل نمي شود .داده هاي بعدي ، اعداد و حروف مي باشند ، مثلا براي عدد 1 بايد ، مطابق جدول بالا (نام کليد هاي صفحه کليد و کدي که هر يک ميسازند) کد &H16 , &HF0 , &H16 ارسال شود و براي کليد DELETE بايد کد &HE0 , &H71 , &HE0 , &HF0 &H71 ارسال شود
و .... در زير کد مربوط به کليد هاي مدياپلير و ديگر کليد هاي موجود بر روي صفحه کليد را مشاهده مي فرماييد:
ميخواهيم با يک کليد صدا را کم و با کليد ديگر صدا را زياد کنيم براي اين کار چند روش وجود دارد که يکي از آنها در زير امده است :
$regfile = "m16def.dat"
$crystal = 8000000
Enable Interrupts
Config Atemu = Int1 , Data = Pind.3 , Clock = Pinb.0
Waitms 500
Config Porta = Input
Q:
Debounce Pina.0 , 1 , Vup
Debounce Pina.0 , 1 , Vdown
Goto Q
Vup:
Sendscankbd Data1
Waitms 500
Goto Q
Vdown:
Sendscankbd Data2
Waitms 500
Goto Q
End
Data 5 , &HE0 , &H32 , &HE0 , &HF0 , &H32
Data2:
Data 5 , &HE0 , &H21 , &HE0 , &HF0 , &H21
omidvarshoei
2011/1/31, 07:19 PM
اتصال به عنوان موس به کامپيوتر :
نکته مهم : اتصال AVR به عنوان موس به کامپيوتر، که در بسکام به نام PS2EMU نام گذاري شده رايگان نبوده و کامپايلر در هنگام کامپايل کردن برنامه هاي مربوطه ( که در زير دو مورد آن موجود است ) از شما خطاي عدم وجود لايبري را ميگيرد ، شما بايد در HELP بسکام گزينه ي AT_EMULATOR را جستجو کنيد ، در صفحه پيدا شده طريقه تهيه لايبري امده است.
راه اندازي اين مورد با دستور زير انجام مي شود:
Config Ps2emu= Int , Data = Data , Clock = Clock
Int : شما ميتوالنيد از وقفه صفر يا يک براي اين مورد استفاده کنيد ( int0 يا int1)
Data : نام پايه اي از ميکرو است که سيم ديتاي پورت موس کامپيوتر (که شکل آن را در بالا مشاهده فرموديد ) به آن متصل مي شود. (سيم ديتاي سوکت موس بايد به پايه ورودي وقفه متصل شود (شما مجازيد از دوپايه INT0 و INT1 ( پايه 16 و 17 ميکرو مگا 16 )استفاده کنيد)) .
Clock : نام پايه اي از ميکرو است که سيم کلاک پورت موس کامپيوتر به آن متصل مي شود.
با دستور زير ميتوانيد کد هاي دلخواه را به کامپيوتر ارسال کنيد
Ps2mou***y X , Y, Button
X و Y مختصات مکان توقف اشاره گر موس است که از -255 تا 255 مي باشد.
Button : عدد معادل کليد فشرده شده ميباشد ( در روي موس 3 کليد اصلي وجود دارد : کليد راست ، کليد چپ، کليد وسط ) که رقم معادل هر کليد در زير امده است
0 – no buttons pressed
صفر : هيچ کليدي فشرده نشده است
1- left button pressed
يک : کليد سمت چپ فشرده شده است
2- right button pressed
دو : کليد سمت راست فشرده شده است
4- middle button pressed
چهار : کليد وسط فشرده شده است
با دستور زير نيز مي توانيد کد هاي مربوط به موس را از جدول بخوانيد و به کامپيوتر ارسال کنيد
Sendscan Lable
Lable : نام برچسبي است که کد ها در آن و جود دارد .
مانند:
$regfile = "m16def.dat"
$crystal = 8000000
Enable Interrupts
Config Ps2emu = Int0 , Data = Pind.2 , Clock = Pind.1
Config Porta = Input
Dim X As Integer , Y As Integer , Button As Byte
Q:
Debounce Pina.0 , 1 , Mright
Debounce Pina.1 , 1 , Mleft
Debounce Pina.2 , 1 , Mup
Debounce Pina.3 , 1 , Mdown
Debounce Pina.4 , 1 , Rpressed
Debounce Pina.5 , 1 , Lpressed
Debounce Pina.6 , 1 , Mpressed
Ps2mou***y X , Y , Button
Goto Q
Mright:
Incr X : Waitms 500 : Goto Q
Mleft:
Decr X : Waitms 500 : Goto Q
Mup:
Incr Y : Waitms 500 : Goto Q
Mdown:
Decr Y : Waitms 500 : Goto Q
Rpressed:
If Button = 2 Then : Button = 0 : Else : Button = 2 : End If
Waitms 500 : Goto Q
Lpressed:
If Button = 1 Then : Button = 0 : Else : Button = 1 : End If
Waitms 500 : Goto Q
Mpressed:
If Button = 4 Then : Button = 0 : Else : Button = 4 : End If
Waitms 500 : Goto Q
End
مثال:
$regfile = "m16def.dat"
$crystal = 8000000
Enable Interrupts
Config Ps2emu = Int0 , Data = Pind.2 , Clock = Pind.1
Dim A As Byte
Q:
Incr A
Wait 1
Select Case A
Case 1 : Ps2mou***y 0 , 10 , 0 ' up
Case 2 : Ps2mou***y 0 , -10 , 0 ' down
Case 3 : Ps2mou***y -10 , 0 , 0 ' left
Case 4 : Ps2mou***y 10 , 0 , 0 ' right
Case 5 : Ps2mou***y 0 , 0 , 1 ' left button pressed
Ps2mou***y 0 , 0 , 0 ' left button released
Case 6 : Sendscan W
End Select
Goto Q
W:
Data 3 , &H08 , &H00 , &H01
نکته : شما مجازيد فقط يک موس يا کيبرد به کامپيوتر خود متصل کنيد ، اتصال سخت افزار بيشتر ممکن است به کامپيوتر شما اسيب بزند .
اندازه گيري يک خازن يا مقاومت :
شما با استفاده از دستور زير ميتوانيد مقدار ثابت زماني مقاومت و خازني که به پايه دلخواه ميکرو AVR متصل شده است را بدست اوريد :
Var = Getrc ( Pin , number)
Var: يک متغيير از جنس Word ميباشد که مقدار ثابت زماني در آن ريخته مي شود.
PIN : نام پورتي است که خازن و مقاومت به آن متصل است ( مانند PORTA يا PORTD).
Number : شماره پايه اي است که مقاومت و خازن به آن متصل شده است (مانند 1 يا 2 ) ( اين مقدار نميتواند از 7 بيشتر شود )).
در مدارات مقاومت يا خازن که به اختصار به آن RC مي گويند ، خازن بعد از 5 ثابت زماني شارژ مي شود ( بعد از 5t ) مقدار دقيق اين ثابت زماني به مقدار خازن و مقدار مقاومت بستگي دارد و فرمول آن به شکل t = R * C است ، ميکرو مقدار ثابت زماني را اندازه مي گيرد ، شما با داشتن مقدار يکي از المانها ميتوانيد مقدار ديگر را بدست آوريد ،
مانند :
$regfile = "M16DEF.DAT"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Pinc.1 , Db5 = Pinc.2 , Db6 = Pinc.3 , Db7 = Pinc.4 , E = Pind.2 , Rs = Pind.3
Config Lcd = 16 * 2
Config Porta = Output
Dim W As Word
Do
W = Getrc(pina , 7) : W = W / 1000 : Locate 1 , 1 : Lcd W : Wait 2
Loop
end
در مثال بالا مقدار يک خازن اندازه گرفته شده است ، خازن مجهول با يک مقاومت 1 کيلو اهم سري شده و PORTA.7 متصل شده است ، ( شما همچنين ميتوانيد مقدار مقاومت را نيز اندازه گيري کنيد ، به شرطي که مقدار خازن را بدانيد) مدار مثال بالا را در زير مشاهده مي کنيد :
omidvarshoei
2011/1/31, 07:20 PM
فصل پنجم : ورودی آنالوگ و وقفه
مبدل آنالوگ به ديجتال(ADC) :
گاهي نياز است که يک کميت بيروني (مانند دما و شدت صدا و شدت نور و... ) اندازه گيري شود ، براي اينکار از وسيله اي به نام سنسور استفاده مي شود. سنسور ها مقدار يک کميت آنالوگ را به ولتاژ يا جريان تبديل مي کند ، سپس اين ولتاژ انالوگ به مبدل انالوگ به ديجتال ميکرو داده مي شود و مبدل انالوگ به ديجتال مقدار ولتاژ را به کميت ديجتال متناظر تبديل ميکند ، سپس اين مقدار ديجتال با اعمال رياضي به مقدارعددي متناظر تبديل مي شود و روي LCD يا سون سگمنت نمايش داده مي شود .
حداکثر ولتاژي که مبدل انالوگ به ديجتال ،که از اين به بعد به آن Adcمي گوييم ميتواند اندازه بگيرد برابر با VCC است و اگر ولتاژ اعمالي از VCC بيشتر شود ممکن است مبدل انالوگ به ديجتال آسيب ببيند (معمولا بيشرين ولتاژ ورودي که به ADC اعمال ميکنند 4.5 ولت است) و کمترين ولتاژ اعمالي برابر با GND است .ADC به ازاي ولتاژ 5 ولت عدد 1023 و به ازاي صفر ولت عدد صفر را در متغيير مربوطه قرارمي دهد .
Adcبا دستور زير راه اندازي مي شود :
Config Adc = Single/Free , Prescaler = Auto , Reference = Opt
گزينه هاي single/free : در حالتي که Single انتخاب شود مقدار ديجتال سيگنال انالوگ توسط دستور Getadc در يک متغيير از جنس Word ريخته مي شودو در حالتي که Free انتخاب شود مقدار ديجتال سيگنال انالوگ کانال صفر در ريجيستر مربوط به Adc ريخته مي شود .
Prescaler : اين گزينه فرکانس ADC را مشخص ميکند و در حالتي که Autoانتخاب شود کامپاير با توجه به کريستال انتخاب شده بهترين کلاک را در نظر مي گيرد ، موارد ديگر براي کلاک عبارتند از 2 و 4 و 8 و 15 و 32 و 64 يا 128 است که يه جاي گزينه Auto نوشته مي شود .
هر چه عدد کمتری وارد شود فرکانس فوق بیشتر است .
Reference : در صورتي که بخواهيد از يک ولتاژ مرجع استفاده کنيد اين گزينه را بنويسيد (در صورت عدم استفاده از اين دستور ولتاژ مرجع زمين است و نيازي به نوشتن اين دستور نيست) .
(اين امکان فقط در بعضي از ميکرو ها وجود دارد ) Opt ميتواند يکي از موارد زير باشد :
Off : در اين حالت ولتاژمرجع داخلي خاموش شده و از ولتاژ مرجع بر روي پايه Aref استفاده مي شود.
Avcc : در اين حالت ولتاژ پايه Avcc به عنوان ولتاژ مرجع در نظر گرفته مي شود .
Internal : در اين حالت از ولتاژ مر جع داخلي 2.65 ولت استفاده مي شود .
بعد از راه اندازي Adc نوبت به استفاده از آن است براي اينکار با دستور Start Adc ، ADC روشن شده و شروع به نمونه برداري از سيگنال انالوگ موجود بر روي پايه اش مي کند و آن را به مقدار ديجتال تغيير مي دهد ، اين مقدار ديجتال با دستور زير در يک متغيير از جنس Word ريخته مي شود
Var = Getadc (Channel)
Var يک متغيير از جنس Word ميباشد
Channel : شماره : شماره Adc است که سيگنال انالوگ به آن اعمال شده . مانند :
$regfile = "m8def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pinb.2 , Db5 = Pinb.3 , Db6 = Pinb.4 , Db7 = Pinb.5 , Rs = Pinb.0 , E = Pinb.1
Config Adc = Single , Prescaler = Auto
Dim A As Word
Start adc
Q:
A = Getadc(1)
Locate 1 , 1
Lcd A
Goto Q
End
در خط هاي اول LCD و ADC پيکر بندي شده است در خط دهم مقدار انالوگ داده شده به پايه 24 ميکرو (PORTC.1) بعد از تبديل به مقدار ديجتال در متغيير A ريخته مي شود وسپس اين متغيير در سطر اول وستون اول LCD به نمايش در مي آيد .
مثال :
$regfile = "m16def.dat"
$crystal = 12000000
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Adc = Single , Prescaler = Auto
Dim A As Word , B As Word , C As Word , D As Word , E As Word , F As Word , G As Word , H As Word
Cls
Q:
A = Getadc(0) : Locate 1 , 1 : Lcd A
B = Getadc(1) : Locate 1 , 8 : Lcd B
C = Getadc(2) : Locate 2 , 1 : Lcd C
D = Getadc(3) : Locate 2 , 8 : Lcd D
E = Getadc(4) : Locate 3 , 1 : Lcd E
F = Getadc(5) : Locate 3 , 8 : Lcd F
G = Getadc(6) : Locate 4 , 1 : Lcd G
H = Getadc(7) : Locate 4 , 8 : Lcd H
Goto Q
End
در اين مثال از ميکرو مگا 16 و LCD 16*4 استفاده شده است ، ميکرو مگا 16 داراي 8 کانال ADC ميباشد ، که در اين مثال از همه ADC هاي اين ميکرو استفاده شده است .
ممکن است اين سوال براي شما پيش بيايد که : ADC نمي تواند بيشتر از 5 ولت را اندازه گيري کند ، ما ولتاژ هاي بالا تر را چگونه اندازه بگيريم؟ براي اندازه گيري ولتاژ هاي زياد شما بايد آن را با مقاومت کم کنيد ، فرض کنيد يک ولتاژ از 0 تا 200 ولت متغيير داريد و ميخواهيد آن را با ميکرو اندازه بگيريد ، شما بايد اين ولتاژ متغيير را به 0 تا 5 ولت تبديل کنيد ...
اين موارد در بخش پروژه ها آورده شده است.
مقايسه کننده انالوگ :
مقايسه کننده آنالوگ مقادير ولتاژ آنالوگ موجود بر روي دو پايه خود را ( پايه مثبت (AIN0) و پايه منفي (AIN1) ) با هم مقايسه مي کند . (مانند OP-AMP ) زماني که ولتاژ موجود در ورودي مثبت بيشتر از ولتاژ موجود در ورودي منفي باشد ، خروجي مقايسه کننده (AC0) يک مي شود . مقايسه کننده داراي يک پرچم وقفه مجزا است . خروجي مقايسه کننده مي تواند به عنوان تريگر ورودي CAPTURE تايمر/ کانتر يک نيز استفاده شود .
دستور پيکره بندي مقايسه کننده آنالوگ
Config Aci = On/Off , Compare = On/Off , Triggle = Toggle/Rising/Falling
Config Aci = On/Off : در زمان استفاده از مقايسه کننده بايد يک باشد . (در صورت استفاده از صفر مقايسه کننده کار نخواهد کرد).
Compare = On/Off: در صورت انتخاب On ، AC0 مستقيما به ورودي Capture تايمر/کانتر يک وصل مي شود.
Triggle = Toggle/Rising/Fallingl : نحوه روي دادن وقفه مقايسه کننده را نشان مي دهد.
Falling : يک لبه پايين رونده در خروجي مقايسه کننده باعث يک شدن پرچم وقفه مقايسه کننده و اجرا شدن برنامه وقفه خواهد شد.
Rising : يک لبه بالا رونده در خروجي مقايسه کننده باعث يک شدن پرچم وقفه مقايسه کننده و اجرا شدن برنامه وقفه خواهد شد.
Toggle : يک به صفر يا يک صفر به يک در خروجي مقايسه کننده باعث يک شدن پرچم وقفه مقايسه کننده و اجرا شدن برنامه وقفه خواهد شد.
مثال :
$regfile = "m8def.dat"
$crystal = 16000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portc.0
Config Portd = Input
Config Aci = On , Compare = On , Trigger = Falling
Config Timer1 = Timer , Capture Edge = Falling , Noise Cancel = 1 , Prescale = 1024
Enable Interrupts
Enable Icp1
Enable Aci
On Aci Q
Dim A As Byte
Do
Locate 1 , 1
Lcd Timer1
Loop
End
Q:
Locate 2 , 1
Lcd Capture1
Stop Timer1
Return
در مثال بالا تايمر يک در مد Capture راه اندازي شده است ، در اين مد در صورتي که يک لبه به پايه ICP (پايه 14 مگا 8 ) اعمال شود ،مقدار شمرده شده توسط تايمر 1 در ريجستر Capture1 ريخته مي شود و شما ميتوانيد از اين مقدار استفاده کنيد . در مثال به جاي لبه بالا رونده از وقفه مقايسه گر استفاده شده است ، هنگامي مقدار ولتاژ پايه مثبت مقايسه گر از ولتاژ پايه منفي بيشتر شود وقفه فعال شده و مقدار شمرده شده توسط تايمر در ريجستر Capture1 ريخته مي شود و سپس در موقعيت 2و1 روي LCD به نمايش در ميايد ، شما ميتوانيد در زير روال وقفه از هر دستور ديگري نيز استفاده کنيد ، با اسفاده از اين روش ميتوان زمان تناوب پالس رو اندازه گرفت.
کار با تایمر ها را در بخش های بعدی یاد خواهید گرفت .
راه اندازي وقفه هاي خارجي :
با استفاده از دستور زير ميتوان منابع وقفه خارجي را راه اندازي کرد :
Config IntX = State
intX : X نام پايه وقفه است که در اکثر ميکرو ها به نام INT0 و INT1 و در بعضي از ميکرو ها مانند مگا 64 به نام INT0 تا INT7 موجود است .
State : نوع پالس اعمالي براي فعال شده وقفه را معين ميکند ، State ميتواند يکي از موارد زير باشد:
Falling : با اعمال يک پالس پايين روند ( يک به صفر ) به پايه مورد نظر وقفه فعال مي شود .
Rising : با اعمال يک پالس بالا رونده( صفر به يک ) به پايه مورد نظر وقفه فعال مي شود.
Low Level : با اعمال سطح صفر به پايه مورد نظر وقفه فعال مي شود.
سپس با دستور Enable Interrupts وقفه سراسري و بادستور Enable IntX وقفه پيکر بندي شده فعال مي شود.و در نهايت شما ميتوانيد با دستور On IntX Lable ، به هنگام اعمال پالس به Lable مورد نظر پرش کنيد .با فعال شدن وقفه ، پايه هاي ورودي وقفه در همه حالت ها چک مي شود و نيازي به اوردن دستورات در حلقه اصلي وديگر حلقه ها نيست . باز گشت از زير بزنامه با دستور Return انجام مي شود .
مانند:
$regfile = "m16def.dat" : $crystal = 8000000
Config Porta = Output
Config Int0 = Falling
Config Int1 = Rising
Enable Int0
Enable Int1
Enable Interrupts
On Int0 Q
On Int1 W
Do
Set Porta.2 : Waitms 500 : Reset Porta.2 : Waitms 500
Loop
End
Q:
If Porta.0 = 0 Then : Set Porta.0 : Else : Reset Porta.0 : End If
Return
W:
If Porta.1 = 0 Then : Set Porta.1 : Else : Reset Porta.1 : End If
Return
در برنامه بالا از دو منبع وقفه INT0 و INT1 استفاده شده است ، همانگونه که ميبينيد به يکي از پايه ها يک پالس بالا رودنده و به ديگري پالس پايين رونده اعمال مي شود.
در حلقه ي اصلي مدام يکي از پايه ها خاموش وروشن مي شود ، درو منبع وقفه مدام چک ميشوند ، هنگامي که پالس مشخص شده به پايه وقفه اعمل شد به زير برنامه تعريف شده (Q براي منبع وقفه صفر و W براي منبع وقفه یک) پرش مي شود و وضعيت دو LED تغيير ميکند . مدار مورداستفاده را مشاهده مي فرماييد . (اين ميکرو داراي منبع وقفه خارجي سوم نيز ميباشد که در اينجا استفاده نشده (INT2 پايه B.3) ميتوانند واردشود .
WATCHDOG:
WATCHDOG يکي از تايمر هاي ميکرو است که ميتواند تا يک زمان خاص بشمارد و ميکرو را ريست کند ، اين تايمر ميتواند تا 8 زمان 16 ، 32، 64 ، 128 ، 256 ، 512 ، 1024 و 2048 و در بعضي از ميکروها 4096 , 8192 ميلي ثانيه بشمارد ، بعد از سپري شدن زمان ميکرو ريست مي شود و برنامه دوباره از ابتدا اجرا مي شود ، راه اندازي WATCHDOG به فرم زير است :
Config Watchdog = Time
Time : يکي از زمان هاي گفته شده در بالا ميباشد ( 16 ، 32، 64 ، 128 ، 256 ، 512 ، 1024 و 2048 و در بعضي از ميکروها 4096 , 8192 ميلي ثانيه) . با دستور Start Watchdog تايمر شروع به شمارش مي کند و پس از سپري شدن زمان ميکرو ريست مي شود.
مانند :
$regfile = "m16def.dat"
$crystal = 8000000
Config Porta.0 = Input
Config Porta.1 = Output
Config Watchdog = 1024
Do
If Pina.0 = 0 Then
Set Porta.1
Else
Start Watchdog
End If
Loop
End
در مثال بالا پايه A.0 ( که در حالت عادي 1 است) مدام چک مي شود و در صورتي که پايه 0 شود ميکرو بعد از 1024 ميلي ثانيه ريست مي شود.
omidvarshoei
2011/1/31, 07:22 PM
بچه ها تا یک ماه اینده خداحافظ امیدوارم روزای خوبی در انتظارتون باشه
موفق باشین
ورشوئی
royalblue
2011/2/02, 03:28 PM
با اینکه
فروم یعنی اینکه یه نفر سوال کنه 10 نفر جوابش بدن نه اینکه 10 نفر سوال کنن یه نفر جواب بده
ولی ان شاا... هر جایی که میرید بهتون خوش بگذره و سالم و سلامت بر گردید و دوباره شروع کنید
و همیشه و همه جا موفق باشید
dashrezapes
2011/2/05, 12:28 PM
سلام . خسته نباشید. دست شما درد نکنه . اگه میشه با چند تا برنامه حرفه ای کارتون رو ادامه بدید ممنون میشم . در ضمن من چند وقتی کار کردم و بعد از یک سال و نیم می خوام دوباره شروع کنم . در ضمن می خوام یک پروگرمر جدید بخرم حوصله و وقتش ساختنش رو ندارم ، اگه مدل خاصی را مد نظر دارید لطفا" معرفی کنید . ممنون از اینکه حوصله کردید و خواندید . سپاسگزارم .
ramos_kk77
2011/2/05, 12:52 PM
سلام . خسته نباشید. دست شما درد نکنه . اگه میشه با چند تا برنامه حرفه ای کارتون رو ادامه بدید ممنون میشم . در ضمن من چند وقتی کار کردم و بعد از یک سال و نیم می خوام دوباره شروع کنم . در ضمن می خوام یک پروگرمر جدید بخرم حوصله و وقتش ساختنش رو ندارم ، اگه مدل خاصی را مد نظر دارید لطفا" معرفی کنید . ممنون از اینکه حوصله کردید و خواندید . سپاسگزارم .
سلام:gol: من خودم از پروگرمر هاي جيبي هاتل استفاده ميكنم و راضيم هستم
dashrezapes
2011/2/06, 07:09 AM
سلام . آقا دست شما درد نکنه من دیشب داشتم می خوندم عالی بود همه چیز مفید و مختصر بود . اگه کتابی در این زمینه دارید لطفا" معرفی کنید . من یک کم بیش از حد به ریزه کاریهای مطالب می پردازم می خوام توی avr دریا باشم نه یک استخر کم آب . بازم ازتون تشکر می کنم . خسته نباشید .
ramos_kk77
2011/2/06, 05:41 PM
سلام . آقا دست شما درد نکنه من دیشب داشتم می خوندم عالی بود همه چیز مفید و مختصر بود . اگه کتابی در این زمینه دارید لطفا" معرفی کنید . من یک کم بیش از حد به ریزه کاریهای مطالب می پردازم می خوام توی avr دریا باشم نه یک استخر کم آب . بازم ازتون تشکر می کنم . خسته نباشید .
سلام عزيزم :gol:.مرسي.:heart:
منظورت كتاب تو چه زمينه اي دقيقا باشه .avrميخاي؟به كدوم زبون برنامه نويسي؟آموزش و كتاب آخه از همه مدل وهمه نوع زبون برنامه نويسي هست.من خودم يه سري آموزش دارم.اگه دقيقتر بگي چي ميخاي شايد در حدي باشم كه بتونم كمكت كنم;)
omidvarshoei
2011/2/06, 10:18 PM
سلام . آقا دست شما درد نکنه من دیشب داشتم می خوندم عالی بود همه چیز مفید و مختصر بود . اگه کتابی در این زمینه دارید لطفا" معرفی کنید . من یک کم بیش از حد به ریزه کاریهای مطالب می پردازم می خوام توی avr دریا باشم نه یک استخر کم آب . بازم ازتون تشکر می کنم . خسته نباشید .
سلام به همه دوستان میبخشید بچه ها تنهاتون گذاشتم به هر حال زندگی خرج داره
دوست عزیز اگه میخوای در هر زمینه ای پیشرفت کنید باید خودتون بیفتین دنبالش اگه کتاب در زمینه برنامه نویسی بسکام میخواین کتاب مهندس کاهه خوبه ولی همینطور که گفتم خودت باید برنامه نویسی کنی تا میتونی تا دریا بشی
فقطم به avr تکیه نکن
mehdi_m_kh
2011/2/08, 12:29 PM
سلام به همه دوستان میبخشید بچه ها تنهاتون گذاشتم به هر حال زندگی خرج داره
دوست عزیز اگه میخوای در هر زمینه ای پیشرفت کنید باید خودتون بیفتین دنبالش اگه کتاب در زمینه برنامه نویسی بسکام میخواین کتاب مهندس کاهه خوبه ولی همینطور که گفتم خودت باید برنامه نویسی کنی تا میتونی تا دریا بشی
فقطم به avr تکیه نکن
سلام دوست عزیز من تازه این تاپیک رو دیدم من یک سری از مطالبی که گذاشته بودی رو خوندم
من رشتم قدرته دوست دارم با avr ها هم کار کنم و آشنایی با اونا و برنامه نویسیش داشته باشم و اینم بگم که هیچ نوع اطلاعات اولیه ای از avr ها ندارم
می تونید کمکم کنید که چیکار کنم و راه یادگیریش رو بم بگید؟
ممنون از لطفت
ramos_kk77
2011/2/08, 06:20 PM
سلام دوست عزیز من تازه این تاپیک رو دیدم من یک سری از مطالبی که گذاشته بودی رو خوندم
من رشتم قدرته دوست دارم با avr ها هم کار کنم و آشنایی با اونا و برنامه نویسیش داشته باشم و اینم بگم که هیچ نوع اطلاعات اولیه ای از avr ها ندارم
می تونید کمکم کنید که چیکار کنم و راه یادگیریش رو بم بگید؟
ممنون از لطفت
سلام:gol:
به نظرمن آسونترين وجذابترين زبون برنامه نويسي با avr همين زبان بيسكامه كه دوستمون اميدجان داره تو اين تاپيك خيلي قشنگ آموزش ميده .البته كتاب مرجع بيسكام در بازار فعلا كتاب آقاي كاهه هست.
در مورد خود avrها كه اصلا چي هستن و چي نيستن هم همون كتاب و كتاب ميكروكنترلر آقاي پرتوي فر هم مطالب خوبي در شروع كتاباشون دارن.
درباره avr ها تو اينترنت هم من مطلب زياد پيدا كردم.
موفق باشي :gol:
omidvarshoei
2011/2/09, 10:59 PM
فصل ششم : تایمر و کانتر
ميکرو هاي AVR نهايتا داراي سه تايمر / کانتر هستند (به جز, MEGA64 , MEGA162 MEGA128 وتعداد محدود ديگرکه 4 تايمر یا بیشتر دارند) . اين تايمر / کانتر ها به نام هاي تايمرکانتر 0 و تايمرکانتر1 و تايمرکانتر2 و تايمرکانتر 3 ، نام گذاري مي شوند . کار تايمر ها شمردن تا يک عدد خاص و کار کانتر ها شمردن يک پالس ، که به پايه مخصوص اعمال مي شود است ، از تايمر و کانتر استفاده هاي ديگري نيز مي شود ، مانند ساخت پالس PWM و ...که در ادامه آنها را معرفي مي کنيم .
اولين تايمر /کانتري که معرفي مي شود تايمر صفر است ، در زير مشخات اين مورد را مشاهده ميفرماييد:
1- اين تايمر/ کانتر 8 بيتي است ، و نهايتا ميتواند تا 8^2 (255( بشمارد .
2- کلاک اين تايمر ميتواند تو سط نوسان ساز داخلي يا نوسان ساز خارجي تامين شود (مقدار فرکانس نوسان ساز بر عدد Preacale تقسيم مي شود).
3- اين تايمر داراي چندين منبع وقفه ميباشد که شما ميتوانيد آنها را در هر قسمت از برنامه فعال يا غير فعال کنيد . از اين منابع و قفه ميتوان وقفه سرريزي را نام برد.
4- اين تايمر/کانتر ميتواند در مد تايمر و کانتر راه اندازي شود .
5- ورودي کانتر پايه T0 (در ميکرو مگا 16 پورت B.0 ، پايه شماره1) مي باشد .
راه اندازي تايمر صفر:
تايمر صفر با دستور زير پيکر بندي مي شود:
Config Timer0 = Timer , Preacale = 1 | 8 | 64 | 256 | 1024
عدد Preacale فرکانس (دقت ) تايمر را معيين ميکند .
بعد از دستور بالا، تايمر با دستور Start Timer0 شروع به شمارش ميکند و با دستور Stop Timer0 متوقف مي شود.
تايمر پس از شمردن تا 255 سر ريز مي شود .
شما با استفاده از دستور Enable Ovf0ياEnable Timer0 ميتوانيد و قفه سرريزي تايمر را راه اندازي کنيد . در صورتي که وقفه سرريزي تايمر فعال باشد ، تايمر پس از سرريزي به برچسبي که با يکي از
دستورات On Ovf0 Lable و يا On Timer0 Lable مشخص شده پرش ميکند ، باز گشت از وقفه با دستور Return انجام مي شود.
شما همچنين ميتوانيد با استفاده از دستور Var = Timer0 ، مقدار تايمر را در يک متغير از جنس بايت قرار دهيد و يا با دستور Timer0 = Value ، مقدار اوليه اي در تايمر قرار داد تا تايمر از آن شروع به شمارش کند .
در اين مثال ميخواهيم توسط تايمر صفر زمان 1 ثانيه بسازيم ، طبق فرمول اگر شما از کريستا ل 1 مگا هرتز ( که کمترين مقدار کريستال مورد استفاده براي AVR ميباشد (به جز کريستال ساعت )) و Preacale ، 1024 استفاده نماييد ، بيشترين زماني که ميتوانيد ايجاد کنيد برابر است با :
زمان=1000000/(256*10244)
بنابراين ما بايد از وقفه سريزي تايمر استفاده کنيم ، و در هر بار وقفه به يک متغير عددي يک واحد بيفزاييم ، هنگامي که متغيير برابر4 شد ، متغيير صفر شود و يک واحد به متغير اصلي افزوده شود . بنابراين با ضرب کردن زمان بدست امده در 4 زمان اصلي بدست ميايد که برابر با 1048 ميلي ثانيه است .
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Dim B As Byte , C As Byte
Config Timer0 = Timer , Prescale = 1024
Enable Interrupts
Enable Timer0
On Timer0 P
Start Timer0
Do
Loop
End
P:
Locate 1 , 8 : Lcd B
Incr B
If B > 3 Then : Incr C : Locate 1 , 1 : Lcd C : B = 0 : End If
return
در اين برنامه ، هنگامي که تايمر سرريز مي شود (تا 255 ميشمارد) به زير برنامه P پرش مي شود و يک واحد به متغيير B افزوده مي شود ، شرط If ميگويد که اگر مقدار متغير B برابر با 4 شد يک واحد به متغير C اضافه کن و آن را در سطر اول ، ستون اول LCD نمايش بده ، بعد متغير B را صفر کن ، از آنجا که مقدار B به 4 نريسيده (در اولين رجوع مقدار B 1 مي شود) اين شرط اجرا نمي شود .
با دستور Return به برنامه تايمر برميگردد . مقدار تايمر صفر شده و دوباره تا 255 شمرده مي شود ... و اين عمل مدام تکرار مي شود. با چند دستور ساده ميتوان از برنامه بالا يک ساعت ساخت .
راه اندازي کانتر صفر :
کانتر صفر در بسکام با دستور زير پيکربندي مي شود:
Config Timer0 = Counter , Edge = Rising / Falling
با انتخاب Edge = Rising کانتر نصبت به لبه ي بالا رونده حساس است
با انتخاب Edge = Falling کانتر نصبت لبه ي پايين رونده حساس است
(لبه هاي بالا رونده يا پايين رونده را ميشمارد (بالا رونده >صفر به يک و پايين رونده< يک به صفر))
شما همچنين ميتوانيد با استفاده از دستور Var = Counter0 ، مقدار کانتر را در يک متغير از جنس بايت قرار دهيد و يا با دستور Counter0 = Value ، مقدار اوليه اي درکانتر قرار دهيد تا کانتر از آن شروع به شمارش کند.کانتر نيز مانند تايمر پس از شمردن تا 255 سر ريز مي شود ، شما با استفاده از دستور Enable Ovf0 ميتوانيد وقفه سر ريزي کانتر را راه اندازي کنيد . در صورتي که وقفه سرريزي کانتر فعال باشد ، کانتر پس از سرريزي به برچسبي که با يکي از دستورات On Ovf0 Lable و يا On Timer0 Lable مشخص شده پرش ميکند ، باز گشت از وقفه با دستور Return انجام مي شود.
مثال :
در اين مثال کانتر صفر تعداد پالسهاي اعمالي به پايه T0 (پايه شماره 1 مگا 16 ) را ميشمارد و پس از شمردن تا مقدار 255 ، به زير برنامه وقفه ميرود ، در آنجا يک واحد به متغيير B افزوده مي شود ، متغيير B تعداد دفعات سرريزي کانتر را نشان ميدهد که ما آن را روي سطر دوم LCD به نمايش ميگذاريم ، برنامه با دستور Return از زير برنامه خارج مي شود و به حلقه اصلي برمي گردد .
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Dim B As Byte
Config Timer0 = Counter , Edge = Rising
Enable Interrupts
On Counter0 P
Do
Locate 1 , 1 : Lcd Counter0
Loop
End
P:
Incr B : Locate 2 , 1 : Lcd "tedad dafeat sarrizi" ; B
Return
نکته : عملکرد تايمر و کانتر از عملکرد ساير قسمت ها جدا بوده و ديگر اعمال (مانند دستورات تاخير مثل wait و...) بر عملکرد آن اثري ندارد.
تايمر / کانتر يک :
در زير مشخات اين مورد را مشاهده ميفرماييد:
1- اين تايمر کانتر 16 بيتي است ، و نهايتا ميتواند تا 16^2 (65535( بشمارد.
2- کلاک اين تايمر ميتواند تو سط نوسان ساز داخلي يا نوسان ساز خارجي يا از پايه T1 (در مگا 16 پايه شماره2 (PORTB.1) توسط پالس خارجي، تامين شود (مقدار فرکانس نوسان ساز بر عدد Preacale تقسيم مي شود).
3- تايمر / کانتر يک داراي دو خروجي مقايسه اي است که دو رجيستر OCR1A و OCR1B 3مقدار مقايسه اي را در خود جاي مي دهند و با محتواي تايمر/کانتر مقايسه مي شوند .
4- در زمان تساوي محتواي رجيستر مقايسه و محتواي تايمر/کانتر ، وضعيت پايه هاي خروجي مد مقايسه اي OC1A و OC1Bمي تواند تغيير کند.
5- تايمر / کانتر در مد Capture نيز مي تواند به کار رود . با تحريک پايه ICP مي توان محتواي تايمر/ کانتر را در رجيستر ورودي Capture(Icr1) قرار داد.
6- خروجي مقايسه کننده آنالوگ نيز مي تواند به عنوان تريگر ورودي Capture قرار گيرد.
7- اين تايمر داراي چندين منبع وقفه ميباشد که شما ميتوانيد آنها را در هر قسمت از برنامه فعال يا غير فعال کنيد. از اين منابع و قفه ميتوان ، وقفه سرريزي را نام برد.
8- اين تايمر کانتر ميتواند در مد تايمر و کانتر وPWM راه اندازي شود.
9- ورودي کانتر پايه T1 (در ميکرو مگا 16 پورت B.0 ، پايه شماره1) ميباشد و خروجي پالس PWM پايه هاي OC1A و OC1B (در ميکرو مگا 16 به ترتيب پايه هاي 18و19 (PORTD.4 و D.5)است همچنين دو پايه ي فوق ميتوانند به عنوان خروجي مد مقايسه اي تايمر مورد استفاده قرار بگيرند .
راه اندازي تايمر يک :
تايمر 1 با دستور زير پيکربندي مي شود :
Config Timer1 = Timer , Prescale = 1| 8 | 64 | 256 | 1024
عدد Preacale فرکانس تايمر را معيين ميکند .فرکانس و زماني که تايمر ميشمارد از فرمولهاي زير محاسبه ميشوند:
فرکانس = مقدار کریستال/precacle
بعد از دستور بالا، تايمر با دستور Start Timer شروع به شمارش ميکند و با دستور STOP TIMER متوقف مي شود.تايمر پس از شمردن تا 65536 (16^2) سر ريز مي شود ، شما با استفاده از دستور ENABLE OVF1ياENABLE INTRRUPTS ميتوانيد وقفه سر ريزي تايمر را راه اندازي کنيد . در صورتي که وقفه سرريزي تايمر فعال باشد ، تايمر پس از سرريزي به برچسبي که با يکي از دستورات ON OVF1 LABLE و يا ON TIMER1 LABLE مشخص شده پرش ميکند ، باز گشت از وقفه با دستور RETURN انجام مي شود.
شما همچنين ميتوانيد با استفاده از دستور VAR = TIMER1 ، مقدار تايمر را در يک متغير از جنس word قرار دهيد و يا با دستور TIMER1 = VALUE ، مقدار اوليه اي در تايمر قرار دهيد تا تايمر از آن شروع به شمارش کند.
در اين مثال ميخواهيم توسط تايمر 1 يک ساعت بسازيم ، براي اين کار ابتدا بايد يک زمان 1 ثانيه اي ايجاد کنيم طبق فرمول اگر شما از کريستا ل 4 مگا هرتز و PRESCALE ، 64 استفاده نماييد ، ميتوانيد زماني برابر با 1.04 ثانيه ايجاد کنيد ، با مقادير ديگر نيز ميتوانيد زمان هاي دقيق تر بسازيد .(بيشترين زماني که با اين تايمر ميتوانيد بسازيد برابر با 67.108864 ثانيه ميباشد)
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Dim San As Byte , Da As Byte , Saat As Byte
San = 0 : Da = 0 : Saat = 1
Config Timer1 = Timer , Prescale = 64
Enable Interrupts
Enable Timer1
On Timer1 P
Start Timer1
Do
Locate 1 , 1 : Lcd Saat ; ":" ; Da ; ":" ; San
Loop
End
P:
Incr San
If San > 59 Then : Incr Da : San = 0 : End If
If Da > 59 Then : Incr Saat : Da = 0 : End If
If Saat > 12 Then : San = 1 : End If
Return
در برنامه بالا هنگامي که تايمر سرريز مي شود به زير برنامه p پرش مي شود در آنجا متغيير ثانيه 1 واحد افزايش مي يابد ، ....
omidvarshoei
2011/2/09, 11:00 PM
راه اندازي تايمر 1 در مد مقايسه اي (Compare :
در اين مد شما ميتوانيد مقدار تايمر 1 را با دو عدد دلخواه مقايسه کنيد و درصورت برابري يا نابرابري مقدار تايمر با مقدار دلخواه وضعيت پايه هاي oc1a و oc1b را تغيير دهيد. راه اندازي تايمر يک در مد مقايسه اي با دستورات زير انجام مي شود:
CONFIG TIMER1= TIMER,COMPARE A = CLEAR |SET|TOGGLE|DISCONNECT,COMPARE B = CLEAR |SET|TOGGLE|DISCONNECT, PRESCALE=1|8|64|256|1024,CLEAR TIMER =1|0
COMPARE A = CLEAR |SET|TOGGLE|DISCONNECT : زماني که مقدار شمرده شده توسط تايمر 1 با مقدار COMPARE A ، که بعدا معرفي مي شود ، برابر شد ،پايه خروجي OC1A مي تواند SET(يک) ,(صفر) CLEAR ,(برعکس ) TOGGLE و يا ارتباط پايه با مد مقايسه اي قطع شود (پايه oc1a به يک ورودي خروجي عادي تبديل شود).
COMPARE B = CLEAR |SET|TOGGLE|DISCONNECT : زماني که مقدار شمرده شده توسط تايمر 1 با مقدار COMPARE B ، که بعدا معرفي مي شود ، برابر شد ،پايه خروجي OC1B مي تواند SET(يک) ,(صفر) CLEAR ,(برعکس ) TOGGLE و يا ارتباط پايه با مد مقايسه اي قطع شود (پايه oc1b به يک ورودي خروجي عادي تبديل شود).
PRESCALE=1|8|64|256|1024 : عدد PREACALE فرکانس (دقت ) تايمر را معيين ميکند.
CLEAR TIMER = 1|0 : با انتخاب گزينه 1 ،محتواي تايمر/کانتر در زمان تطابق مقايسه اي RESET ($0000 ) مي شود و در صورت انتخاب 0 مقدار شمرده شده تغييري نميکند.
با دستورات زير ميتوان عددي را که محتواي تايمر بايد با آن مقايسه شود را تعيين کرد
Compare1a = x
Compare1b =x
به جاي x يک عدد ثابت يا يک متغيير قرار ميگيرد ، هنگامي که عدد شمرده شده توسط تايمر يک با اعداد گذاشته شده برابر شد ميکرو وضعيت پايه هاي مربوطه را همانگونه که در پيکربندي مشخص کرديد تغيير ميدهد.
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Timer1 = Timer , Compare A = Set , Compare B = Toggle , Prescale = 1024 , Clear Timer = 0
Compare1a = 1000
Compare1b = 5000
Do
Locate 1 , 1
Lcd Timer1
Loop
End
هنگامي که تايمر 1 تا 1000 شمرد پايه OC1A يک مي شود و هنگامي که مقدار شمرده شده به 5000 رسيد پايه OC1B يک مي شود (OC1A پايه 19 و OC1B پايه 18 مگا 16 ميباشد).
استفاده از وقفه مد مقايسه اي تايمر 1 :
مد مقايسه اي داراي 2 منبع وقفه ميباشد که با دستورات زير فعال ميشوند:
Enable Interrupts
Enable Oc1a
Enable Oc1b
با دستور فعال سازي وقفه مقايسه ، هنگامي که مقدار شمرده شده توسط ميکرو با Compare1a برابر شد cpu ميکرو با دستور on oc1a lable به برچسب مورد نظر برش ميکند و در آنجا عمليات دلخواه را انجام ميدهد، هنگامي که مقدار شمرده شده توسط ميکرو با Compare1b برابر شد cpu ميکرو با دستور on oc1b lable به برچسب مورد نظر برش ميکند و در آنجا عمليات دلخواه را انجام ميدهد. در صورتي که در پايان برچسب دستور Return گذاشته شود CPU به حلقه ي اصلي پرش ميکند.
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Timer1 = Timer , Compare A = Set , Compare B = Toggle , Prescale = 1024 , Clear Timer = 0
Compare1a = 2120
Compare1b = 63000
Enable Interrupts
Enable Oc1a
Enable Oc1b
On Oc1a Q
On Oc1b W
Do
Locate 1 , 1
Lcd Timer1
Loop
End
Q:
Locate 2 , 1
Lcd Timer1
Return
W:
Locate 2 , 8
Lcd Timer1
Return
در مثال بالا هنگامي که رقم شمرده شده توسط تايمر با مقدار Compare1a (2120) برابر شد cpu به برچسب q پرش ميکند و در آنجا مقدار شمرده شده توسط تايمر را بر روي lcd نمايش داده و با دستور return به حلقه ي اصلي برميگردد ، هنگامي که رقم شمرده شده توسط تايمر با مقدار Compare1b (63000) برابر شد cpu به برچسبw پرش ميکند و در آنجا مقدار شمرده شده توسط تايمر را بر روي lcd نمايش داده و با دستور return به حلقه ي اصلي برميگردد .همچنين در مورد اول پايه oc1a يک مي شود و در مورد دوم وضعيت پايه oc1b تغيير ميکند ( در صورت 0 بودن يک مي شود و بلعکس).
راه اندازي تايمر 1 در مد CAPTURE :
در صورتي که تايمر يک را در اين مد پيکربندي کنيد ، با اعمال يک پالس بالا رونده يا پايين رونده (که نوع آن در هنگام پيکر بندي مشخص مي شود ) به پايه icp (پايه 20 مگا 16 ) ، در همان لحظه مقدار شمرده شده توسط تايمر 1 در ريجيستر CAPTURE قرار ميگيرد ، محتواي رجيستر CAPTURE را مي توان با دستور VAR = CAPTURE در يک متغيير از جنس word قرار داد .
راه اندازي تايمر يک در مد CAPTURE با دستورات زير انجام مي شود:
Config Timer1 = Timer, Capture Edge= Falling | Rising ,Noise Cancel=1|0 , Prescale =1|8|64|256|1024
Capture Edge= Falling | Rising : اين گزينه مشخص ميکند ، پالس اعمالي به پايه icp بالا رونده (Falling) است يا پايين رونده (Rising).( CAPTURE به کدام پالس حساسيت نشان ميدهد)
Noise Cancel=1|0 : در صورت انتخاب يک از نويز هاي موجود بر روي پايه icp چشم پوشي مي شود و هر پالس با لبه ي تعين شده ميتواند CAPTURE را راه اندازي کند ،در صورت انتخاب صفر فقط پالس هاي با دامنه ي 5 ولت قادر به راه اندازي CAPTURE خواهند بود.
Prescale =1|8|64|256|1024 :دقت تايمر را نشان ميدهد (با استفاده از اين مقدار و مقدار کريستال ميتوانيد زمان شمرده شده توسط تايمر تا هنگام سرريزي را با فرمولي که در بالا گفته شد محاسبه کنيد) با دستور Enable Icp1 اين مد فعال مي شود و پايه icp اماده دريافت پالس ميگردد . مانند:
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Timer1 = Timer , Capture Edge = Falling , Noise Cancel = 1 , Prescale = 1024
Do
Locate 1 , 1
Lcd Timer1
Locate 2 , 1
Lcd Capture1
Loop
End
در مثال بالا هنگامي که يک پالس بالا رونده به پايه icp اعمال مي شود مقدار شمرده شده توسط تايمر 1 درون ريجيستر Capture قرار ميگيرد و سپس بر روي lcd نمايش داده مي شود . مدار استفاده شده براي مثال بالا و ساير مثال هاي اين بخش را مشاهده مي فرماييد
mehdi_m_kh
2011/3/16, 08:32 PM
راه اندازي تايمر 1 در مد مقايسه اي (Compare :
در اين مد شما ميتوانيد مقدار تايمر 1 را با دو عدد دلخواه مقايسه کنيد و درصورت برابري يا نابرابري مقدار تايمر با مقدار دلخواه وضعيت پايه هاي oc1a و oc1b را تغيير دهيد. راه اندازي تايمر يک در مد مقايسه اي با دستورات زير انجام مي شود:
CONFIG TIMER1= TIMER,COMPARE A = CLEAR |SET|TOGGLE|DISCONNECT,COMPARE B = CLEAR |SET|TOGGLE|DISCONNECT, PRESCALE=1|8|64|256|1024,CLEAR TIMER =1|0
COMPARE A = CLEAR |SET|TOGGLE|DISCONNECT : زماني که مقدار شمرده شده توسط تايمر 1 با مقدار COMPARE A ، که بعدا معرفي مي شود ، برابر شد ،پايه خروجي OC1A مي تواند SET(يک) ,(صفر) CLEAR ,(برعکس ) TOGGLE و يا ارتباط پايه با مد مقايسه اي قطع شود (پايه oc1a به يک ورودي خروجي عادي تبديل شود).
COMPARE B = CLEAR |SET|TOGGLE|DISCONNECT : زماني که مقدار شمرده شده توسط تايمر 1 با مقدار COMPARE B ، که بعدا معرفي مي شود ، برابر شد ،پايه خروجي OC1B مي تواند SET(يک) ,(صفر) CLEAR ,(برعکس ) TOGGLE و يا ارتباط پايه با مد مقايسه اي قطع شود (پايه oc1b به يک ورودي خروجي عادي تبديل شود).
PRESCALE=1|8|64|256|1024 : عدد PREACALE فرکانس (دقت ) تايمر را معيين ميکند.
CLEAR TIMER = 1|0 : با انتخاب گزينه 1 ،محتواي تايمر/کانتر در زمان تطابق مقايسه اي RESET ($0000 ) مي شود و در صورت انتخاب 0 مقدار شمرده شده تغييري نميکند.
با دستورات زير ميتوان عددي را که محتواي تايمر بايد با آن مقايسه شود را تعيين کرد
Compare1a = x
Compare1b =x
به جاي x يک عدد ثابت يا يک متغيير قرار ميگيرد ، هنگامي که عدد شمرده شده توسط تايمر يک با اعداد گذاشته شده برابر شد ميکرو وضعيت پايه هاي مربوطه را همانگونه که در پيکربندي مشخص کرديد تغيير ميدهد.
مثال :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Timer1 = Timer , Compare A = Set , Compare B = Toggle , Prescale = 1024 , Clear Timer = 0
Compare1a = 1000
Compare1b = 5000
Do
Locate 1 , 1
Lcd Timer1
Loop
End
هنگامي که تايمر 1 تا 1000 شمرد پايه OC1A يک مي شود و هنگامي که مقدار شمرده شده به 5000 رسيد پايه OC1B يک مي شود (OC1A پايه 19 و OC1B پايه 18 مگا 16 ميباشد).
استفاده از وقفه مد مقايسه اي تايمر 1 :
مد مقايسه اي داراي 2 منبع وقفه ميباشد که با دستورات زير فعال ميشوند:
Enable Interrupts
Enable Oc1a
Enable Oc1b
با دستور فعال سازي وقفه مقايسه ، هنگامي که مقدار شمرده شده توسط ميکرو با Compare1a برابر شد cpu ميکرو با دستور on oc1a lable به برچسب مورد نظر برش ميکند و در آنجا عمليات دلخواه را انجام ميدهد، هنگامي که مقدار شمرده شده توسط ميکرو با Compare1b برابر شد cpu ميکرو با دستور on oc1b lable به برچسب مورد نظر برش ميکند و در آنجا عمليات دلخواه را انجام ميدهد. در صورتي که در پايان برچسب دستور Return گذاشته شود CPU به حلقه ي اصلي پرش ميکند.
مانند :
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Timer1 = Timer , Compare A = Set , Compare B = Toggle , Prescale = 1024 , Clear Timer = 0
Compare1a = 2120
Compare1b = 63000
Enable Interrupts
Enable Oc1a
Enable Oc1b
On Oc1a Q
On Oc1b W
Do
Locate 1 , 1
Lcd Timer1
Loop
End
Q:
Locate 2 , 1
Lcd Timer1
Return
W:
Locate 2 , 8
Lcd Timer1
Return
در مثال بالا هنگامي که رقم شمرده شده توسط تايمر با مقدار Compare1a (2120) برابر شد cpu به برچسب q پرش ميکند و در آنجا مقدار شمرده شده توسط تايمر را بر روي lcd نمايش داده و با دستور return به حلقه ي اصلي برميگردد ، هنگامي که رقم شمرده شده توسط تايمر با مقدار Compare1b (63000) برابر شد cpu به برچسبw پرش ميکند و در آنجا مقدار شمرده شده توسط تايمر را بر روي lcd نمايش داده و با دستور return به حلقه ي اصلي برميگردد .همچنين در مورد اول پايه oc1a يک مي شود و در مورد دوم وضعيت پايه oc1b تغيير ميکند ( در صورت 0 بودن يک مي شود و بلعکس).
راه اندازي تايمر 1 در مد CAPTURE :
در صورتي که تايمر يک را در اين مد پيکربندي کنيد ، با اعمال يک پالس بالا رونده يا پايين رونده (که نوع آن در هنگام پيکر بندي مشخص مي شود ) به پايه icp (پايه 20 مگا 16 ) ، در همان لحظه مقدار شمرده شده توسط تايمر 1 در ريجيستر CAPTURE قرار ميگيرد ، محتواي رجيستر CAPTURE را مي توان با دستور VAR = CAPTURE در يک متغيير از جنس word قرار داد .
راه اندازي تايمر يک در مد CAPTURE با دستورات زير انجام مي شود:
Config Timer1 = Timer, Capture Edge= Falling | Rising ,Noise Cancel=1|0 , Prescale =1|8|64|256|1024
Capture Edge= Falling | Rising : اين گزينه مشخص ميکند ، پالس اعمالي به پايه icp بالا رونده (Falling) است يا پايين رونده (Rising).( CAPTURE به کدام پالس حساسيت نشان ميدهد)
Noise Cancel=1|0 : در صورت انتخاب يک از نويز هاي موجود بر روي پايه icp چشم پوشي مي شود و هر پالس با لبه ي تعين شده ميتواند CAPTURE را راه اندازي کند ،در صورت انتخاب صفر فقط پالس هاي با دامنه ي 5 ولت قادر به راه اندازي CAPTURE خواهند بود.
Prescale =1|8|64|256|1024 :دقت تايمر را نشان ميدهد (با استفاده از اين مقدار و مقدار کريستال ميتوانيد زمان شمرده شده توسط تايمر تا هنگام سرريزي را با فرمولي که در بالا گفته شد محاسبه کنيد) با دستور Enable Icp1 اين مد فعال مي شود و پايه icp اماده دريافت پالس ميگردد . مانند:
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Timer1 = Timer , Capture Edge = Falling , Noise Cancel = 1 , Prescale = 1024
Do
Locate 1 , 1
Lcd Timer1
Locate 2 , 1
Lcd Capture1
Loop
End
در مثال بالا هنگامي که يک پالس بالا رونده به پايه icp اعمال مي شود مقدار شمرده شده توسط تايمر 1 درون ريجيستر Capture قرار ميگيرد و سپس بر روي lcd نمايش داده مي شود . مدار استفاده شده براي مثال بالا و ساير مثال هاي اين بخش را مشاهده مي فرماييد
سلام اميد جان عرض ارادت چي شد پس ادامه ندادي كه؟؟؟؟؟؟؟؟
هنوز اين مطلب شما مشتاق زياد داره.من هنوز منتظرم اگه ادامه بدي خيلي خوبه.
خوش باشي پيشاپيش عيدتم مبارك.
omidvarshoei
2011/4/05, 12:14 PM
سلام اميد جان عرض ارادت چي شد پس ادامه ندادي كه؟؟؟؟؟؟؟؟
هنوز اين مطلب شما مشتاق زياد داره.من هنوز منتظرم اگه ادامه بدي خيلي خوبه.
خوش باشي پيشاپيش عيدتم مبارك.
من خودمم مشتاقم که این مطالب بیشتر کنم ولی الان موقعیتش نیست تو اولین فرصت حتمآ
shadi_computer
2011/8/26, 04:06 PM
سلام ممنون هستم به خاطر آموزشهای خوبتون من رشته ام کامپیوتره ولی پایان نامه ام AVR هست .ساخت قفل رمز دیجیتال .برنامه نوبسی بسکام زیاد وارد نیستم .دوستان اگه می تونن کمکم کنن به ایمیلم پیغام بدن مرسی.z_motealeh@yahoo.com الان یه برنامه اسکن صفحه کلید دارم اما اعداد درست تنظیم نیست چطوری جدول lookup بنویسم واسشدرست متوجه نمی شم اعدادی که تو جدول میذارن با چه منطق و حساب کتابیه.ممنون می شم راهنمایی کنید.
kamran0080
2011/9/16, 11:27 AM
سلام به همه دوستان و کسانی که در این تاپیک زحمت می کشن یه مشکل برام به وجود اومد اگه یه نفر کمکم کنه واقعا لطف کرده چون شدیدا بهش نیاز دارم یه کم برنامه نویسی بلدم ولی زیاد نیست مشکلم اینه من میخوام یه برنامه بنویسم که یک یک پورت رو خروجی قرار بدم و دو پورتم ورودی ، دو پورتی که ورودی هستن رو می خوام اولیت بندی کنم یکی رو مثلا اسمش 1 و بعدی اسمش 2 است اگه اولی یک بود سپس دومی هم یک شد اون وقت اون پورتی که خروجی قرار دادیم یک بشه در غییر این صورت صفر باشه من این برنامه رو نوشتم اما تشخیص نمیده اولی کدومه $regfile = "m32def.dat" $crystal = 8000000 Config Porta = Input Config Portb = Output Do If Pina.1 = 1 Then If Pina.2 = 1 Then Portb.0 = 1 End If End If Loop End ببینید من می خوام حتما اگه اول Pina.1 شد یک سپس Pina.2 شد یک اون وقت Portb.0 بشه یک این برنامه ایی که نوشتم فرق هویج و ... رو نمیدونه هر کدوم از دو پورت اول یک بشن بعدا پورت دیگری یک بشه اون خروجی رو یک مینه لطفا کمک کنید به این برنامه بگم اولویت با پورت یکه مممنوم میشم کمکم کنید دوستتون دارمممممممممممممممممممممم ممممممممممممممممممممم
kamran0080
2011/9/16, 11:29 AM
سلام به همه دوستان و کسانی که در این تاپیک زحمت می کشن یه مشکل برام به وجود اومد اگه یه نفر کمکم کنه واقعا لطف کرده چون شدیدا بهش نیاز دارم یه کم برنامه نویسی بلدم ولی زیاد نیست مشکلم اینه من میخوام یه برنامه بنویسم که یک یک پورت رو خروجی قرار بدم و دو پورتم ورودی ، دو پورتی که ورودی هستن رو می خوام اولیت بندی کنم یکی رو مثلا اسمش 1 و بعدی اسمش 2 است اگه اولی یک بود سپس دومی هم یک شد اون وقت اون پورتی که خروجی قرار دادیم یک بشه در غییر این صورت صفر باشه من این برنامه رو نوشتم اما تشخیص نمیده اولی کدومه $regfile = "m32def.dat" $crystal = 8000000 Config Porta = Input Config Portb = Output Do If Pina.1 = 1 Then If Pina.2 = 1 Then Portb.0 = 1 End If End If Loop End ببینید من می خوام حتما اگه اول Pina.1 شد یک سپس Pina.2 شد یک اون وقت Portb.0 بشه یک این برنامه ایی که نوشتم فرق هویج و ... رو نمیدونه هر کدوم از دو پورت اول یک بشن بعدا پورت دیگری یک بشه اون خروجی رو یک مینه لطفا کمک کنید به این برنامه بگم اولویت با پورت یکه مممنوم میشم کمکم کنید دوستتون دارمممممممممممممممممممممم ممممممممممممممممممممم $regfile = "m32def.dat" $crystal = 8000000 Config Porta = Input Config Portb = Output Do If Pina.1 = 1 Then If Pina.2 = 1 Then Portb.0 = 1 End If End If Loop End تاپیک بالا بد شد شرمنده دوباره ارسال کردم
pr.babak
2011/9/26, 04:50 PM
ممنون از زحمت تون !
موفق باشی .
bargh_8
2011/12/17, 06:55 PM
عالیه مرسی;)
bargh_8
2011/12/21, 03:40 PM
فصل دوم : دستورات اولیه بسکام
براي قرار دادن يک پورت به عنوان ورودي از دستور زير استفاده ميکنيم:
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 به عنوان خروجي تعريف شده است .
نکته : در صورتی که پورت یا پایه ای تعریف نشود ورودی می باشد !
دستورات مربوط به پورت ها :
خیلی خیلی ممنون و متشکر بزرگوار بابت زحمتهاتون
یه سوال
چه زمانی من دستور رو به صورت:
Config PORTA.1 = Input
وچه زمانی به صورت :
Config Pina.1 = Input
مینویسم؟؟
لطفا کمی در این مورد توضیح بدید...
پایدار و سربلند باشید
یاعلی
ALIAVR
2012/2/03, 05:26 PM
یه تشکر ساده هم مارو راضی میکنه http://www.pix2pix.org/my_unzip/123290843324.gif
سلام دوست عزیز:
بسیارممنون ازمطالب بسیارجالب وکارآمدت.واقعاقابل تحسین است ولی چرادکمه تشکرفعال نیست.موفق باشید
mohammadjavid
2012/4/11, 06:13 PM
سلام دوستان عزیز ;)
ببخشید یه سوال داشتم اونم اینکه توهمین برنامه بسکام دستور این عملی که من می خوام چی میشه؟
من از دستور if یه شمارنده درست کردم که با یه پایه ی ورودی کارمیکنه. مثلا" وقتی که پایه ورودی 0 میشه شروع به شمارش میکنه و به محض اینکه پایه ی ورودی 1 شد شمارش رو متوقف میکنه. حالا میخوام یه دستور بنویسم که هروقت پایه ی ورودی 1 شد رو همون عددی که شمارش کرده بایسته. یعنی آخرین عددی رو که شمرده همون رو نمایش بده تا دوباره پایه ی ورودی 1 بشه و ادامه اش رو بشمره.
فقط دوستان اگه میشه سریع جواب بدین خیلی وقتم کمه.
خیلی خیلی ممنون
ali_511
2012/4/11, 08:34 PM
سلام دوستان عزیز ;)
ببخشید یه سوال داشتم اونم اینکه توهمین برنامه بسکام دستور این عملی که من می خوام چی میشه؟
من از دستور if یه شمارنده درست کردم که با یه پایه ی ورودی کارمیکنه. مثلا" وقتی که پایه ورودی 0 میشه شروع به شمارش میکنه و به محض اینکه پایه ی ورودی 1 شد شمارش رو متوقف میکنه. حالا میخوام یه دستور بنویسم که هروقت پایه ی ورودی 1 شد رو همون عددی که شمارش کرده بایسته. یعنی آخرین عددی رو که شمرده همون رو نمایش بده تا دوباره پایه ی ورودی 1 بشه و ادامه اش رو بشمره.
فقط دوستان اگه میشه سریع جواب بدین خیلی وقتم کمه.
خیلی خیلی ممنون
سلام
اگه میشه اون قسمت رو بزارید تا بدونیم چطوری باید کمکتون کنیم.
موفق باشید
mohammadjavid
2012/4/11, 08:47 PM
$regfile = "m16def.dat"
$crystal = 1000000
Config Porta = Output
Config Portb = Output
Config Portc = Input
Do
If Pinc.0 = 1 Then
Porta = &B00000000 : Portb = &B00000000 : Waitms 1000
Porta = &B00000000 : Portb = &B00000001 : Waitms 1000
Porta = &B00000000 : Portb = &B00000010 : Waitms 1000
Porta = &B00000000 : Portb = &B00000011 : Waitms 1000
Porta = &B00000000 : Portb = &B00000100 : Waitms 1000
Porta = &B00000000 : Portb = &B00000101 : Waitms 1000
Porta = &B00000000 : Portb = &B00000110 : Waitms 1000
Porta = &B00000000 : Portb = &B00000111 : Waitms 1000
Porta = &B00000000 : Portb = &B00001000 : Waitms 1000
Porta = &B00000000 : Portb = &B00001001 : Waitms 1000
.
.
.
Else
اینجا میخوام تا همون جایی که شمارش کرده توقف بشه. یعنی مثلا" اگه تا 8 شمرده . همون رو نشون بده و به محض اینکه دوباره Pinc.0 = 1 شد ادامه اش رو بشمره.
End If
Loop
خیلی ممنون دوست عزیز
ali_511
2012/4/11, 10:00 PM
$regfile = "m16def.dat"
$crystal = 1000000
Config Porta = Output
Config Portb = Output
Config Portc = Input
Do
If Pinc.0 = 1 Then
Porta = &B00000000 : Portb = &B00000000 : Waitms 1000
Porta = &B00000000 : Portb = &B00000001 : Waitms 1000
Porta = &B00000000 : Portb = &B00000010 : Waitms 1000
Porta = &B00000000 : Portb = &B00000011 : Waitms 1000
Porta = &B00000000 : Portb = &B00000100 : Waitms 1000
Porta = &B00000000 : Portb = &B00000101 : Waitms 1000
Porta = &B00000000 : Portb = &B00000110 : Waitms 1000
Porta = &B00000000 : Portb = &B00000111 : Waitms 1000
Porta = &B00000000 : Portb = &B00001000 : Waitms 1000
Porta = &B00000000 : Portb = &B00001001 : Waitms 1000
.
.
.
Else
اینجا میخوام تا همون جایی که شمارش کرده توقف بشه. یعنی مثلا" اگه تا 8 شمرده . همون رو نشون بده و به محض اینکه دوباره Pinc.0 = 1 شد ادامه اش رو بشمره.
End If
Loop
خیلی ممنون دوست عزیز
سلام
ببین مهندس من دقیقا متوجه نشدم شما منظورت چیه اما من برنامه زیر رو نوشتم شاید بتونه کمکت کنه.(البته بنا به برداشتی که من از حرفات کردم)
ببین من فرض کردم شما شمارنده ای لازم داری که به محض اینکه پایه ورودیت 0 شد شروع به شمارش کنه تا زمانی که پایه ورودی شما 1 بشه به محض اینکه ورودی شما یک شد عمل شمارش متوقف بشه تا اینکه مجددا پایه ورودی صفر بشه و دوباره شروع به شمارش کنه(با صفر شدن بشماره با یک شدن متوقف بشه)
برای اینکار شما نیاز به لبه داری که من این رو حساس به لبه بالا پایین رونده نوشتم.با IFنوشتم چون گفته بودین با if
البته راه های دیگه ای هم وجود داره که شمارنده بسازید مثل استفاده از تایمر کانتر
برنامه:
$regfile = "m16def.dat"
$crystal = 1000000
Config Porta = Output
Config Portb = Output
Config Portc = Input
Dim A As Byte
A = 0
Lable:
Do
If Pinc.0 = 1 Then
If Pinc.0 = 0 Then
Do
Portb = A
Wait 1
Incr A
If Pinc.0 = 1 Then
Goto Lable
End If
Loop
End If
End If
Loop
امیدوارم منظورتون رو اشتباه نفهمیده باشم.
موفق باشید
mohammadjavid
2012/4/12, 01:51 AM
خیلی ممنون دوست عزیز، ولی اینی که شما نوشتی وقتی Pinc.0 = 1 میشه، شمارش رو شروع میکنه تااینجا درست.
ولی وقتی که Pinc.0 = 0 میشه شمارش رو متوقف نمیکنه همینطور پشت سرهم میشمره. انگارنه انگار که Pinc.0 = 0 شده و باید شمارش متوقف بشه
مشکلش همینه
lord mohsen
2012/4/13, 04:30 PM
سلام خیلی خوبه دستتم درد نکنه رو کمک منم می تو نی حساب کنی البته من تو تایمر و A/D مشکل دارم
یه پیشنهاد دارم
چرا از نرم افزار Raidcall استفاده نمکنید
خیلی خوبه یه تحقیقی بکنید تما این ساید می تونه با این نرم افزار به صورت انلاین با هم در ارتباط باشند
Powered by vBulletin® Version 4.1.12 Copyright © 2012 vBulletin Solutions, Inc. All rights reserved.