رجیستر چیست؟ رجیستریهای PORTx, PINx , DDRx، قسمتی از برنامهی یک ربات مسیریاب بسیار ساده و ...
رجیسترها توعی حافظه هستند که به طور مستقیم با بخشش پردازشگر میکروکنترلر در ارتباط هستند. هر رجیستر یک بایت یا 8 بیت است. یکی از ویژگیهای رجیسترها این است که به خاطر ارتباط نزدیک با پردازنده، سرعت بسیار بالاتری نسبت به سایر خانههای حافظه دارند... | |
به نام خدا
با عرض سلام خدمت همه ي دوستان عزيز
شروع سال جديد تحصيلي را به همه ي دوستان خوبم تبريک عرض مي کنم و براي همه ي دوستان سال خوب تحصيلي سرشار از موفقيتي رو آرزو مي کنم.
در ضمن دوستاني هم که امسال وارد پيش دانشگاهي شدند فراموش نکنند که ديگه نبايد تا کنکورشون اين طرفا تشريف بيارن!!!!!!!!
خوب، بر مي گرديم سر مبحث ميکروکنترلرها....
قرار بود اين جلسه برنامه ي يک مسيرياب بسيار ساده ي 2 سنسوره را با هم بنويسيم. اما ابتدا بايد چندتا نکته ي ديگه هم ياد بگيريم.
همونطور که گفته شد AT Mega16 داراي پايه هاي متعددي براي تبادل اطلاعات با مدار است. هر 8پايه ي مجاور که اين وظيفه را دارند يک پورت ناميده مي شوند (به شکل نگاه کنيد) . AT Mega16 داراي 4 پورت با نام هاي A ، B ، C و D مي باشد. پايه هاي هر پورت به اين شکل نمايش داده مي شود:
شماره ي پايه+"."+نام پورت
مثلاً اولين پايه ي پورت D به اين صورت نشان داده مي شود: D.0
و پايه ي سوم پورت C به صورت : C.2
حال به ترتيب پايه هاي ATMEGA16L دقت کنيد
دقت کنيد که شماره گذاري پايه ها در پورت ها از 0 شروع مي شود.
همچنين گفته شد، پايه هاي ميکروکنترلر مي توانند به صورت ورودي يا خروجي تنظيم شوند، مثلاً در يک ربات مسيرياب ميتوان چند پايه را تنظيم کرد که ورودي باشند و اطلاعات سنسورها را دريافت کنند، يا انها را تنظيم کرد تا خروجي باشند و موتورها را هدايت کنند. اين تنظيم به صورت نرم افزاري و با تنظيم رجيستر DDRx انجام مي گيرد. اما ابتدا بايد رجيستر را تعريف کنيم.
رجيستر چيست؟
رجيسترها توعي حافظه هستند که به طور مستقيم با بخشش پردازشگر ميکروکنترلر در ارتباط هستند. هر رجيستر يک بايت يا 8 بيت است. يکي از ويژگي هاي رجيسترها اين است که به خاطر ارتباط نزديک با پردازنده، سرعت بسيار بالاتري نسبت به ساير خانه هاي حافظه دارند.
رجيستر DDRx:
رجيستر DDRx (Data Direction) براي تنظيم ورودي يا خروجي بودن پايه هاي ميکروکنترلر است. براي تنظيم پايه ها در برنامه، بايد به جاي x بايد آدرس پايه ي مورد نظر(مثل B.3) را بنويسيم. اگر بخواهيم آن پايه خروجي باشد بايد بيت رجيستر مربوط به آن را 1 کنيم، و اگر بخواهيم آن پايه ورودي باشد، بايد بيت رجيستر مربوط به آن را 0 کنيم. به عنوان مثال اگر بخواهيم پايه17 يعني D.3 خروجي باشد بايد اين جمله را بنويسيم: DDRD.3=1;
و اگر بخواهيم اين پايه ورودي باشد: DDRD.3=0;
رجيستر PORTx:
در صورتي که پايه ها به صورت خروجي تنظيم شده باشند، هر چه در اين رجيستر نوشته شود سطح منطقي پايه ي متناظر را تعيين مي کند، مثلاً اگر بنويسيم PORTB.3=1 پايه B.3 يعني پايه ي 4، 1 منطقي خواهد شد(يعني ولتاژ 5 ولت بر روي اين پايه قرار مي گيرد). و اگر بنويسيم PORTC.1=0، پايه ي C.1 يعني پايه ي 23، 0 منطقي خواهد شد (يعني ولتاژ اين پايه 0 مي شود.).
رجيستر PINx:
در صورتي که پايه ها به صورت ورودي تنظيم شده باشند، محتويات اين رجيستر حاوي اطلاعات دريافتي از پايه هاي ميکروکنترلر است. مثلاً اگر PINB.1=0 باشد، يعني بر روي پايه شماره ي 2 يا همان B.1 ؛ 0 منطقي اعمال شده است(مثلاً اگر به سنسوري وصل شده است، خروجي سنسور 0 منطقي بوده است). در حقيقت اين رجيستر براي خواندن وضعيت پايه هاي ورودي مورد استفاده قرار مي گيرد.
نکته ي بسيار مهم: دقت کنيد که در زبان C، بايد در انتهاي هر خط از برنامه يک علامت ";" گذاشته شود. به اين علامت در زبان انگليسي سِمي کالِن مي گويند.
نکته ي مهم:
در حقيقت براي هر پورت 3 رجيستر(حافظه 1 بايتي) در داخل ميکروکنترلر وجود دارد که به مجموع اين 12 رجيستر، رجيسترهاي I/O (Input/Output) مي گويند.
بسيار خوب، حالا نوبت نوشتن برنامه ي 1 ربات مسيرياب ساده است که فقط 2 تا سنسور داره!!!
نرم افزاري کمکي به نام Code Wizard در داخل همان Codevision وجود دارد که کار ما را براي انجام تنظيمات اوليه مانند تنظيم ورودي يا خروجي بودن پايه ها آسان مي کند. يعني ديگه نيازي نيست براي هر پايه تک تک با رجيستري DDR سرو کله بزنيم، و به راحتي با چند تا تيک ساده همه ي پايه ها رو تنظيم مي کنيم. البته Code wizard همونطور که از اسمش هم معلومه بسياري امکانات جادويي ديگري هم داره که در جلسات آينده به تدريج با آن ها آشنا خواهيم شد. Code Wizard در حقيقت براي ساده تر کردن و سريع تر کردن برنامه نويسي در فضاي Codevision طراحي شده است و کارش اين است که قسمت هاي زيادي از برنامه را به صورت خود کار و طبق خواسته هاي ما براي ما مي نويسد.
پس با اين حساب نيازي نيست تنظيمات رجيستري DDRx رو ما در برنامه خودمون انجام بديم و اين کار رو به Code wizard واگذار مي کنيم. با Code wizard در جلسه ي آينده آشنا خواهيم شد.
پس در اين جلسه فرض مي کنيم تنظيمات اوليه مثل رجيستري DDRx و ... انجام شده است. پايه هاي B.0 و B.1 را به صورت ورودي(براي دريافت اطلاعات سنسورها)، و پايه هاي B.2 ،B.3 ، B.4 و B.5را به صورت خروجي (براي کنترل حرکت موتورها) تنظيم کرده مي کنيم.
B2 و B.3 براي کنترل موتور سمت راست و B.0 براي سنسور سمت راست!
B.4 و B.5 براي کنترل موتور سمت چپ و B.1 براي سنسور سمت چپ!
حال مانند ربات قبلي، يک پايه از هر موتور را 0 مي کنيم؛ و روشن و خاموش کردن هر موتور را، با اعمال 0 يا 1 منطقي بر روي پايه ي ديگر کنترل مي کنيم.
پايه ي ديگر را هم به صورت هماهنگ با سنسور متناظر آن سمت 0 و 1 مي کنيم، يعني اگر خروجي سنسور 0 بود، پايه ي موتور را 0 مي کنيم و اگر 1 بود ، پايه را 1 کرده و موتور را فعال مي کنيم.(به شرطي که از مدار گيرنده ي شماره 2 استفاده شود(جلسه ي 15))
در زبان C علامت "=" يک عملگر است که عملوند سمت راست خود را خوانده و در عملوند سمت چپ خود مي ريزد. مثلاً وقتي مي نويسيم:
PORTB.3=PINB.0;
ابتدا مقداري B.0 خوانده مي شود و سپس بر روي B.3 ريخته مي شود. يعتي مثلاً اگر روي B.0 ، 1 منطقي اعمال شده باشد، پايه ي B.3 نيز 1 منطقي مي شود.
حال با توضيحات داده شده به برنامه ي ربات مسير ياب ساده دقت کنيد:
PORTB.2=0;
PORTB.4=0;
PORTB.3=PINB.0;
PORTB.5=PINB.1;
همانطور که مي بينيد اين برنامه بسيار ساده و کوتاه است.
در جلسات آينده سعي مي کنيم شما رو با Code wizard بيشتر آشنا کنيم. منتظر سوالات و نظرات دوستاي خوبم هستم.
پيروز باشيد.
دوست شما، فراز