Visits: 322
با عرض سلام خدمت دوستان عزیز
از امروز مي خوام ميكروكنترلر PIC را آموزش بدم. گفتني ها رو ديگر دوستان توي سايت ها و وبلاگ هاي مختلفي گفته اند و من ديگر به آنها اشاره نمي كنم. در اين وب سایت صرفا دستورات ويژوال بيسيك كه براي ميكروكنترلر 16F84 استفاده مي شوند را توضيح مي دهم. كاري به اسمبلي PIC نداريم چون واقعا بحث سنگين و پيچيده داره و براي نوشتن يك برنامه ساده بايد چندين خط اسمبلي بنويسيم. براي اينكه به زبان اسميلي برنامه اي بنويسيم بايد تمام جيك و پيك سخت افزر شو بلد باشيم كه كاري خيلي سخت هستش اما با استفاده از زبان هاي سطح بالاتر بدون نياز به يادگيري سخت افزار مي توانيم برنامه هاي كاربردي و مهمي بنويسيم.
تو اين وب سایت من فقط دستورات و عملكرد و كاربرد آنها را توضيح مي دهيم البته با مثال هاي ساده كه اين مثال ها رو اگه خوب درك كنيد و متوجه آنها بشويد با كمي مطالعه بيشتر خودتان مي توانيد برنامه نويسي پيك رو ياد بگيرد.
همه مطالبي كه در اين وبلاگ قرار دارد خصوصا در مورد ميكروكنترلر ها همه آنها تجربه شخصي خودم بوده و براي كمك كردن به گوشه اي از مشكلات دوستان مي باشد كه اميدوارم هستم به درد شما بخورد. همه ما بايد دست در دست هم دهيم تا علم خود را به ديگران هم آموزش دهيم و اين تكنولوژي پيشرفته را فراگير كنيم.
با تشكر
قبل از هر چيز سخت افزار پايه PIC جهت روشن شدن را در شكل زير مي بينيم. براي اينكه يك PIC را برنامه ريزي كنيم ابتدا بايد قطعات زير را حتما به ميكرو وصل كنيم و بعد قطعات ديگر را باتوجه به طراحي آن پروژه به ميكرو وصل كنيم.
Label (برچسب)
همانطوري كه از معني اين دستورات پيدا است به قسمتي از برنامه برچسب ميزند. حال كاربرد اين برچسب چيست؟ از برچسپ براي براي تكرار يك سري دستورات يا كل برنامه يا با تحقق يك شرط cpu به آن محلي كه برچسب خورده پرش مي كند و دستورات نوشته شده بعد از label را اجرا مي كند. برچسب مي تواند هر كلمه اي باشد كه خودمان تعريف مي كنيم و بايد به يك نكته توجه كرد كه برچسب نبايد با اعداد شروع شود. برچسب به حروف بزرگ يا كوچك حساس نيست. براي اينكه يك برچسب درست كنيم بايد اول نام برچسب را بنويسيم و سپس از دو نقطه (:) جلويكلمه برچسب استفاده كنيم. حال كامپايلر اين كلمه را به عنوان برچسب مي شناسد و براي پروگرام كردن از آن استفاده مي كند. دستوراتي كه براي پرش به برچسب وجود دارند عبارت اند از:
Goto از اين دستور براي پرش به برچسب مورد نظر استفاده مي شود
Gosub براي فراخواني يا صدا زدن يك زير برنامه كه با يك label مشخص شده است.
اين دستورات شبيه به همون دستورات jump و call در 8051 مي باشد. قالب آن به صورت زير مي باشد: دوستان غزيز هروقت در قسمتي از برنامه چند تا …. نقطه چين بود به معناي تعداي دستورات مي باشد!
Label: ….
………
Goto label
در اين مثال هرگاه دستورات …. اجرا شد دو باره به آدرس label پرش مي كند و برنامه را تكرار مي كند.
مثالي با gosob :
MGH: ……
Gosub mohsen
…………
………..
Goto MGH
Mohsen:…….
……………..
return
دوستان توجه كنيد كه هرگاه از يك زير برنامه استفاده مي كنيد بعد از اتمام دستورات زير برنامه از return در پايان زير برنامه حتما استفاده كنيد. اين كار باعث مي شود تا بعد از اتمام زير برنامه cpu آدرس شمارنده pc را كه در پشته ذخيره كرده بود و به mohsen رفت را دوباره به pc برگرداند و در نهايت به انجام ادامه برنامه اصلي برود. يعني دستورات بعد از gosub mohsen را اجرا كند.
متغير ها VAR
اول از همه متغير چيست؟ متغير همانطور از معني اش پيدا است يعني يه چيزي كه دائم در حال تغيير است و ثبات ندار. متغير ها عموما در حافظه RAM قرار مي گيرند و توسط ديگر دستورات مقدار آنها يا افزايش يا كاهش مي بابد تا مثلا به مقدار يه شرط كه ما در برنامه تعريف كرده ايم رسيد اند قسمت ديگري از برنامه را اجرا كنند.
متغير ها را مي توان به صورت بيتي bit يا بايتي byte يا يك كلمه word تعريف كرد. براي تعريف كرن يك متغير ابتدا نام آن متغير را مي نويسم سپس دستور VAR و بعد از آن نوع داده يعني بيتي يا بايتي يا كلمه را مشخص مي كنيم.
mgh var bit
mgh var byte
mgh var word
در اولي مقدار يك بيت به متغير mgh نسبت داده شده است.
در اولي مقدار يك بايت يا داده 8 بيتي به متغير mgh نسبت داده شده است.
در اولي مقدار يك كلمه يا داده 16 بتي به متغير mgh نسبت داده شده است.
مثال: كنترل يك led كه بيت 6 پورت b وصل مي باشد.
Led_red var portb.6
Led_red=1
يا
Led_red=0
ما در اول برنامه بيت 6 از پورت B را به متغير Led_red نسبت داده ايم حالا ما در هر جايي از برنامه مي توانيم مسقيما اين led را يا خاموش و يا روشن كنيم. و ديگر نيازي به نوشتن portb در طول برنامه نيست. فقط كافي است كه مقدار 0 يا 1 را به led_red بدهيم.
همچنين مي توان كل 8 بتي مثلا پورت b را به MGH نسبت دهيم.
mgh var portb
mgh=6
پورت b به متغير mgh نسب داده شد و در هر جايي از برنامه مي توان روي اين پورت عدد را كپي كنيم. مثلا در اينجا عدد 6 روي پورت b ريخته مي شود.
Aliases نام مستعار
از اين روش مي توان قسمتي از يك متغير را به عنوان متغير ديگري تعريف مثلا در ميكرو مي توان كل پورت يا يك بيت به صورت برنامه ريزي كرد. يا ميتونيم بگيم كه متغير در متغير ميشه. به مثال زير توجه كنيد؟
mohsen var portb
k5 var mohsen.bit5
در اين برنامه ما پورت B را به mohsen نسبت داده ايم . مثلا اين پورت يك باس آدرس يا داده مي باشد. حالا ما در يه جايي از برنامه مثلا مي خواهيم هرگاه بيت 5 اين پورت يك شد يه شرطي را براي ما انجام بدهد. در خط دوم بيت 5 از متغير mohsen به k5 نسب داده شده است. و خود mohsen هم همون پورت B هست.
ثابتها
در برنامه نويسي مخصوصا برنامه هاي سنگين بهتر است كه ما به جاي عدد ثابت از نام ثابت استفاده كنيم. تا هرگاه لازم باشد آن عدد را تغيير دهيم فقط در خطوط اول برنامه اين تغير را اعمال كنيم و ديگر لازم نباشد در كل برنامه جستجو كنيم و آن عدد را تغير دهيم.
قالب دستوري آن به اين صورت مي باشد عدد دستور con ثابت
mgh con 5
ali con mgh*20
در خط اول عدد 5 به ثابت mgh نسبت داده شده است. و در خط دوم ثابت ali برابر با مقدار ثابت mgh در عدد 20 كه ali=20*5=100 خواهد شد.
مبناي اعداد
اعداد را مي توان در سه مبناي مختلف نوشت كه در بيسك براي نوشت عدد در مبناي دسيمال فقط خود عدد را مي نويسيم و از علامت ديگري در پشت استفاده نمي شود. در مبناي باينري از علامت % براي اين مبنا استفاده ميكنيم. Portb=%11110000
و در مبناي هگز از علامت $ استفاده مي كنيم مثلا portb=$f0
تعيين پورت ها به عنوان ورودي يا خروجي
ميكرو هنگامي كه روشن مي شود به صورت پيش فرض پورت هاي آن خروجي مي باشد. براي تغير پورت يا حتي يك پين از پورت ها به عنوان خروجي بايد آنها را صفر كنيم و براي ورودي كردن بايد يك كنيم.
براي انجام اين كار از دستور TRIS استفاده مي شود.
به عنوان مثال اگر پورت a را به خواهيم خروجي معرفي كنيم:
TRIS PORTA=%00000000 يا TRIS PORTA=$00 براي خروجي كردن بيت هاي خاصي از يك پورت مثلا بيت 3 از پورت A خروجي و بقيه ورودي باشند: TRIS PORTA=%11110111
براي ورودي كردن هم به صورت زير عمل مي كنيم:
TRIS PORTA=%11111111 يا TRIS PORTA=$FF و براي خروجي كردن بعضي از بيت ها مانند مثال بالا عمل مي كنيم: مثلا بيت 3 و 7 خروجي و بقيه بيت ها ورودي:
TRIS PORTA=%01110111
Comment توضيحات
گاهي اوقات لازم است در ببين خط هاي برنامه توضيحاتي در مورد آن خط بنويسم براي اينكه كامپايلر اين توضيحات را جزء برنامه حساب نكند بايد قبل از شروع توضيحات از REM يا ( ") استفاده كنيم.
GOTO LOOP JUMP TO LOOP يا GOTO LOOP REM JUMP TI LOOP
Multistatementlines چند دستور در يك خط
در يك خط مي توان چند دستور را پشت سر هم نوشت اين كار صرفا براي كوتاه كردن طول برنامه مي باشد و از حجم كد هگزي كه كامپايلر توليد مي كند كم نمي شود. براي اين كار بايد بين دستورات از ( 🙂 استفاده كنيم.
A2=A0
A0=A1
مي توان چنين نوشت : A1=A2
A2=A0 : A0=A1 : A1=A2
Include شامل
بعضي از منابع و كتابخانه هاي بيسيك را مي توان با استفاده از include در ابتداي برنامه به PBP اضافه كرد. بعضي از زير برنامه ها، تعاريف،يا فايلهاي اضافي استاندار را مي توان به صورت جدا از برنامه اصلي نگهداري كرد و هنگامي كه در برنامه به آنها نياز باشد، به كمك include آنها را فراخواني كنيم. به عنوان مثال فايلهاي مربوط به سريال از اين جمله اند. بنابراين اگر بخواهيم از دستورات سريال استفاده كنيم بايد در اول برنامه آن را تعريف كنيم تا دستورات مربوطه قابل شناسايي باشند.
INCLUDE "Modedefs.bas"
تعريف define
بعضي از تنظيمات از قبيل فركانس اسيلاتور يا تنظيمات مربوط به DEBUG و پين هاي آن يا نحوه اتصال پين هاي LCD به طور پيش رض در PBP تعريف شده اند. اگر در ابتداي برنامه آنها را تعريف نكنيم بايد به صورت پيش فرض استفاده شوند، اما استفاده از اين دستور اين امكان را به ما مي دهد كه اين پيش فرض ها را تغير دهيم. به عنوان مثال اسيلاتور 4MHZ به صورت پيش فرض هست. اگر بخواهيم از اسيلاتور ديگري استفاده كنيم بايد در اول برنامه آن را تغير دهيم. به عنوان مثال براي استفاده از اسلاتور 12 مگاهرتز به صورت زير عمل مي كنيم:
DEFINE OSC 12
نكته: دستورات حتما بايد با حروف بزرگ نوشته شوند
منبع: سید محسن قاسمیان www.picpars.com