آموزش جامع میکروکنترلر AVR – قسمت سوم ;
این سری آموزشها که به جرات می توان آنها را کاملترین آموزشهای موجود دانست با صرف هزینه زیاد و با کیفیت و جزییات بالا توسط استاد ارجمند جناب آقای کینژاد تهیه شده است و به صورت رایگان در اختیار عموم قرار گرفته است.
سیسوگ در قسمت دوم مجموعه آموزش میکروکنترلر AVR درباره کلاک میکروکنترلر، ارتباط CPU با ورودی، خروجیها و بلوک I/O صحبت کرد. در این قسمت با ورودی ، خروجی پورتهای میکروکنترلر بیشتر آشنا میشوید.
ارتباط CPU با سخت افزارهای جانبی از طریق نوشتن دستور در آدرسهای مشخصی میسر میشود.
مجموعه آموزش میکروکنترلر AVR روی دو شماره میکروکنترلر ATMEGA16 و ATMEGA32 تمرکز میکند.
پایه های atmega32 و atmega16
تصویر زیر یک ATMEGA16 را نشان میدهد. شما می توانید پایه های atmega16 و atmega32 در این تصویر مشاهده کنید.
تفاوت بین ATMEGA16 و ATMEGA32 در ظرفیت فلش آنهاست. ظرفیت فلش در ATMEGA16 برابر 16 کیلوبایت و در ATMEGA32 برابر 32 کیلوبایت میباشد.
حداقل اتصالات برای راهاندازی میکروکنترلر به صورت زیر میباشد:
در شکل بالا پایه شماره 11 و 31 به زمین متصل شده و پایه شماره 10 و 30 به تعذیه +5 ولت وصل شده است. با مراجعه به اطلاعات پایههای ATMEGA16 پی میبریم که پایه 10،VCC و پایه 30،AVCC است، A به معنای آنالوگ است و تغذیه بخش آنالوگ میکروکنترلر را بر عهده دارد.
تغذیه AVCC مربوط به پورت A است، که ورودیهای (ADC (ANALOG TO DIGITAL CONVERTER در این بخش هستند. همچنین برای کاهش نویز نیز از یک فیلتر پایین گذر LC متصل به AVCC استفاده میشود. نکته مهم دیگر این است که در مواقعی که حتی از قسمت آنالوگ استفاده نمیشود هم باید تغذیه AVCC را متصل نمود، چون ممکن است در کارکرد میکروکنترلر اختلال ایجاد کند.
پایههای دیگری در میکروکنترلر برای ایجاد نوسان به وسیله کریستال خارجی وجود دارند که با توجه به اینکه مقدار پیش فرض کلاک ATMEGA32 برابر 1MHZ داخلی هست در شکل بالا برای سادهتر بودن شکل آورده نشده است.
رجیستر کردن پورت
بحث بعدی،بحث پروگرام کردن میکروکنترلر و پایههایی که برای پروگرام کردن مورد استفاده قرار میگیرد میباشد. پروگرام کردن به دو صورت سری و موازی انجام میگیرد.
حال میخواهیم ببینیم که چطور میشود یک LED متصل به یکی از پایههای میکروکنترلر که به صورت سری با یک مقاومت متصل شده است را روشن کرد؟
با توجه به شکل زیر
سه بایت مختلف در شکل بالا به نامهای PINB, DDRB, PORTB کشیده شده است،که رجیسترهایی مورد نیاز برای ارتباط با PORTB هستند، PORTB از پایه شماره 1 تا 8 میکروکنترلر را شامل میشود. حال میخواهیم روی PORTB.1 که کم ارزشترین پورت هست با نوشتن برنامه تاثیر بگذاریم و آن را روشن کنیم و روشن بماند.
نکته قابل توجه این است که پورتهای میکروکنترلر 8 بیتی هستند، یعنی در آن واحد میتوانیم اطلاعات را بر روی این 8 بیت بنویسیم یا از روی آنها بخوانیم. برای نوشتن، پورتها خروجی تعریف میشوند و برای خواندن، ورودی تعریف میشوند. به صورت پیش فرض و بعد از ریست میکروکنترلر تمام پورتها به صورت ورودی در نظر گرفته شدهاند و برای خروجی شدن باید به کمک برنامه آنها را خروجی کرد.
DDRx : برای هشت پین فیزیکی موجود در هر پورت،8 محل در رجیستر DDRx در نظر گرفته شده است که هر کدام از این محلها متناظر با پین مخصوص به خود است. برای مثال DDRA.1≈PORTA.1
جهت پورتها را به لحاظ ورودی و خروجی از طریق آدرس 37$ در فضای SRAM تعریف میکنیم.
بعد از اینکه جهت پورت مشخص شد میخواهیم روی وضعیت خروجی بحث کنیم، فرض میکنیم پین یا پینهایی از یک پورت خروجی تعریف شده است، میخواهیم وضعیت خروجی آن به عبارتی HIGH/LOW بودن یا 0 و 1 بودن آن را تعیین کنیم. بایت بعدی که تحت عنوان PORTB در شکل بالا نمایش داده شده است همین وظیفه را بر عهده دارد، یعنی به همین طریقی که یک تناظر یک یه یکی در بایت بالایی با پینهای فیزیکی و واقعی به لحاظ جهت (ورودی و خروجی) وجود دارد، در بایت بعدی یک تناظر یک به یک به لحاظ مقدار یا وضعیت یا 0 و 1 وجود دارد، حال اگر بخواهیم LED روشن شود باید توجه داشته باشیم که با توجه به سختافزار وقتی وضعیت پایه در حالت HIGH است روشن میشود پس باید یک 1 توسط خطوط برنامه به صورت زیر نوشته شود.
برای توضیح بیشتر شکل بالا اگر DDRB.0=1 و PORTB.0=1 باشد پین مربوطه خروجی است و وضعیت آن HIGH خواهد شد.
در حالت بعدی فرض میکنیم DDRB.0=1 و PORTB.0=0 باشد پس معنی آن این است که پین خروجی است ولی وضعیت آن LOW میباشد.
پس برای روشن شدن LED نیاز است که 1=DDRB.0 و 1=PORTB.0 باشند.
PINB : در واقع CPU از طریق رجیستر PINB میتواند از وضعیت آن اطلاع پیدا کند که 0 یا 1 است. وقتی که پورت ورودی تعریف میشود برای خواندن وضعیت سیگنالهایی که به پورت اعمال میشوند و یا از خروجیها تامین میشوند و به این ورودیها متصل شدهاند PINB قرائت شود. البته باید توجه داشت که برای هر پورتی حرف مربوط به خود نوشته میشود مثلا برای PORTA،PINA و …
نکته دیگر اگر در رجیستری که متناظر با جهت است (DDRB) پینی ورودی تعریف شود یعنی DDRB.0=0 باشد و PORTB.0=1 باشد به صورت داخلی در آن پورت یک مقاومت داخلی PULL UP فعال میشود.
مقاومت PULL UP : یک پورت اگر ورودی باشد و به جایی متصل نباشد مکانی برای تاثیر گذاری نویز است. بنابراین پورتها را با بسته به وضعیت و کاربردی که دارند یا با یک مقاومتی PULL UP میکنند یا با یک مقاومتی PULL DOWN میکنند، که در سختافزار داخلی AVR امکان فعال کردن PULL UP داخلی وجود دارد.
به 3 روش کلی میتوان از ابزار برنامهنویسی استفاده کرد: شیوه اول برنامهنویسی به زبان اسمبلی میباشد که از لحاظ مفهومی خیلی مفید هست و با توجه به اینکه استفاده کنندههای خاصی دارد و در کاربردهای ویژهای از آن استفاده میشود در این آموزش استفاده نمیشود.
کامپایلرهای مختلفی برای AVR با زبانهای مختلفی نوشته شده است مانند زبان بیسیک، زبان C ،پاسکال و …که زبان C بین باقی زبانها بسیار کاربرپسندتر است. کامپایلری که برای زبان BASIC استفاده میشود کامپایلر BASCAM میباشد و برای زبان C کامپایلر CODEVISION.
در مجموعه آموزش میکروکنترلر AVR تصمیم بر این است که هم با زبان C و هم با BASIC نوشته شود. کامپایلر بسکام بیشتر برای کسانی کاربرد دارد که نمیخواهند به صورت حرفهای عمل کنند. اما اگر کسی بخواهد به صورت حرفهای عمل کند باید با زبان C پیش برود.
در قسمت چهارم آموزش میکروکنترلر AVR برنامه ای که در این قسمت راجب آن صحبت کردیم را به دو زبان C و BASIC مینویسیم. با سیسوگ همراه باشید.
داداش قسمت اموزش avr عالی بود من خیلی بهره بردم عالی عالیه اگه میشه قسمت اموزش stm هم اگه از این فیلم های اموزشی هس قرار بدید ممنون
با سلام و احترام
بنده یه برنامه ساده با ATMEGA 32 در محیط کدویژن نوشتم و با یه مشکل ساده برخورد کردم اما حل نمیشه .
کامپایلر با تعداد متغیر های من مشکل داره ، یعنی یا ارور میده یا کامپایل میکنه اما برنامه روی سخت افزار به درستی عمل نمیکنه .
میخواستم بدونم آیا در تعریف تعداد متغیر ها (بخصوص Bit) محدودیت وجود داره ؟
من حتی بیشتر متغیر ها رو volatile تعریف کردم یا محلی تعریف کردم اما با این حال نمیذاره از تعداد 24 تا بیشتر bit تعریف کنم . اگر در قسمت Bit Variable Size هم مقدار 24 را به 32 تغییر بدم سخت افزار کار نمیکنه .
خوب متغیر bit یکی دیگه از اختراعات عجیب کدویژن هست که هیچ جایی توی زبان سی نداره :/
ولی تا اونجا که میدونم بله محدودیت وجود داره – توی آپشن پروژه میتونید تعداد رو مشخص کنید!!!
با سلام و احترام
بایت این آموزش از همه عزیزان تشکر می کنم .
جلسه سوم با فیلم 4 پخش شده ؟!
البته مبحث درسته اما چرا؟
موفق و سر بلند باشین.
سلام
ممنون از توجه شما. این مساله اصلاح شد.
موفق و پیروز باشید.