آموزش میکروکنترلر AVR
در قسمت دوم مجموعه آموزش میکروکنترلر AVR درباره کلاک میکروکنترلر، ارتباط CPU با ورودی، خروجیها و بلوک I/O صحبت کردیم. در این قسمت با ورودی، خروجی پورتهای میکروکنترلر بیشتر آشنا میشویم. ارتباط CPU با سختافزارهای جانبی ازطریق نوشتن دستور در آدرسهای مشخصی میسر میشود. مجموعه آموزش میکروکنترلر AVR روی دو شماره میکروکنترلر ATMEGA16 و ATMEGA32 تمرکز میکند. تصویر زیر یک ATMEGA16 را نشان میدهد.
تفاوت بین ATMEGA16 و ATMEGA32 در ظرفیت فلش آنهاست. ظرفیت فلش در ATMEGA16 برابر ۱۶کیلوبایت و در ATMEGA32 برابر ۳۲کیلوبایت میباشد. حداقل اتصالات برای راهاندازی میکروکنترلر بهصورتزیر میباشد:
در شکلبالا پایه شماره ۱۱ و ۳۱ به زمین متصلشده و پایهی شماره ۱۰ و ۳۰ به تعذیه +۵ ولت وصلشدهاست. با مراجعهبه اطلاعات پایههای ATMEGA16 پی میبریم که پایه ۱۰،VCC و پایه ۳۰،AVCC است، A بهمعنای آنالوگ است و تغذیه بخش آنالوگ میکروکنترلر را برعهده دارد. تغذیه AVCC مربوطبه پورت A است، که ورودیهای (ADC (ANALOG TO DIGITAL CONVERTER در این بخش هستند. همچنین برای کاهش نویز نیز از یک فیلتر پایینگذر LC متصلبه AVCC استفاده میشود. نکتهمهم دیگر این است که درمواقعی که حتی از قسمت آنالوگ استفاده نمیشود هم باید تغذیه AVCC را متصلنمود، چون ممکناست در کارکرد میکروکنترلر اختلال ایجاد کند. پایههای دیگری در میکروکنترلر برای ایجاد نوسان بهوسیله کریستال خارجی وجود دارند که باتوجهبه اینکه مقدار پیشفرض کلاک ATMEGA32 برابر ۱MHZ داخلی هست در شکلبالا برای سادهتربودن شکل آورده نشدهاست.
رجیسترکردن پورت
بحث بعدی، بحث پروگرامکردن میکروکنترلر و پایههایی که برای پروگرامکردن مورداستفاده قرار یگیرد، میباشد. پروگرامکردن به دوصورت سری و موازی انجام میگیرد. حال میخواهیم ببینیم که چطور میشود یک LED متصلبه یکیاز پایههای میکروکنترلر که بهصورت سری با یک مقاومت متصلشدهاست را روشنکرد؟ باتوجهبه شکلزیر:
سه بایت مختلف در شکلبالا به نامهای PINB, DDRB, PORTB کشیدهشدهاست،که رجیسترهایی موردنیاز برای ارتباط با PORTB هستند، PORTB از پایه شماره ۱ تا ۸ میکروکنترلر را شامل میشود. حال میخواهیم روی PORTB.1 که کمارزشترین پورت هست با نوشتن برنامه تاثیر بگذاریم و آن را روشنکنیم و روشن بماند. نکتهقابلتوجه این است که پورتهای میکروکنترلر ۸بیتی هستند، یعنی در آن واحد میتوانیم اطلاعات را برروی این ۸بیت بنویسیم یا از روی آنها بخوانیم. برای نوشتن، پورتها خروجی تعریف میشوند و برای خواندن، ورودی تعریف میشوند. بهصورت پیشفرض و بعداز ریست میکروکنترلر تمام پورتها بهصورت ورودی درنظرگرفته شدهاند و برای خروجیشدن باید به کمک برنامه آنها را خروجی کرد.
DDRx: برای ۸پین فیزیکی موجود در هر پورت، ۸محل در رجیستر DDRx درنظرگرفته شدهاست که هرکدام از این محلها متناظر با پین مخصوصبهخود است. برای مثال DDRA.1≈PORTA.1 جهت پورتها را بهلحاظ ورودی و خروجی ازطریق آدرس ۳۷$ در فضایSRAM تعریف میکنیم. بعداز اینکه جهت پورت مشخصشد میخواهیم روی وضعیت خروجی بحثکنیم، فرض میکنیم پین یا پینهایی از یک پورت خروجی تعریفشدهاست، میخواهیم وضعیت خروجی آن بهعبارتی HIGH/LOW بودن یا ۰ و ۱ بودن آن را تعیینکنیم. بایت بعدی که تحت عنوان PORTB در شکلبالا نمایش داده شدهاست همین وظیفه را برعهده دارد، یعنی به همین طریقی که یک تناظر یک یه یکی در بایت بالایی با پینهای فیزیکی و واقعی بهلحاظ جهت(ورودی و خروجی) وجود دارد، در بایت بعدی یک تناظر یکبهیک به لحاظ مقدار یا وضعیت یا ۰ و ۱ وجود دارد، حال اگر بخواهیم LED روشنشود باید توجهداشتهباشیم که باتوجهبه سختافزار وقتی وضعیت پایه درحالت HIGH است روشن میشود پس باید یک ۱ توسط خطوط برنامه بهصورتزیر نوشتهشود.
برای توضیح بیشتر شکل بالا اگر DDRB.0=1 و PORTB.0=1 باشد پین مربوطه خروجی است و وضعیت آن HIGH خواهد شد. درحالتبعدی فرض میکنیم DDRB.0=1 و PORTB.0=0 باشد پس معنی آن ایناست که پین خروجی است ولی وضعیت آن LOW میباشد. پس برای روشنشدن LED نیاز است که 1=DDRB.0 و 1=PORTB.0 باشند.
PINB: در واقع CPU از طریق رجیستر PINB میتواند از وضعیت آن اطلاع پیدا کند که ۰ یا ۱ است. وقتیکه پورت ورودی تعریف میشود برای خواندن وضعیت سیگنالهایی که به پورت اعمال میشوند و یا از خروجیها تامین میشوند و به این ورودیها متصل شدهاند PINB قرائت شود. البته باید توجهداشت که برای هر پورتی حرف مربوطبه خود نوشته میشود مثلا برای PORTA،PINA و… نکته دیگر اگر در رجیستری که متناظر با جهت است (DDRB) پینی ورودی تعریفشود یعنی DDRB.0=0 باشد و PORTB.0=1 باشد بهصورت داخلی در آن پورت یک مقاومت داخلی PULL UP فعال میشود.
مقاومت PULL UP: یک پورت اگر ورودی باشد و بهجایی متصلنباشد مکانی برای تاثیرگذاری نویز است. بنابراین پورتها را با بسته به وضعیت و کاربردی که دارند یا با یک مقاومتی PULL UPمیکنند یا با یک مقاومتی PULL DOWN میکنند، که در سختافزار داخلی AVR امکان فعالکردن PULL UP داخلی وجود دارد.
به ۳روش کلی میتوان از ابزار برنامهنویسی استفاده کرد: شیوه اول برنامهنویسی به زبان اسمبلی میباشد که ازلحاظ مفهومی خیلیمفید هست و باتوجهبه اینکه استفادهکنندههای خاصی دارد و در کاربردهای ویژهای از آن استفاده میشود در این آموزش استفاده نمیشود. کامپایلرهای مختلفی برای AVR با زبانهای مختلفی نوشتهشدهاست مانند زبان بیسیک، زبان C ،پاسکال و… که زبان C بین باقی زبانها بسیار کاربرپسندتر است. کامپایلری که برای زبان BASIC استفاده میشود کامپایلر BASCAM میباشد و برای زبان C کامپایلر CODEVISION. در مجموعه آموزش میکروکنترلر AVR تصمیم بر این است که هم با زبان C و هم با BASIC نوشته شود. کامپایلر بسکام بیشتر برای کسانی کاربرد دارد که نمیخواهند بهصورت حرفهای عمل کنند. اما اگر کسی بخواهد بهصورت حرفهای عملکند باید با زبان C پیش برود.
در قسمت چهارم آموزش میکروکنترلر AVR، برنامهای که در این قسمت راجب آن صحبت کردیم را به دو زبان C و BASIC مینویسیم. با ما همراه باشید.
منبع: سیسوگ