0

اموزش ميكروكنترلر AVR به زبان ساده(Basic)-قسمت چهارم

 
mojehb
mojehb
کاربر برنزی
تاریخ عضویت : آبان 1391 
تعداد پست ها : 25
محل سکونت : اصفهان

اموزش ميكروكنترلر AVR به زبان ساده(Basic)-قسمت چهارم
جمعه 3 آذر 1391  7:06 PM

قسمت چهارم :
1-   سلام خوبي
2-   سلام قربانت تو چطوري چكار مي كني با اين ميكروكنترلر
1-   منم خوبم . با اين ميكروكنترلر داريم حال مي كنيم والا قبلا براي طراحي يك مدار ساده ديجيتال مجبور بودم چند روز روش كار كنم ولي حالا ديگه نه . بعدشم يك چيزو يادت رفته بود بگي
2-   چي؟؟
1-   از TOGGLE  مثال نزدي
2-   باشه توي اين درسي رو كه امروز بهت ميدم از اين دستور هم استفاده مي كنم كه ياد بگيري . خوب شروع كنيم
1-   اره
2-   خوب قرار بود از كجا شروع كنيم
1-   قرار بود ورودي رو بهم بگي . گفته بود قبل از اينكه ورودي رو درس بدي بايد چند تا دستور شرط  و ... رو برام بگي
2-   اره اين جلسه قبل از اينكه ورودي يا همون PIN  رو بهت بگم بايد . دستور حلقه – دستور پرش رو اول بگم بعد بريم  سر ورودي . چون كه اين طوري بهتره
1-   حرفي نيست بريم
2-   خوب اول بريم سراغ حلقه . ببين به يك چيز توي برنامه هاي قبلي توجه كرده بودي
1-   نه چي ؟؟
2-   ما ميومديم يك برنامه رو مي نوشتيم اين برنامه هم يك كاري رو برامون انجام ميداد و در نهايت  برناه به END مي رسيد و برنامه كلا تمام مي شد . و براي شروع مجدد مجبور بوديم برنامه رو دوباره اجرا كنيم . خوب حالا فرض كن ما يك برنامه اي رو ميخايم كه مثلا PORTB.0 رو هر 40 ميلي ثانيه يك بار روشن و خاموش كنه و اين كار ادامه داشته باشه يعني اينكه 40 ميلي ثانيه روشن باشه و 40 ميلي ثانيه خاموش باشه . براي اين كار بايد از دستور استفاده كنيم كه برنامه هيچ وقت به پايان نرسه  كه اين دستور اسمش هست حلقه
1-   خوب حالا اين حلقه چكار ميكنه
2-   اين حلقه باعث ميشه برنامه توي اين قسمت دور بزنه و هيچ وقت به END نرسه يعني برنامه تمام نشه مگر اينكه ما يك شرط بزاريم كه از حلقه بيرون بزاريم
1-   چه شرطي
2-   اونو تو قسمت دستور شرط برات مي گم
2- حلقله DO –LOOP
براي گذاشتن حلقه DO رو  اول مي نويسيم و در خط هاي بعدي برنامه اي كه بايد در حلقه باشد رو مي نويسيم و در نهايت LOOP  رو مي نويسيم
1-   من كه چيزي نفهميدم . يك مثال بزن
همون مثالي رو كه PORTB.0 بايد SET و RESET بشه رو برات مي نويسم . از اين به بعد هم ديگه $REGFILE = "M16DEF.DAT"
$CRYSTAL = 8000000  رو نمي نويسم خودت اونا رو نوشته فرض كن
خوب حالا برنامه اي كه گفتم:
CONFIG  PORTA  =  OUTPUT
DO
TOGGLE  PORTA.0
WAITMS 40
LOOP
END
خوب حالا تحليل برنامه :
اين برنامه هيچ گاه به END نمي رسد تا برنامه تمام شود
خط اول رو كه PORTA رو به عنوان خروجي پيكره بندي كرديم
خط دوم  DO   را گذاشتيم
خط سوم  با نوشتن TOGGLE  PORTA.0  اين را رسانديم كه PORTA.0 در هر حالتي از حالت ها صفر يا يك كه بوده بايد وضعيتش معكوس شود يعني اگه صفر بوده حالا بايد يك شود . اگر يك بوده حالا بايد صفر شود
خط چهارم هم  اخر حلقه را گذاشتيم
خط پنجم هم نوشتيم END البته برنامه هيچ گاه به خاطر اين كه ما يك حلقه گذاشتيم به END نمي رسد
توجه كن كه ما برنامه اي رو كه مي خاستيم رو داخل اين حلقه گذاشتيم  و برنامه داخل اين حلقه دور ميزند . بار اول برنامه TOGGLE  PORTA.0  رو مي خونه و پايه A.0 رو SET   يا همون يك مي كنه بعد 40 ميلي ثانيه صبر مي كنه و برنامه از خط بعد شروع مي شه خط بعد LOOP هستش كه ميكرو با خوندن LOOP دوباره بر ميگرده  برنامه رو از خط پاييني DO شروع به خوندن مي كنه يعني دوباره همون TOGGLE  PORTA.0 رو مي خونه  اين بار چون پايه A.0 در حالت SET يا همون يك بوده  اين بار ياد بشه عكس همين حالت بشه يعني RESET يا صفر ميشه بعد 40 ميلي ثانيه صبر ميكنه و ميكرو برنامه رو از خط بعدي ميخونه بعني دستور LOOP رو مي خونه . با  خوانده شدن دستور LOOP  ميكرو برنامه رو از خط زيري DO شروع به خوندن مي كنه يعني دوباره TOGGLE  PORTA.0 رو مي خونه اين بار چون در حالت قبلي پايه A.0  در حالت صفر بوده اين بار يك مي شه  برنامه به همين منوال ادامه داره و ادامه پيدا مي كنه و هيچ وقت به پايان نمي رسه
1-   گرفتم چي مي گي ولي اگه ممكنه يك مثال ديگه هم بزن
2-   باشه
مثال دوم:
CONFIG  PORTB  =  OUTPUT
DO
SET  PORTB.5
WAITMS  60
RESET  PORTB.5
WAITMS  60
LOOP
END
خوب حالا بريم سر تحليل برنامه:
برنامه از خط اول شروع  ميشه و ميكرو خط اول رو مي خونه
خط دوم كه DO  هستش كه ابتداي حلقه ما هستش
خط سوم  SET  PORTB.5   يعني پايه B.5  يك بشه
خط چهارم يك تاخير در برنامه با مدت زمان  60 ميلي ثانيه گذاشتم
خط  پنجم  RESET  PORTB.5  يعني پايه B.5 صفر بشه
خط ششم  با گذاشتن دستور LOOP انتهاي حلقه رو مشخص كرديم
خط هفتم هم نوشتيم END كه برنامه به خاط داشتن حلقه هيچ گاه به END نمي رسد
برنامه به اين صورت است كه از خط اول شروع به خونده شدن توسط ميكرو ميشه و پيكره بندي رو مي خونه . بعد ميوفته توي حلقه و اولين عبارتي رو كه مي خونه SET  PORTB.5  هستش كه در اين زمان ميكرو پايه B.5 رو يك مي كنه بعد توسط دستور WAITMS  60   حدود 60 ميلي ثانيه تاخير ايچاد مي كنه بعد از سپري شدن اين مدت زمان ميكرو برنامه رو از خط بعدي شروع به خوندن مي كنه يعني RESET  PORTB.5  كه ميكرو توسط اين دستور پايه B.5 رو صفر مي كنه بعد توسط دستور WAITMS  60  ميكرو 60 ميلي ثانيه در اجراي برنامه دوباره تاخير ايجاد مي كنه بعد از سپري شدن اين مدت زمان ميكرو برنامه رو از خط بعدي يعني LOOP  شروع به خوندن مي كنه كه با خوانده شدن LOOP برنامه مي پره از خط بعدي DO يعني SET  PORTA.0  شروع ميشه و دوباره پايه B.5 يك ميشه و دوباره 60 ميلي ثانيه تاخير ايجاد ميشه دو باره پايه B.5 صفر ميشه و 60  ميلي ثانيه تاخير ايجاد ميشه بعد دوباره  به LOOP مي رسه و دوباره ميكرو ميپره و برنامه رو از خط بعدي DO شروع به خوندن ميكنه و الي بي نهايت اين برنامه تكرار مي شه
1-   عالي بود كامل گرفتم
2-   خدارو شكر. جهنم ضرر يك مثال ديگه هم ميزنم كه LCD  هم توش باشه
DO
CLS
LCD "AHMAD"
WAITMS  50
CLS
LCD "MICRO"
WAITMS 60
LOOP
END
خوب حالا نوبت مي رسه به تحليل برنامه :
برنامه از DO شروع ميشه DO يعني ابتداي حلقه . در خط بعد با دستور CLS  ال سي دي پاك مي شه و اماده نوشتن . در خط بعدي به ميكرو دستور مي ديم كه عبارت AHMAD رو روي LCD نمايش بده . در خط بعد فرمان ايجاد تاخير به مدت زمان 50 ميلي ثانيه را مي دهيم پس از سپري شدن اين مدت زمان ميكرو برنامه را از خط بعد مي خواند . خط بعدي با دستور CLS صفحه LCD را پاك كرديم تا براي نوشتن دوباره اماده شود. در خط بعد فرمان داديم كه عبارت MICRO روي صفحه LCD نمايش داده شود. در خط بعد دستور داديم كه 60 ميلي ثانيه تاخير ايجاد شود كه پس از سپري شدن اين تاخير برنامه از خط بعد اجرا مي شود. به  خط بعدي يعني LOOP  كه مي رسيم ميكرو تا اينكه اين دستور LOOP رو مي بينه بي درنگ مي پره ميره برنامه رو از خط بعدي DO شروع مي كنه به اجرا كردن . بعني از خط CLS و همينطور ادامه مي ده
3-   رو حساب رفاقت مي خام يك مثال ديگه هم بزنم كه حالشو ببري
DIM  G AS  BYTE
G  =  0
DO
INCR  G
CLS
LCD  G
WAITMS  50
LOOP
END
خط اول رو كه خودت مي دوني يعني اينكه ما يك متغيير داريم كه اسمش هست G و از نوع بايت
خط دوم به متغيير G مقدار داديم
خط سوم ابتداي حلقه را مشخص كرديم
خط چهارم  يك واحد به متغيير G اضافه كرديم
خط پنجم با دستور CLS ال سي دي را براي نوشتن پاك كرديم
خط ششم دستور داديم كه مقدار متغيير G روي LCD نمايش داده شود
خط هفتم يك تاخير 50 ميلي ثانيه اي در برنامه ايجاد كرديم
خط هشتم با دستور LOOP  انتهاي حلقه را مشخص كرديم
خوب حالا تحليل اصلي رو گوش كن :
ميكرو مياد برنامه رو از خط اول شروع مي كنه به خوندن و مي فهممه كه يك متغيير از نوع بايت ايجاد شده . بعد خط دوم رو مي خونه كه نوشته مقدار اين متغيير هست صفر . خط سوم ابتداي حلقه مشخص شده است . خط چهارم با دستور INCR  G  يك واحد به متغيير G اضافه كرديم يعني اگه بوده صفر حالا كه يك واحد بهش اضاف شده ميشه 1 . خط بعدي با دستور CLS ال سي دي را پاك كرديم تا براي نوشتن حاضر شود . خط بعدي دستور داديم كه مقدار  متغيير G  كه الان هست 1 روي LCD  نمايش داده شود . خط بعدي با دستور WAITMS 50  دستور تاخير به مدت 50 ميلي ثانيه را صادر كرديم . خط بعدي هست LOOP كه ميكرو وقتي كه به اين دستور مي رسه مي پره ميره و برنامه رو از خط زيري DO شروع مي كنه به خوندن توجه كن كه از خط بعدي DO شروع مي كنه به خوندن نه اينكه از بالا . داريم به جاي جالبش مي رسيم . خوب حالا بايد برنامه از خط بعدي DO خونده بشه خط بعد از DO نوشته چي نوشته INCR  G  خوب يعني اينكه يك واحد به متغيير G اضافه بشه خوب حالا اخرين مقدار متغيير G بوده 1 ( به دليل اينكه دفعه قبل با دستور INCR  G يك واحد به ان اضاف كرده بوديم ) و حالا كه دوباره دستور داديم كه يك واحد ديگر به متغيير G اضافه بشه اينبار ميشه 2 . خط بعدي با دستور CLS ال سي دي را براي نوشتم دوباره پاك مي كنيم . در خط بعدي با دستور LCD  G   مقدار متغيير G  را روي ال سي دي نمايش مي دهيم يعني مقدار جديد كه همان 2 است. خط بعدي دوباره يك تاخير ايجاد مي شود و پس از سپري شدن اين مدت زمان برنامه از خط بعدي اجرا مي شود . خط بعدي هست LOOP باز هم مثل دفعه قبل برنامه از خط زيري DO  شروع مي شه وروز از نو روزي از نوع همينطور به متغيير G يكسره اضافه مي شه تا جايي كه متغيير G برسه به 255 وقتي كه به اين مقدار رسيد متغيير G پر مي شود ( چون از نوع بايت است و با 255 پر مي شود و با 256 سرريز مي شود) . وقتي كه اين 255 برسه به 256   متغيير سر ريز ميشه و دوباره از صفر شروع به شمردن مي كنه . ديگه از اين ساده تر نمي شد توضيح داد.
1-   اقا يك سوال
2-   بپرس
1-   توي مثالات به يك نكته توجه كردي
2-   نه چي
1- مثال توي قسمتي كه مي خاستي توي يك حلقه مثال LCD رو بزني نوشتي LCD  "ALI"  ولي وقتي كه خاستي مقدار يك متغيير رو نشون بدي اين نوشتي LCD G كه مقدار متغيير G رو نشون بده حالا سوال اينجاست چرا ALI رو داخل "   "  گذاشتي ولي متغيير G رو داخل "  " نزاشتي
2- سوال خوبي بود . ببين هر وقت كه خاستي يك متغيير رو نشون بدي لازم نيست كه اونو داخل "  " قرار بدي يعني نبايد داخل "  "  قرار بدي ولي هر وقت كه خاستي يك عبارت رو روي ال سي دي نمايش بدي بايد اونو داخل "   " قرار بدي
1- فهميدم . اين حلقه تموم شد
2- اره
1- پس اگه خاستيم از داخل اين حلقه بيرون بيايم بايد چكار كنيم
2- اينو برات مي گم وقتي كه دستورات شرط رو گفتم
خوب حالا رسيديم به دستورات شرط
1-   چي هست اين دستور شرط
2-   گاهي لازم است كه اگر يك حالتي كه براي ما مد نظر است اتفاق بيفته دستور شرط يك كاري رو مثلا يك پايه رو برامون يك مي كنه
1-   ببين نفهميدم دوباره بگو
2-   باشه برميگرديم سر دو تامثال قبل كه يك متغيير داخل يك حلقه بود و هر دفعه كه دو ر مي زد يك واحد به متغيير اضافه مي شد . خوب اگه اين كار ادامه پيدا كنه اين متغيير هي پرو ميشه با 255 و دوباره از صفر شروع مي كنه دوباره پر مي شه با 255   و دوباره از صفر شروع مي كنه به اضافه شدن حالا ما حال كرديم كه اگر اين متغيير G به مثلا 22   رسيد يك كاري رو برامون انجام بده حالا هر كاري رو كه حال كرديم رو بره برامون انجام بده مثلا يك پورت رو بياد  برامونSET كنه يا اينكه بره رويه LCD  يك چيزي بنويسه . كه ما بايد از دستور شرط استفاده كنيم . يك مثال ساده ديگه كه مي تونم برات بزنم اينه كه مثلا باباي تو بهت مي گه كه اگر اخر سال معدل تو 20  شد برات دوچرخه مي خرم . خوب بابات براي تو يك شرط گذاشته كه اگر اين شرط كه 20 شدن معدل تو است اجرا بشه . دستور شرط كه خريدن دوچرخه توسط بابات هست اجرا ميشه . حالا فهميدي
1-   بابا ما از كوچيكي داريم 20 مي گيرم بابامون برامون هيچي نگرفته . ولي مطلبو  خوب گرفتم
2-   عاليه. خوب بريم سر دستور شرط
IF   همان دستور شرط است
THEN  يعني اگر شرط اجرا شود اين THEN  مياد براي ما يك كاري رو انجام مي ده
1-   مثال برن
2-   همون مثال دوچرخه رو مي زنم . خوب باباي فلاني بهش گفته كه اگر معدلش 20 بشه يعني شرط IF . .. براش يك دچرخه مي خره يعني يك كاري رو در قبال شرطي رو كه گذاشته براي پسرش انجام مي ده يعني THEN
1-   اها گرفتم.  از مثال هاي برنامه هم برام بگو
2-   باشه .  بريم سر اون مثالي كه متغيير G رو توي يك حلقه قرار داده بوديم حالا ما مي خايم كه اگر اين متغيير G به 6 برسه بره و  PORTA.0 رو SET كنه :
CONFIG  PORTA =  OUTPUT
DIM  G AS  BYTE
G  =  0
DO
INCR  G
CLS
LCD  G
IF  G  =  6  THEN  SET  PORTA.0
WAITMS  50
LOOP
END
برنامه بالا رو كه تا حدودي مي دوني چيه چون قبلا توضيحشو دادم فقط مي مونه خط هفتم كه نوشته  IF  G  =  6  THEN  SET  PORTA.0  ما در اينجا با گذاشتن شرط يعني   IF  G  =  6  شرط  گذاشتيم كه اگر متغيير G به عدد 6 رسيد . ادامه نوشتيم THEN  SET  PORTA.0  بروي SET كن PORTA.0  . فهميدي
1-   اره ولي مگه شرط بندي حروم نيست
2-   چرا حرومه . ولي بايد مواظب باشي كه شرط رو نبازي
خوب  رسيديم به دستورات زير برنامه ( GOTO -  GOSUB )
1-   چي هستن اين زير برنامه ها
2-   با يك مثال برات توضيح مي دم توي مثال قبل اگر دقت كرده باشي متغيير G وقتي كه به عدد 6 مي رسيد مي رفت و PORTA.0 رو SET مي كرد و همينطوري به متغيير G اضافه مي شد . حالا اگر كه ما حال كرديم بعد از اين كه متغيير G به عدد 6 رسيد بره همون كاره خودشو يعني SET كردن PORTA.0   رو انجام بده ولي برنامه ديگه تموم بشه و ديگه شمارش نكنه يا به عبارتي به END  برسه . خوب براي اين كار بايد از زير برنامه استفاده كنيم  به مثال زير توجه كن :
CONFIG  PORTA  =  OUTPUT
DIM  G AS  BYTE
G  =  0
DO
INCR  G
CLS
LCD  G
IF  G  =  6  THEN GOTO AHMAD   
WAITMS  50
LOOP
AHMAD :
SET  PORTA.0
END
خوب حالا بريم تحليل برنامه . برنامه رو كه مي دوني چجوريه منظورم معني خط ها هستش البته به غير از خط هشتم كه نوشته
IF  G  = 6 THEN GOTO  AHMAD
خوب اين خط يعني اينكه اگر متغيير G رسيد به عدد 6 دستور شرط را اجرا كن كه دستور شرط اين است GOTO  AHAD  يعني بپر برو به زيربرنامه اي كه استش هست احمد . توجه كن كه به جاي اسم   AHMAD هر اسم ديگه اي مي توني بزاري هر اسمي كه حال كردي . بعد از اينكه متغيير G بع عدد 6 رسيد دستور شرط اجرا مي شود و ميكروكنترلر برنامه را از خط بعدي زيربرنامه AHNAD  مي خواند يعني خط  SET  PORTA.0 را مي خونه و پورت A.0 رو ست مي كنه بعد از اين كه ست كرد خط بعدي رو مي خونه كه نوشته END به محض اينكه اين دستور END رو خوند برنامه متوقف مي شه و به پايان مي رسه .
پس فهميدي كه زير برنامه براي وقتي هستش كه ما مي خوايم يك دستور شرط رو اجرا كنيم
به يك مثال ديگه توجه كن :
CONFIG  PORTA  =  OUTPUT
DIM  G AS  BYTE
METAL:
G  =  0
RESET  PORTA.0
DO
INCR  G
CLS
LCD  G
IF  G  =  6  THEN GOTO AHMAD   
WAITMS  50
LOOP
AHMAD:
SET  PORTA.0
WAITMS 50
GOTO  METAL
END


خوب حالا تحليل برنامه قبل . ميكرو مياد برنامه رو از خط اول شروميكنه به خوندن كه خط اول مربوط به پيكره بندي PORTA به عنوان خروجي هستش . بعد مياد خط دوم رو مي خونه كه در اين خط ما يك متغيير كه اسمش هست G و از نوع بايت مي باشد رو تعريف كرده ايم. خط سوم يك زير برنامه هستش به نام METAL كه فعلا بهش كار ندارم تا بعد در ضمن اين نكته رو بايد يادت باشه كه هر وقت يك زير برنامه رو مي نويسي بايد جلوش دو نقطه رو بزاري اينطوري METAL: . خط بعدي به متغيير يك مقدار داديم كه صفر است . خط بعدي نوشتيم  RESET  PORTA.0  كه به اين هم فعلا كار نداريم . خط بعدي DO هستش كه ابتداي حلقه را مشخص مي كنه . خط بعدي نوشته INCR  G يعني به مقدار متغيير G يك واحد اضاف كن يعني صفر كه بوده حالا كه يك واحد اضاف بشه مي شه يك . خط بعدي با دستور CLS ال سي دي را پاك كرديم تا براي نوشتن دوباره اماده شود . خط بعدي با فرمان LCD  G اين را رسانديم كه مقدار متغيير G رو روي ال سي دي نمايش بده كه الان بايد عدد يك رو روي ال سي دي نمايش بده . در خط بعدي  نوشتيم IF  G  =  6  THEN GOTO AHMAD    يعني اگر متغيير G ما به عدد 6 رسيد برو دستور شرط رو كه هست  THEN GOTO AHMAD   اجرا كن بعني بپر برو توي زير برنامه AHMAD  البته  وقتي دستور شرط اجرا ميشه كه  متغيير G به عدد 6 برسه . خط بعدي يك تاخير در برنامه با مدت زمان 50 ميلي ثانيه را گذاشتيم كه بعد از سپري شدن اين مدت زمان برنامه از خط بعدي شروع مي شه خوب تا اين جا كه متغيير ما عدد 1 هستش . بعد كه ميكرو ميرسه به دستور LOOP دوباره  دور مي زنه و خط زيري DO رو مي خونه كه نوشته INCR  G يعني يك واحد به متغيير G  اضافه كن خوب متغيير G الان هستش 1 بعد كه به اين دستور رسيد اين دفعه يك واحد بهش اضافه مي شه و مي شه دو . اين عمل انقدر ادامه مي يابد تا متغيير G برسه به عدد 6 . همين كه به عدد 6 رسيد از اونجايي كه ما يك شرط با دستور 
IF  G  =  6  THEN GOTO AHMAD   گذاشتيم يعني اينكه وقتي متغيير G به عدد شش رسيد يعني IF G  = 6  برو دستور  شرط رو كه هستش    THEN GOTO AHMAD  اجرا كن يعني اينكه بپر برو توي زير برنامه AHMAD خوب حالا ميكرو ميپره ميره برنامه رو از خط زيري زير برنامه AHMAD مي خونه كه نوشته SET  PORTA.0 يعني پايه A.0 رو يك كن . بعدش نوشته WAITMS  50 يعني اينكه به مدت زمان 50 ميلي ثانيه در برنامه تاخير ايجاد كن كه در طول اين مدت PORTA.0 در وضعيت SET قرار دارد بعد از اين كه اين مدت زمان سپري شد برنامه از خط بعدي اجرا مي شه خط بعدي يعني   GOTO  METAL   يعني اينكه بپر برو توي زير برنامه METAL و ميكرو هم همين كار رو مي كنه و مي پره مي ره توي زير برنامه METAL  و برنامه از خط بعدي اين زير برنامه كه هستش G  =  0 ادامه پيدا مي كنه اين خط به اين معني هستش كه متغيير G  رو كه بوده 6 حالا بيا صفرش كن . در خط بعدي يعني RESET  PORTA.0 يعني اينكه پايه A.0 رو كه ست كرده بودي حالا بيا ريستش كن يعني صفر كن. خوب حالا هم متغيير G ما صفر هستش هم اينكه PORTA.0 ما صفر يا همون ريست هستش . بعد ميكرو مي ياد  برنامه رو از خط بعدي شروع ميكنه به خوندن كه نوشته DO بعني اول زيربرنامه . خط بعدي نوشته INCR  G يعني يك واحد به متغيير G ما كه الان دوباره صفرش كرديم اضافه كن كه بشه يك . دوباره روز از نو روزي از نو  يعني اينكه دوباره شروع مي كنه به اضافه كردن متغيير تا دوباره برسه به 6 بعد كه رسيد به 6 دوباره بپره بره به زير برنامه  AHMAD اونجا باز  PORTA.0 رو يك مي كنه بعدش تاخير ايجاد مي كنه بعد با دستور GOTO  METAL مي پره ميره به زير برنامه METAL كه در بالاي برنامه هستش بعد دوباره متغيير رو كه 6 هستش رو صفر مي كنه به دنبالش PORTA.0 رو هم كه يك بوده صفر مي كنه  باز دوباره...................................
حالا رسيديم به دستور  GOSUB 
اين دستور همان دستور GOTO هستش  با اين تفاوت كه يك دستور ديگه همراهش هست به نام اقاي RETURN  كه اين RETURN رو هر جاي برنامه كه بنويسيم  ميكرو مياد برنامه رو از خط بعدي GOSUB شروع مي كنه به خوندن . كه دربارش وقتي كه خواستم ورودي رو بهت درس بدم مي گم .
ورودي  PIN  :
ورودي در ميكرو كاربرداي فراووني داره مثلا در ساده ترين حالت  مي خاي يك ميكروسوييچ به ميكروكنترلر وصل كني كه با هر بار زدن اين ميكروسوييچ يك LED روشن و خاموش بشه در مراحل پيشرفته هم مثلا در ساخت يك ربات كاربرد داره به اين صورت كه يك سنسور مادون قرمز بهش وصل بشه و مثلا به يك خط سياه حساس باشه و از اين طور كارا
خوب بريم سر دستور ورودي .  باز هم مي خوام با يك مثال برات توضيح بدم
فرض كن كه مي خايم با يك ميكرو سوييچ كه به ميكرو وصل كرديم يك LED رو يك بار روشن و يك بار خاموش كنيم كه برنامه به صورت زير است و خيلي خيلي ساده :
CONFIG  PINB.0  =  INPUT
DIM  A AS  BYTE
Ali:
DO
DEBOUNCE   PINB.0  ,  1  ,  SONY
LOOP
END
SONY:
INCR  A
CLS
LCD A
GOTO  ALI
خوب حالا وقت تحليل برنامه هستش: درخط اول ما اومديم با نوشتن دستور CONFIG  PINB.0  =  INPUT  پايه B.0 رو به  عنوان ورودي تعريف كرديم . در خط بعد يك متغيير از نوع بايت كه اسمش رو گذاشتيم A تعريف كرديم . در خط بعدي يك زير برنامه به نام ALI گذاشتيم كه فعلا بهش كار نداريم و در ادامه توضيحش مي دم. در خط بعدي با نوشتن DO ابتداي حلقه را مشخص كرديم . در خط بعدي نوشتيم كه   DEBOUNCE   PINB.0  ,  1  ,  SONY   كه هر وقت خاستي كه يك ورودي رو تعريف كني بهتره از اين دستور استفاده كني يا به عبارتي حتما استفاده كني خوب حالا لابد از خودت مي پرسي كه اين دستورات چي هست اين دستور كه همش بايد توي يك خط نوشته بشن رو يكي يكي برات بازش مي كنم DRBOUNCE  رو هميشه وقتي كه مي خاي يك ورودي رو تعريف كني اولش بايد بزاري و كاربردشم اينه كه يك تاخير خيلي خيلي كوچيك كه به چشم هم نمياد ايجاد مي كنه و باعث مي شه كه پايه ورودي نويز نگيره  يك بار ديگه دوباره مي گم ما نوشتيم كه DEBOUNCE   PINB.0   يعني پايه  B.0 رو از نظر نويز محافضتش  كن خوب اين تا بعدش علامت  ,  رو گذاشتيم تا جملات از هم تفكيك شوند كه بايد حتما علامت  ,  رو بزاري در ادامه ما نوشتيم كه 1  خوب حالا اين 1 يعني چي . اين 1 يعني اگر پايه B.0 يا يك 1 شد يا به عبارتي SET شد با ميتونيم بگيم كه يك نوع شرط است كه در مقابل يك شدن پايه B.0 گذاشته ايم و جلوي اين 1 دوباره علامت  ,  گذاشتيم تا از جمله بعديش تفكيك بشه . در جمله بعديش نوشتيم SONY  كه اين يعني اينكه اقا اگر اين پايه B.0 ما 1  شد بپر برو توي زيربرناه SONY كه به جاي اينSONY هر اسم دخواه ديگه اي هم مي توني بزاري . يك بار ديگه برات اين جمله رو به صورت كلي توضيح مي دم معني اين جمله دستوري اين هستش كه اگر PINB.0 ما 1 شد بپر برو توي زيربرنامه  SONY و اگر صفر بود كه هيچي . در خط بعدي نوشتيم LOOP كه انتهاي حلقه را با اين كلمه مشخص كرديم . در خط بعدي نوشتيم END كه برنامه هيچگاه به END نمي رسد . در خط بعدي نوشتيم SONY   كه SONY يك زيربرنامه است كه مي تونست هر اسم ديگه اي باشه . در خط بعدي نوشتيم  INCR  A  كه به معني اضافه كردن يك واحد به متغيير A مي باشد . در خط بعدي نوشتيم كه CLS يعني پاك كن كل صفحه ال سي دي رو تا براي نوشتن اماده بشه. در خط بعدي نوشتيم GOTO  ALI يعني بپر به زيربرنامه ALI  .
خوب حالا بريم سر طرز كار مدار : اين مدار در واقع يك شمارنده هستش . طرز كارش هم اينطوريه كه ميكرو مياد سه خط اول رو مي خونه بعد ميره مي يوفته توي حلقه DO -  LOOP  و اونجا داخل اين حلقه هي دور ميزنه تا كي تا وقتي كه PINB.0 ما يك بشه يعني شرطي كه گذاشته ايم اجرا بشه كه شرط ما اين هستش كه پايه B.0 يك بشه بعد از اينكه اين شرط اجرا شد ميكرو مياد دستور شرط رو اجرا مي كنه دستور شرط كدومه هموني كه بهت گفتم  يعني پرش به زير برنامه SONY . وميكرو كه گوش به فرمان برنامه هست مي پره مي ره داخل زير برنامه SONY و از خط  بعدي زير برنامه SONY كه نوشته 
INCR  A  رو مي خونه و طبق اين دستور يك واحد به اين متغيير  A  اضافه مي كنه يعني ميكنش 1 .  بعدش مي ياد خط بعدي رو مي خونه كه نوشته CLS يعني اينكه كل ال سي دي پاك بشه تا براي نوشتن حاضر بشه . در خط بعدي نوشتيم كه
LCD  A  به اين معني كه مقدار متغيير A  رو كه هستش يك روي LCD نمايش بده . در خط بعدي نوشته  GOTO  ALI  يعني اينكه بپر برو توي زير برنامه ALI  و ميكرو هم همين كار رو مي كنه و مي پره مي ره  اولين خط بعد از زير برنامه ALI رو كه نوشته DO رو مي خونه و دوباره ميوفته توي اين حلقه و باز هم دوباره انقدر توي اين حلقه هستش و توي اين حلقه دور مي زنه تا وقتي كه دوياره PINB.0  يك بشه يا به عبارتي SET بشه اونوقت دوباره روز از نو روزي از نو و ميپره دوباره توي زيربرنامه SONY و دستورات داخل اين زير برنامه رو دباره اجرا مي كنه كه در خط اول اين زير برنامه نوشته 
INCR  A  يعني دوباره يك واحد به متغيير A   اضافه كن و ميكرو هم اين كار رو ميكنه و متغيير A كه يك  بوده الان ميشه 2  بعد مياد دستور CLS رو مي خونه كه لازم به توضيح نيست . بعد مي يا دستور LCD  A  رو مي خونه كه مقدار جديد اين متغيير A رو كه الان هستش 2 رو روي LCD نمايش مي ده بعد مياد دستور GOTO  ALI  رو مي خونه و مي پره مي ره توي زير برنامه ALI دوباره ميوفته توي حلقه و الي اخر . با استفاده از اين برنامه مي توني يك شما رنده درست كني كه مي تونه از عدد 0 تا 255 رو بشماره و اگر خاستي رنج شمارشش از 255 بيشتر باشه مي توني به جاي BYTE توي برنامه بنويسي WORD . اين برنامه در كارخونه هم كاربرد داره البته باكمي تغييرات كوچيك در برنامه و مثلا بايك سنسور مي شه قطعات عبوري از روي خط توليد رو شمارش كرد.
1-   از نظر اتصالات سخت افزاريش هم توضيح بده برام
2-   اين كه خيلي ساده هستش كافيه تغذيه ميكرو رو وصل كني و با يك ميكروسوييچ كه يك سرش رفته باشه به VCC  5 ولت و سر ديگه ميكروسوييچ هم رفته باشه به پايه B.0 و اتصالات  ال سي دي اين مدار رو كاملش كني.
1-   جالب بود
2-   تو به اين مي گي جالب بزار يكم راه بيوفتي  اونوقت اين طور مدارا برات پيش پا افتاده هستش . وقتي كه ميتوني ميكروكنترلر رو از طريق تلفن .SMS و اينترنت كنترلر كني ديگه اين مدارات در نظرت بچه بازي هستش
1-   چطوري از طريق اينايي كه گفتي كنترل مي كنن
2-   ديگه بايد يكم اطلاعاتت در مورد پورتهاي كامپيوتر و PC  INTERFACES  كامل باشه كه بتوني از طريق مثلا اينترنت يك موتور رو كنترل كني وگرنه برنامه نويسي ميكرو كه چيز نيست
1-   با اين PC  INTERFACES  چه كار ميتوني بكني و اصلا چي هستش
2-   اندازه گيري و كنترل با استفاده از پورتهاي استاندار تحت ويندوز رو  مي گن  PC  INTERFACES  مثلا شما توي محيط نرم افزار ويرژال بيسيك يك برنامه اي مي نويسي كه اگر مثلا فلان دكمه كيبرد فشرده شد خروجي فلان پورت كامپيوتر رو يك كن كه اين خروجي ها از نظر استاندارد با استاندارد ميكروكنترلر فرق دارند و بايد از اي سي MAX232 استفاده كني كه از نظر استاندارد با هم مطابق شوند .
1-   علم چقدر پيشرفت كرده ها
2-   بله . بزار يك مثال ديگه هم بزنم ولي توضيحش رو خيلي خلاصه برات مي گم
CONFIG  PORTA  =  OUTPUT
CONFIG  PINB.0  =  INPUT
DIM  A AS  BYTE
Ali:
DO
DEBOUNCE   PINB.0  ,  1  ,  SONY
LOOP
END
SONY:
INCR  A
CLS
LCD A
TOGGLE  PORTA
GOTO  ALI
در برنامه بالا فقط يك چيز اضافه شده اونم  دستور TOGGLE  PORTA  كه با وجود اين دستور هر وقت كه ميكرو به زير برنامه SONY  پرش  مي كنه علاوه براين كه يك واحد به متغيير A اضافه مي كنه و روي ال سي دي هم نمايش مي ده موقعييت PORTA رو هم عوض مي كنه يعني اگر صفر باشه يك مي شه و اگه يك باشه صفر مي كنه و دفعه بعد كه به اين زير برنامه رفت دوباره اگر صفر باشه يكش مي كنه و اگه يك باشه صفرش مي كنه بزار منظورمو ساده بگم اگر شما يك LED  به پايه هاي A.0 تا A.7 وصل كني به ازاي هر بار زدن ميكروسوييچ اين LED ها يك بار روشن و بارديگه خاموش مي شن.

براي امروز ديگه كافيه بقيش باشه براي جلسه بعدي

پايان قسمت چهارم
تشکرات از این پست
دسترسی سریع به انجمن ها