محل لوگو

منابع وقفه در AVR


p><!--StartFragment

تعریف وقفه

وقفه پیامی است که از طرف یک وسیله جانبی تولید می شود تا از CPU درخواست سرویس کند(به زبون ساده: به CPU بگه به منم توجه کن باهات کار دارم). CPU با در یافت یک سیگنال وقفه کارهای جاری را متوقف کرده و به وسیله مورد نظر سرویس می دهد. درست شبیه زمانی که فردی در حال انجام کارهای روزمره است و با زنگ خوردن تلفن کارها را رها کرده تا به تلفن پاسخ دهد. در این مثال فرد مورد نظر نقش CPU، کارهای روزمره نقش برنامه اصلی، تلفن نقش وسیله جانبی و صدای زنگ آن نقش سیگنال وقفه را دارند.

مزیت استفاده از وقفه

به دو روش می توان به وسایل جانبی سرویس دهی کرد:

۱) سرکشی دوره ای یا polling:

سرکشی دوره ای به این صورت است که در خلال برنامه بیت های پرچم وسیله جانبی جهت آگاهی از وضعیت آن، توسط cpu بررسی می شود و اگر آن وسیله نیاز به سرویس دهی داشت این کار توسط cpu انجام می شود. در این روش cpu باید به طور مداوم به این وسایل سرکشی کند که این کار باعث کندی برنامه و از دست رفتن زمان برای بررسی وسایل دیگر می شود.

۲) استفاده از وقفه یا interrupt:

در روش وقفه، cpu در حال اجرای روال عادی برنامه است. اما زمانی که یک وسیله جانبی نیاز به توجه cpu دارد با ارسال سیگنال وقفه باعث می شود تا cpu روال عادی برنامه را متوقف کرده و به آن توجه کند. این روش باعث می شود تا زمان cpu برای بررسی رخ دادن یک وضعیت تلف نشود.

انواع وقفه در AVR

معمولا در میکرو کنترلرها وقفه‌ها به دوسته کلی تقسیم می شوند:

  • وقفه‌های خارجی: وقفه‌هایی هستند که منبع آنها خارج از میکرو قرار دارد و با ارسال سیگنالی به پایه های مخصوصی در میکروکنترلر، وقفه ایجاد می کنند.
  • وقفه‌های داخلی: همانطور که از اسمش پیداست این وقفه‌ها سیگنال هایی هستند که داخل میکرو ایجاد می شوند. اکثر این سیگنال ها از وسایل جانبی خود میکرو مانند تایمر/کانتر ها ، ADC و … تولید می شوند. این سیگنال ها همان درخواست سرویس از CPU می باشند.

بردار وقفه

هر وقفه‌ای در AVR خانه ای را در ROM (حافظه فلش) به خود اختصاص می دهد. زمانی که وقفه ایجاد می شود بسته به نوع وقفه، CPU بعد از اجراکردن دستور جاری به آن خانه مراجعه می کند. این خانه محتوی آدرس برنامه‌ای است که به وقفه سرویس می دهد. به مجموعه این خانه ها که هرکدام مربوط به یک نوع وقفه هستند جدول بردار وقفه و به برنامه ای که به وقفه سرویس می دهد روال سرویس وقفه(ISR) میگویند. در جدول زیر می توانید آدرس وقفه‌های مختلف در ATmega32 را مشاهده کنید:

p style="text-align: justify;"><!--StartFragmentimg class="aligncenter wp-image-6106 size-full tie-appear" src="http://microlearn.ir/wp-content/uploads/2015/10/int-table-w.png" alt="" width="541" height="1054" /><!--EndFragment p style="text-align: justify;"><!--StartFragment

فعال کردن پاسخ گویی به وقفه‌ها

وقفه‌ها در AVR به صورت پیش فرض غیر فعال هستند.یعنی با روشن شدن میکرو هیچ وقفه‌ای کار نمی کند و باید به وسیله برنامه نویسی، وقفه‌هایی را که میخواهیم ایجاد شوند فعال کنیم. در AVR معمولا هر وسیله‌ای به طور اختصاصی دارای بیتی به نام بیت فعال ساز وقفه می باشد. با یک شدن این بیت اجازه پاسخ گویی به وقفه‌ی مربوط به آن وسیله فعال و با صفر شدن بیت مذکور اجازه پاسخ گویی به وقفه غیر فعال می شود. مکان این بیت برای هروقفه‌ای در ثبات خاصی از ثبات های I/O می باشد. اگر نیاز به یادآوری رجیسترهای I/O دارید مقاله سازماندهی حافظه در AVR را مطالعه کنید.

اگر از مباحث مربوط به ثبات وضعیت به یاد داشته باشید یکی از بیت های این ثبات “I” یا فعال ساز وقفه‌ی عمومی (Interrupt Enable) نام دارد. به وسیله ی این بیت می توان کلیه وقفه‌ها را فعال ویا غیرفعال کرد. به این صورت که اگر این بیت را یک کنیم وقفه‌ها فعال و اگر آن را صفر کنیم وقفه‌ها غیرفعال می شوند. با صفر شدن این بیت حتی اگر بیت فعال ساز وقفه برای وسیله ای یک باشد، وقفه ایجاد نمی شود. پس برای رخ دادن یک وقفه لازم است بیت فعال ساز وقفه‌ی عمومی و بیت فعال ساز وقفه‌ی اختصاصی، همزمان یک باشند. درواقع بیت فعال ساز وقفه‌ی عمومی با بیت های فعال ساز وقفه‌های اختصاصی AND شده است.

 

در کد زیر می توانید نحوه فعال و غیر فعال کردن بیت I در کدویژن را مشاهده کنید:

#asm("sei") /*فعال کردن وقفه عمومی*/
 
#asm("cli") /*غیر فعال کردن وقفه عمومی*/
 
 
p><!--StartFragment

مراحل اجرای یک وقفه

  1. هنگامی که یک وقفه اتفاق می افتد cpu دستور در حال اجرا را به پایان برده و آدرس دستور بعدی (این آدرس درون رجیستر pc یا program counter قرار دارد) را بر روی پشته ذخیره می کند.
  2. بسته به نوع وقفه، میکروکنترلر به خانه ثابتی از حافظه فلش واقع در جدول بردار وقفه پرش می کند.
  3. در این خانه، آدرس روال سرویس وقفه یا ISR وجود دارد و میکرو با پرش به این آدرس، شروع به اجرای دستورات موجود در روال سرویس وقفه می کند تا به دستور آخر روال یعنی RETI برسد.
  4. این دستور شمارنده برنامه یا pc را با آدرس دستوری که در مرحله یک در پشته ذخیره شده بود بارگذاری می کند. این کار با برداشتن دو بایت بالای پشته و قرار دادن آن در PC انجام می شود. سپس میکرو شروع به اجرای دستورات از این آدرس می کند.

این موضوع اهمیت مدیریت پشته را در حین نوشتن روال سرویس وقفه برای ما آشکار می کند. بهتر است در ابتدای هر روال سرویس وقفه‌ای محتویات ثبات های همه منظوره ای را که می خواهیم در این روال استفاده کنیم به وسیله دستور push در پشته ذخیره شده و در آخر روال به وسیله دستور pop از پشته بازیابی شود. به این کار ذخیره سازی محتوا گویند. این مورد به طور کلی در مورد پورت ها و ثبات هایی که نیاز است محتوایشان ذخیره شود صدق می کند. می توان به جای پشته از هر فضایی در RAM برای این کار استفاده کرد. برای چگونگی استفاده از دستورات push و pop می توانید این مقاله را مطالعه کنید.

روال سرویس وقفه برنامه ای است که توسط برنامه نویس نوشته می شود تا عملیاتی را با ایجاد وقفه انجام دهد. اما چرا این برنامه را در آدرسی که مربوط به بردار وقفه است نمی نویسیم؟

آدرس های بردار وقفه فقط ۲ بایت فضا دارند. پس باید ISR را در محل دیگری نوشت و آدرس آن را در محل بردار وقفه قرار داد.

مواردی که در مورد پشته و دستورات push و pop و نوشتن ISR در آدرسی دیگر گفته شد مخصوص زبان اسمبلی می باشد. اما در زبان C کامپایلر این کارها را مدیریت می کند و نیازی به نگرانی برنامه نویس وجود ندارد. تنها کافی است یک تابع برای روال وقفه نوشته شود.

شاید بپرسید در صورتی که در طول پردازش روال سرویس وقفه‌ای، وقفه‌ی دیگری رخ دهد چه اتفاقی می افتد؟

در جواب این سوال باید بگویم که این بستگی به برنامه نویس و دستورات موجود در روال سرویس وقفه جاری دارد. همان طور که گفتم در صورت ایجاد وقفه، AVR به طور اتوماتیک بیت فعال ساز وقفه‌ی عمومی را پاک می کند. اگر ما بخواهیم در حین سرویس دهی به یک وقفه، وقفه‌ی دیگری در صورت ایجاد سرویس دهی شود باید در روال سرویس وقفه‌ی قبلی بیت فعال ساز وقفه عمومی را یک کنیم. اما باید چنین کاری با احتیاط انجام شود چون ممکن است باعث گیر کردن برنامه درون یک وقفه شود. مثلا اگر یک وقفه‌ی خارجی حساس به سطح فعال باشد و بیت I در حالی که هنوز پایه وقفه در حالت تحریک است، یک شود باعث می شود تا به طور بی نهایت وارد ISR شده و سرریز پشته و اتفاقات غیر قابل پیش بینی رخ دهد. در ادامه درباره وقفه‌ی خارجی و حساس به سطح صحبت می کنیم.

لازم به ذکر است که بیت وقفه‌ی اختصاصی یک وسیله جانبی در صورت درخواست وقفه توسط آن وسیله و پرش به جدول بردار وقفه برخلاف بیت فعال ساز وقفه‌ی عمومی هیچ تغییری نمی کند.

اولویت وقفه

ممکن است این سوال در ذهن شما ایجاد شود که اگر دو وقفه به طور هم زمان رخ دهند به کدام وقفه پاسخ داده می شود؟ در جواب باید بگوییم که در جدول بردار وقفه، هر وقفه‌ای که آدرس کمتری دارد(هر چه در جدول بالاتر باشد) اولویت بیشتری هم در پاسخگویی خواهد داشت. پس در صورت وقوع چنین حالتی آن وقفه‌ای که اولویت بالاتری دارد پاسخ داده خواهد شد.

وقفه‌های خارجی

بعد از توضیح موارد کلی و اصول وقفه‌ها حال وقفه‌های خارجی را به صورت خاص بررسی می کنیم.

یک وقفه‌ی خارجی در اثر سیگنالی از یک وسیله جانبی خارج از میکرو که وارد پایه خاصی از میکرو می شود اتفاق می افتد. برای مثال در میکروکنترل ATMEGA32 سه پایه برای وقفه‌ی خارجی با نام های INT0 ,INT1 ,INT2 وجود دارد که در شکل زیر مشخص شده است:

p><!--EndFragment <!--StartFragment-->img class="aligncenter wp-image-6108 size-full tie-appear" src="http://microlearn.ir/wp-content/uploads/2015/10/m32.gif" alt="" width="305" height="336" /><!--EndFragment

p><!--StartFragment

رجیستر GICR

نام این رجیستر از Global interrupt control register گرفته شده است. با استفاده از بیت های شماره ۵، ۶ و ۷ که در تصویر زیر قابل مشاهده است می تواند قابلیت پاسخ گویی به وقفه های خارجی ۰ تا ۲ را فعال کرد. INT0 برای وقفه خارجی صفر استفاده می شود و سایر وقفه های خارجی نیز به همین ترتیب فعال می شوند. البته باید توسط رجیستر SREG بیت فعال ساز وقفه عمومی فعال شود و توسط رجیستر MCUCR حساسیت به لبه یا سطح مشخص شود که در ادامه توضیح داده می شود.

بیت های ۲ تا ۴ رزرو هستند و از آن ها استفاده ای نمی شود. بیت ۰ و ۱ نیز برای تغییر مکان بردارهای وقفه مورد استفاده قرار می گیرد که خارج از بحث جلسه امروز است.

p><!--EndFragment

p><!--StartFragment

رجیستر MCUCR

نام این رجیستر از MCU Control register گرفته شده است.

همان طور که گفتیم، وقفه های سخت افزاری یا حساس به سطح هستند یا حساس به لبه. با تنظیم بیت های رجیستر MCUCR می توان نوع حساسیت را تعیین کرد. برای INT0 از بیت های ۰ , ۱ و برای INT1 از بیت های ۲ و ۳ استفاده می شود.

p><!--EndFragment

p><!--StartFragmentدرتصویر زیر نحوه تنظیم حساسیت به سطح یا لبه برای INT0 توضیح داده شده است:<!--EndFragment-->

p><!--StartFragmentimg class="aligncenter wp-image-6107 size-large tie-appear" src="http://microlearn.ir/wp-content/uploads/2015/10/isc-w-1024x513.png" alt="" width="618" height="310" /><!--EndFragment p><!--StartFragment

تمام موارد گفته شده درباره INT0 در مورد INT1 هم صدق می کند.برای تنظیم نوع حساسیت INT1کافیست در جدول بالا بیت های ISC10 و ISC11 را به همین شیوه برای INT1 اعمال کنید.

رجیستر MCUCSR

نام این رجیستر از MCU Control and Status Register گرفته شده است.

نحوه حساسیت وقفه‌ی خارجی دو یا INT2 در ATMEGA32 توسط بیت ISC2 در ثبات MCUCSR تنظیم می شود. وقفه‌ی خارجی دو فقط در دو حالت تنطیم می شود.

  • اگر ISC2 صفر باشد INT2 حساس به لبه پایین رونده می شود.
  • اگر ISC2 یک باشد INT2 حساس به لبه بالا رونده می شود.

p><!--StartFragment

رجیستر GIFR

نام این رجیستر از Global interrupt flag register گرفته شده است. این رجیستر پرچم وقوع وقفه‌های خارجی است. هر وقت یک وقفه‌ی خارجی رخ دهد، پرچم متناظر با آن یک می شود. همان طور که در شکل زیر می بینید، پرچم متناظر با وقفه‌ی خارجی صفر INTF0 است و برای وقفه‌های یک و دو نیز به همین ترتیب.

اما نکته ی مهمی که در رابطه با این پرچم ها وجود دارد صفر شدن آن ها است. اگر پاسخ گویی به وقفه را فعال کرده باشیم، با وقوع وقفه و پرش به آدرس بردار وقفه، پرچم متناظر هم صفر می شود. اما اگر به صورت نرم افزاری بخواهیم آن را صفر کنیم باید روی آن ۱ نوشته شود. این قانون برای تمامی پرچم های AVR صادق است.

p style="text-align: justify;"><!--StartFragment

مثال:

فرض کنید در میکروکنترلر ATmega32 پایه INT0 به یک کلید فشاری متصل است. برنامه ای بنویسید که با فشرده شدن کلید فشاری، LED متصل به پایه صفر PORTA روشن شود و در صورت رها شدن کلید فشاری LED خاموش شود.

زبان C در کدویژن:

p style="text-align: justify;"><!--StartFragment

#include
interrupt[EXT_INT0]voidext_int0_isr(void)//روال سرویس وقفه خارجی ?
{
PORTA.0=1;//روشن کردن ال ای دی
}
 
voidmain(void)
{
DDRA.0=1;//تنظیم پایه صفر پورت به عنوان خروجی
PORTA.0=0;
PORTD.2=1;//فعال کردن مقاومت بالا کش پایه وقفه خارجی صفر
GICR=(0<<INT1)|(1<<INT0)|(0<<INT2);//فعال کردن بیت اختصاصی وقفه خارجی ?
MCUCR=(0<<ISC11)|(0<<ISC10)|(0<<ISC01)|(0<<ISC00);//تنطیم در سطح پایین
#asm("sei");//فعال کردن وقفه عمومی
while(1)
{
PORTA.0=0;//خاموش کردن ال ای دی
}
}
 
div class="crayon-line" dir="rtl" style="text-align: right;"> <!--StartFragment
  1. در این برنامه از وقفه‌ی خارجی کمک گرفته شده است.
  2. در خط یک فایل هدر ATmega32 به برنامه include شده است.
  3. در خط دو تابع وقفه‌ی خارجی صفر تعریف شده است. دقت کنید که نوشتن کلمه کلیدی interrupt و شماره بردار وقفه در کدویژن الزامی است ولی نام تابع دلخواه است.
  4. شماره بردار وقفه، را می توان به صورت عدد یا کلمات کلیدی تعریف شده در کدویژن (EXT_INT0) نوشت. که برای خوانایی بیشتر برنامه استفاده از کلمات کلیدی توصیه می شود.
  5. درون این تابع فقط یک دستور برای روشن کردن پین صفر از پورت A وجود دارد.
  6. در خط هفت تابع main تعریف شده است.
  7. در خط ۹ تا ۱۱ پورت ها پیکربندی شده اند.
  8. در خط دوازده با استفاده از رجیستر GICR پاسخ گویی به وقفه‌ی خارجی صفر فعال شده است.
  9. در خط سیزده این وقفه به سطح صفر حساس شده است.
  10. در خط چهارده وقفه‌ی عمومی فعال شده است. دقت کنید که استفاده از asm# برای نوشتن دستورات اسمبلی است.
  11. دستور sei یک دستور اسمبلی برای یک کردن بیت I در SREG است.
  12. در خط پانزده حلقه بینهایت تعریف شده که شامل یک دستور برای خاموش کردن پین صفر از پورت A می باشد.

مطالب این بخش برگرفته از میکرولرن میباشد.

span class="crayon-sy"><!--EndFragment

p style="text-align: justify;"><!--EndFragment p style="text-align: justify;"><!--EndFragment p><!--EndFragment p><!--EndFragment

منابع وقفه در AVR
انتشار : ۲۱ آبان ۱۳۹۸

پورت های ورودی و خروجی در AVR


پورت های ورودی و خروجی در AVR

در میکروکنترلرهای AVR پورت های زیادی برای انجام عملیات ورودی/خروجی وجود دارند. بسته به اینکه تراشه ی مورد نظر کدام عضو از خانواده ی AVR باشد، تعداد پورت ها، تعداد پایه‌های هر پورت و کاربرد پورت ها متفاوت خواهد بود. نامگذاری پورت ها با حروف بزرگ انگلیسی و با شروع از حرف A انجام می شود. مثلاً اگر تراشه ای ۴ پورت داشته باشد، داریم: PORTA، PORTB، PORTC و PORTD. پورت های AVR علاوه بر ورودی و خروجی بودن کاربردها و قابلیت‌های دیگری نیز دارند که در جلسات آتی در مورد آن‌ها بحث خواهد شد. جدول زیر تراشه های رایج و تعداد پورت هایشان را نشان می دهد.

p><!--EndFragment p><!--StartFragment

برای به کارگیری پورت ها جهت استفاده به عنوان ورودی و خروجی باید آن‌ها را برنامه‌ریزی نمود. پورت های ورودی و خروجی در AVR هرکدام دارای سه ثبات به نام های PORT و DDR و PIN می باشد. به عنوان مثال سه ثبات مربوط به پورت C عبارتند از: PORTC و DDRC و PINC.

پورت های ورودی و خروجی

اندازه ی هر سه ثبات هشت بیت می‌باشد و لازم به ذکر است که هر پورت می‌تواند بین سه تا هشت پایه داشته باشد. در ادامه در مورد این ثبات ها و نقش آن‌ها یاد می گیریم.

رجیستر DDRx

یک پورت می‌تواند هم نقش ورودی داشته باشد و هم نقش خروجی. اما چگونه؟ این کار با برنامه‌ریزی ثبات DDR انجام می گیرد. DDR که مخفف عبارت Data Direction Register می باشد، ثباتی هشت بیتی است. برای هر پورت یک ثبات DDR داریم که هم نام پورت است. به عنوان مثال ثبات DDR مربوط به پورت A به صورت DDRA شناخته می شود. هریک از بیت‌های ثبات DDRx یکی از پین های پورت x را کنترل می‌کند. برای مثال بیت پنجم ثبات، پنجمین پین پورت را کنترل می کند. ddrx-explanation

به منظور تنظیم کردن یک پین به عنوان ورودی، باید بیت مربوط به آن پین در ثبات DDR مربوطه روی مقدار صفر برنامه‌ریزی شود. به طور عکس برای تنظیم کردن یک پین به عنوان خروجی، باید بیت مربوط به آن پین در ثبات DDR مربوطه روی مقدار یک برنامه‌ریزی شود. به عنوان مثال فرض کنید می‌خواهیم پین ۳ و ۷ از پورت B را به عنوان خروجی و بقیه ی پین ها را به عنوان ورودی تنظیم کنیم. در زبان C باید بنویسیم:

p style="text-align: justify;"><!--StartFragment

DDRB=0b10001000;
div class="crayon-line" dir="rtl" style="text-align: right;"> <!--StartFragment

توجه شود که بیت ۳ و ۷ یک و دیگر بیت‌ها صفر شده‌اند. برای انجام این کار برای دیگر پورت ها نیز به همین صورت باید عمل کرد.

سؤالی که در اینجا پیش می‌آید این است که: «در پورت های ورودی و خروجی در AVR که تعداد پین ها کمتر از هشت عدد است تکلیف بیت‌های اضافی در رجیستر DDR چیست؟ و اگر ما مقدار آن ثبات را روی یک عدد هشت بیتی تنظیم کنیم چه اتفاقی برای بیت‌های اضافی می افتد؟» در جواب باید گفت که اتفاقی نمی‌افتد و میکروکنترلر بیت‌های اضافی را نادیده می گیرد.

رجیستر PORTx

یکی دیگر از رجیسترهایی که وضعیت صفر/یک پین را کنترل می‌کند رجیستر PORTx است. هر بیت در این رجیستر پین متناظر در پورت را کنترل می کند. به عنوان مثال بیت پنجم از این رجیستر پین پنجم از پورت مورد نظر را کنترل خواهد کرد. این رجیستر بر حسب این که پورت به عنوان خروجی و یا ورودی تنظیم شده باشد (توسط تنظیم رجیستر DDRx)، دو وظیفه دارد:

حالت ۱)‌ صفر یا یک کردن پین (در صورتی که پین مورد نظر در نقش خروجی عمل کند): portx-0xff-explained1

همان طور که در شکل بالا مشاهده می شود، در حالتی که پین به عنوان خروجی عمل کند (بیت مربوط به آن در رجیستر DDRx روی یک تنطیم شده باشد) با یک کردن بیت مربوط به آن پین در رجیستر PORTx ، مقدار آن پین در خروجی یک (high) خواهد شد. و به طور عکس با صفر کردن بیت مربوط به آن پین در رجیستر PORTx مقدار آن پین در خروجی صفر (low) خواهد شد. به برنامه‌های زیر که به دو زبان C نوشته شده‌اند توجه کنید:


DDRB=0b10001111;/* Configuring I/O pins of portb*/
PORTB=0b10001010;/* Write this byte to PORTB*/
div class="crayon-line crayon-striped-line" dir="rtl" style="text-align: right;"> <!--StartFragment

در برنامه‌های بالا بیت‌های صفر، سه و هفت ست (set) و بیت‌های صفر و دو ریست (reset) می شوند. دیگر بیت‌ها در حالت امپدانس بالا قرار می‌گیرند چرا که به عنوان پین های ورودی تنظیم شده اند.

حالت ۲) فعال/غیرفعال کردن مقاومت‌های پول آپ داخلی (در صورتی که پین مورد نظر در نقش ورودی عمل کند):

portx-internal-pullup1

در میکروکنترلر AVR همه ی پین ها به مقاومت پول آپ مجهزند. در حالتی که یک پین در نقش ورودی عمل کند، مقاومت پول آپ مربوط به آن را می‌توان با برنامه‌ریزی بیت مربوط به آن در رجیستر PORTx فعال یا غیر فعال کرد. در صورتی که آن را با یک برنامه‌ریزی کنیم مقاومت پول آپ فعال می‌شود و به طور عکس اگر آن را با صفر برنامه‌ریزی کنیم مقاومت پول آپ غیر فعال می شود. فعال کردن مقاومت‌های پول آپ ورودی را به حالت یک می برد. با فعال کردن مقاومت‌های پول آپ از نویزی شدن ورودی جلوگیری می کنیم.

در برنامه های زیر که به ترتیب به زبان C نوشته شده اند، پورت B به عنوان ورودی برنامه‌ریزی شده و سپس مقاومت‌های پول آپ پین های ۱، ۳، ۵، ۶ و ۷ آن فعال شده اند.


DDRB=0b00000000;/* Configuring I/O pins of portb*/
PORTB=0b01110101;/*enable internal pull-up resistors on output pins 1 , 3 , 5 , 6 , 7*/
 
div class="crayon-line crayon-striped-line" dir="ltr" style="text-align: right;"><!--StartFragment

 به طور پیش‌فرض پین های AVR در حالت ورودی و امپدانس بالا قرار دارند. یعنی هم بیت‌های رجیستر DDRx و هم بیت‌های رجیسترPORTx با صفر برنامه‌ریزی شده اند.

رجیستر PINx

pinx-explanation1

رجیستر PINx شامل وضعیت تمام پین های مربوط به آن پورت است. اگر پین مربوطه به عنوان ورودی تنظیم شده باشد، بیت مربوط به آن پین در رجیستر PINx سطح منطقی آن پین را نشان می دهد. و اگر پین مربوطه به عنوان خروجی تنظیم شده باشد، بیت مربوط به آن پین در رجیستر PINx شامل آخرین داده ی خروجی بر روی آن پین می باشد. برنامه‌های زیر وضعیت پورت D را خوانده و ذخیره می کنند:

p dir="rtl" align="justify"><!--StartFragment

DDRD=0b00000000;      /* Set all pins as input */
unsignedcharstatus;      /* Define a 8 bit integer variable */
status=PIND;             /* Store the current value of PIND in status*/
 
div class="crayon-line"> <!--StartFragment

شکل زیر نشان دهنده ی ارتباط بین سه رجیستر معرفی شده در بالا می باشد. به عبارت دیگر تمامی مباحث گفته شده را به طور خلاصه در بر دارد. لازم به ذکر است که این شکل یک شماتیک ساده می باشد و مدار داخلی پورت های I/O بسیار مفصل تر است.

inside_AVR_IO_port 

span class="crayon-c"><!--EndFragment
p dir="rtl" align="justify"><!--EndFragment

<!--EndFragment-->
 
 
 

پورت های ورودی و خروجی در AVR
انتشار : ۱۳ آبان ۱۳۹۸

آموزش فیوز بیت ها


 

در این پست فیوز بیت های میکروکنترلر Atmega32 را که با ATmega16 یکسان است، توضیح می دهیم. با یادگیری فیوز بیت های این میکروکنترلر می توانید برای فیوز بیت های سایر میکروکنترلرهای AVR با استفاده از دیتا شیت تنظیمات را انجام دهید.

برای تازه کارها استفاده از فیوز بیت کمی گیج کننده است اما واقعا اینطور نیست. همان طور که از بحث پورت های وردی و خروجی در جلسه ی ده به یاد دارید می توانستیم یک پورت را با صفر و یک کردن یک بیت در رجیستر DDR ورودی یا خروجی کنیم. کار کردن با فیوز بیت ها هم چیزی جز صفر و یک کردن یک بیت در رجیستری خاص نیست. اما نکته ی مهم آن است که این بیت ها عملیات اصلی میکروکنترلر را تحت تاثیر قرار می دهند. در ضمن برای تغییر دادن آن ها نیاز به برنامه نویسی نبوده و می توان با استفاده از پروگرامر فیوز بیت ها را تغییر داد.

فیوز بیت ها بخشی از حافظه FLASH هستند که با برنامه ریزی آن ها یک سری امکانات خاص در اختیار کاربر قرار می گیرد. در AVR ها حداکثر ۳ بایت برای فیوز بیت ها در نظر گرفته شده است. که به ترتیب زیر هستند:

  1. بایت بالای فیوزبیت
  2. بایت پایین فیوزبیت
  3. فیوزبیت های توسعه یافته

دقت شود که فیوز بیت ها با erase کردن یا پاک کردن حافظه FLASH از بین نمی روند. تعداد و نام فیوز بیت ها در سری های مختلف AVR تقریبا با هم یکسان است.(البته با کمی تغییرات جزئی)

نکته ی مهم: در فیوز بیت ها “۰” به معنی برنامه ریزی شدن و “۱” به معنی برنامه ریزی نشدن فیوز بیت است.

فیوز بیت های ATmega32

در ATmega32 دو بایت برای فیوز بیت ها در نظر گرفته شده است که در جدول زیر آن ها را مشاهده می کنید:

فیوز بیت

۱) on-chip debug enable – OCDEN

از این فیوز بیت به همراه فیوز بیت JTAGEN برای دیباگ (debug) کردن چیپ استفاده می شود. در واقع می توانیم میکروکنترلر را در زمان اجرای کار سیستم به صورت real time دیباگ یا اشکال زدایی کنیم. این بیت به صورت پیش فرض یک بوده و غیرفعال است. طبیعتا افرادی با این فیوز بیت کار می کنند که می خواهند وضعیت رجیسترهای داخلی را در زمان اجرای برنامه ببینند و برای حرفه ای ها در نظر گرفته شده. پس اگر کاربر حرفه ای نیستید یا نمی خواهید برای اشکال زدایی سیستم، وضعیت رجیستر ها را مشاهده کنید، این فیوز بیت را فعال نکنید.

۲) JTAG Enable – JTAGEN

یک رابط JTAG از پیش ساخته شده درون میکروکنترلر وجود دارد که با فعال کردن این بیت قابل استفاده است. این بیت به صورت پیش فرض صفر بوده که باعث فعال بودن JTAG می شود. همین امر باعث می شود بعضی بیت های پورت C در ATmega32 کار نکند. برای عملکرد عادی پورت C باید این بیت را غیر فعال کنید. JTAG یک رابط برای تست و برنامه ریزی IC های دیجیتال که طبق استاندارد IEEE 1149.1 مورد استفاده قرار می گیرد.

۳) SPI Enable – SPIEN

صفر بودن این بیت به معنی این است که امکان پروگرم کردن AVR به صورت سریال وجود دارد. اگر یک پروگرمر موازی ندارید هرگز این بیت را یک (غیرفعال) نکنید، چرا که دیگر به صورت سریال قابل پروگرم کردن نخواهد بود. توصیه می شود مقدار پیش فرض این بیت را تغییر ندهید.

۴) EEPROM Save – EESAVE

اگر این بیت فعال باشد، در طی عملیات erase(پاک) کردن کردن میکروکنترلر با پروگرامر، حافظه EEPROM به همراه حافظه فلش پاک نخواهد شد. تغییر دادن این بیت به نیاز شما بستگی دارد.

۵) BOOTSZ1 و BOOTSZ0

از این فیوز بیت ها برای تنظیم سایز حافظه Boot استفاده می شود. حافظه برنامه از نوع flash بوده و به دو قسمت کاربردی و Boot تقسیم می شود(برخی AVR ها فقط حافظه کاربردی دارند). نکته مثبتی که در حافظه Boot وجود دارد، امکان تغییر برنامه قرار داده شده روی حافظه است. یعنی فقط از طریق پروگرام کردن نیست که می توان برنامه حافظه را عوض کرد. مثلا می توان از طریق پورت سریال و به وسیله کامپیوتر اطلاعاتی را برای AVR فرستاد و بدون وجود پروگرامر قسمتی از برنامه را عوض کرد.

در جلسات آینده حتما درباره Boot به طور کامل توضیح خواهیم داد. فعلا برای آشنایی جزئی به جدول زیر که مقادیر مختلف این فیوز بیت و حجم حافظه Boot را نشان می دهد توجه کنید:

boot loader

اگر قرار نیست با حافظه بوت کار کنید مقادیر فیوز بیت های این بخش را تغییر ندهید.

۶) BOOTRST

با پروگرم شدن این بیت، وقتی میکروکنترلر ریست شود به آدرس بلوک بوت لودر پرش خواهد کرد. در صورتی ک با حافظه بوت کار نمی کنید مقدار پیش فرض را تغییر ندهید.

۷) [CKSEL[3-0

با این بیت ها می توان حالت های مختلف منبع کلاک (تولید پالس) ورودی AVR را تنظیم کرد. در جدول زیر مشاهده می کنید که چند حالت برای منبع کلاک میکروکنترلر وجود دارد.

clock pulse

در جدول بالا مهم ترین حالت هایی که اغلب با آن ها کار می کنیم کریستال خارجی و نوسان ساز RC داخل است؛ پس به توضیح موارد فوق می پردازیم.

نوسان ساز RC داخلی

میکروکنترلر AVR دارای ۴ حالت نوسان ساز RC داخلی است و مقدار پیش فرض آن فرکانس ۱MHz است. به جدول زیر دقت کنید:

internal-clock

کریستال خارجی

کریستال خارجی مقادیر متفاوتی دارد. اگر به بازار سری زده باشید از مقادیری مانند ۱MHz تا ۱۶MHz و کلا رنج های مختلفی را می توانید پیدا کنید. اما باید فیوز بیت ها را در محدوده ی فرکانس کریستال خارجی تعیین کنید تا در عملکرد میکروکنترلر مشکلی پیش نیاید. برای این که فیوز بیت ها را صحیح انتخاب کنید در نرم افزار پروگرامر خود باید فقط تعیین کنید که فرکانس کم، متوسط یا زیاد است. اما هر کدام از این فرکانس ها چه محدوده ای را شامل می شوند:

 

  • فرکانس پایین: فرکانس های کمتر از ۳ مگاهرتز را شامل می شود.
  • فرکانس متوسط: محدود ۳ تا ۸ مگاهرتز فرکانس متوسط گفته می شود.
  • فرکانس بالا:بالاتر از ۸ مگاهرتز هم جزء فرکانس های بالا دسته بندی می شود.

 

برای تنظیم کردن کریستال خارجی فقط کافی است که در پروگرامر خود محدوده را تعیین کنید. البته در جلسات بعدی به طور مفصل درباره انتخاب منبع پالس و پروگرم کردن میکرو صحبت خواهد شد.

۸) CKOPT

این بیت بین دو حالت مختلف تقویت کننده اسیلاتور یکی را انتخاب می کند. وقتی که این بیت پروگرم شود باعث ایجاد دامنه بیشتری برای نوسان ساز خواهد شد و در صورت غیرفعال شدن دامنه را کاهش می دهد. اگر از کریستال خارجی استفاده می کنید بهتر است که این فیوز بیت را فعال کنید تا نویزپذیری کمتر شود اما دقت کنید که با فعال کردن این بیت توان مصرفی بیشتر خواهد شد.

۹) Brown-out Detection – BODEN

میکروکنترلر ATmega32 به صورت داخلی دارای یک مدار برای تشخیص میزان ولتاژ VCC است. این مدار بر اساس یک حد آستانه عمل می کند و با فعال شدن این فیوز بیت اگر VCC از آن آستانه کمتر شود باعث ریست شدن میکروکنترلر خواهد شد. وقتی که VCC به بالاتر از حد آستانه برگردد میکروکنترلر دوباره شروع به کار خواهد کرد. برای فعال شدن این مدار باید فیوز بیت BODEN صفر شود.

۱۰) BODLEVEL

حد آستانه برای BOD توسط این فیوز بیت تعیین می شود. زمانی که این فیوز بیت پروگرم شود سطح آستانه ۴ ولت بوده و زمانی که پروگرم نشود ۲٫۷ ولت می باشد.

۱۱) SUT1 و SUT0

به وسیله این فیوز بیت ها start-up time برای شروع به کار میکروکنترلر تعیین می شود. این زمان فاصله بین اتصال تغذیه تا شروع به کار میکروکنترلر است و برای پایدار شدن خروجی نوسان ساز لازم است، چرا که ممکن است نوسان ساز در زمان اتصال تغذیه دقیقا همان فرکانس مطلوب را تولید نکند وعملا با تنظیم یک زمان طولانی تر فرصت پایدار شدن به نوسان ساز داده می شود. برای کاربردهای معمولی توصیه می شود با مقادیر پیش فرض کار کنید و این فیوز بیت ها را تغییر ندهید.

 

آموزش فیوز بیت ها
انتشار : ۱۳ آبان ۱۳۹۸

مروری بر میکروکنترلرهای سری AVR


 

 

 

مقدمه ای بر میکروکنترلرها

عکس اول

عکس 2Picture3

 

 

تاریخچه ی مختصری از میکروکنترلر AVR

معماری اولیه AVR توسط دو دانشجوی موسسه ی فن آوری نروژ (NHT) به نام های Alf-Egil Bogen و Vegard Wollan طراحی و سپس در سال ۱۹۹۶، توسط شرکت Atmel خریداری و تولید شد.

انواع زیادی از میکروکنترلرهای AVR با ویژگی های متفاوت وجود دارند. به استثنای AVR32 که یک میکروکنترلر ۳۲ بیتی است، بقیه AVR ها همگی ۸ بیتی هستند، یعنی CPU در هر لحظه فقط با ۸ بیت داده می تواند کار کند. داده های بزرگتر از ۸ بیت به بخش های ۸ بیتی تقسیم شده و به وسیله CPU مورد پردازش قرار می گیرد.

یکی از مشکلات سری AVR این است که آن ها از لحاظ نرم افزاری به طور صد در صد کامل از یک سری به سری دیگر سازگار نیستند. برای اجرای برنامه نوشته شده برای ،Tiny25 بر روی Atmega64 باید برنامه قبل از پروگرم شدن روی Atmega64 دوباره کامپایل شده و احتمالا موقعیت برخی رجیسترها تغییر کند. عموما سری AVR به چهار گروه کلی طبقه بندی می شود: مگا، تاینی (tiny)، تک منظوره و کلاسیک.

مشخصات AVR

AVR یک میکروکنترلر تک تراشه ای با معماری ۸ بیتی RISC(کامپیوتر با مجموعه دستورات کم) هاروارد است که با امکانات استانداردی از جمله وجود ROM برنامه، RAM داده، EEPROM داده، تایمرها و پورت های I/O داخلی ارائه می گردد. اکثر AVR ها امکانات اضافی مانند ADC,PWM و انواع مختلف واسط سریال مانند USART,SPI,I2C(TWI),CAN,USB و غیره را به همراه خود دارند.

ROM برنامه

در میکروکنترلرهای AVR در میکروکنترلرها ROM برای ذخیره سازی برنامه به کار می رود و به همین دلیل ROM برنامه یا کد نامیده می شود. گرچه AVR دارای ۸ مگابایت فضای ROM برنامه یا کد است، ولی این مقدار ROM بر روی تمام اعضا سری AVR نصب نمی شود. اندازه ROM برنامه، بر حسب نوع سری، از ۱کیلوبایت تا ۲۵۶ کیلو بایت تغییر می کند. AVR یکی از اولین خانواده های میکروکنترلر است که حافظه flash(آنی) را برای ذخیره سازی برنامه استفاده می کند. این حافظه آنی در طی چند ثانیه پاک می شود، در حالی که حافظه UV-EPROM به ۲۰ دقیقه یا بیشتر برای پاک شدن احتیاج دارد.

RAM و EEPROM

داده در میکروکنترلرهای AVR فضای RAM داده ها را ذخیره می کند. فضای RAM داده در AVR نهایتا ۶۴ کیلو بایت است، ولی این مقدار RAM بر روی تمام اعضای سری AVR موجود نمی باشد. فضای RAM داده از سه مولفه تشکیل شده است:

  • رجیسترهای همه منظوره
  • حافظه
  • I/O SRAM داخلی

در تمام AVR ها ۳۲ رجیستر همه منظوره وجود دارد، ولی مقدار SRAM و حافظه I/O از یک تراشه به تراشه دیگر فرق می کند. در سایت Atmel هر کجا به مقدار RAM اشاره شده، منظور SRAM داخلی است. SRAM داخلی، برای خواندن و نوشتن روی scratch pad ( حافظه کوچک و سریع که به جای رجیسترها به کار می رود) استفاده می شود. در AVR مقدار کمی EEPROM برای ذخیره سازی داده های حیاتی که غالبا احتیاج به تغییر ندارند، وجود دارد.

پایه های I/O در میکروکنترلرهای AVR

AVR می تواند ۳ تا ۸۶ پایه برای I/O داشته باشد. تعداد پایه های I/O بستگی به تعداد پایه های خود تراشه دارد. در حال حاضر تعداد پایه های بسته بندی AVR از ۸ تا ۱۰۰ می باشد. برای AT90S2323 که ۸ پایه دارد، ۳ پایه برای I/O و برای Atmega 1280 که ۱۰۰ پایه دارد، حداکثر ۸۶ پایه برای I/O می توان در نظر گرفت.

وسایل جانبی در میکروکنترلرهای AVR

ADC، تایمرها و USART وسایل جانبی استانداردی هستند که در اغلب AVR ها وجود دارند. ADCها ۱۰ بیتی هستند و تعداد کانال هایی که در تراشه های AVR به آن ها اختصاص داده شده است، متفاوت بوده و حداکثر به ۱۶ می رسد. AVR در کنار تایمر watchdog، حداکثر ۶ تایمر دیگر دارد. USART اجازه وصل شدن سیستم های مبتنی بر AVR را به پورت های سریال مانند پورت COM در PC های IBM می دهند. بیشتر خانواده AVR دارای I2C و باس SPI هستند و برخی از آن ها USB یا باس CAN هم دارند.

 

مروری بر میکروکنترلرهای سری AVR
انتشار : ۱۳ آبان ۱۳۹۸

دانلود رایگان نرم افزار ارتباط سریال هرکول ورژن 8-2-3 با لینک مستقیم


 

 دانلود آخرین ورژن نرم افزار ارتباط سریال هرکول با لینک مستقیم

 

نرم افزار هرکول یک نرم افزار جهت ارتباط سریال می باشدو نیاز به توضیح خاصی نیست.آخرین ورژن این نرم افزار  در لینک زیر برای دانلود رایگان شما گزاشته شده است.

لازم به ذکر است که این نرم افزار کاملا تست شده وهیچ مشگلی ندارد و شما با خیال راحت مبتوانبد این نرم افزار را دانلود کرده و ازش استفاده کنید.

 

حجم: 459 کیلو بایت

دانلود با لینک مستقیم

ساخت دماسنج با LM35


 

مرحله اول :طراحی سخت افزار در پروتیوس

مرحله دوم :تنظیمات کدویزارد

1-بعد از ایجاد پروژه جدید در کدویزارد طبق تصویر زیر عمل می کنیم:

بعد دوباره ok را می زنیم. در این مکان تیک گزینه ها را بسته به نوع میکروکنترلر خود انتخاب می کنیم.چون نوع میکروکنترلر ما Atmega است به این دلیل تیک گزینه اول را می زنیم.

در قسمت chip نوع میکرو و فرکانس را انتخاب می کنیم.

بعد از تنظیمات میکروکنترلر نوبت به تنظیمات ADC می رسد که طبق تصویر زیر تنظیمات رو اجام می دهیم.

بعد از تنظیمات ADC ، تنظیمات مربوط به LCD رو انجام میدهیم.

بعد قسمت نشان داده شده را می زنیم و نام و محل ذخیره سازی را انتخاب می کنیم.بعد از آن 3 بار از شما محل ذخیره سازی را می پرسد که باید هر سه را با یک نام و در یک محل ذخیره کنیم.

مرحله سوم :نوشتن کد در کدویژن

بعد از ذخیره سازی هر سه فایل نوبت به نوشتن کد می کنیم.در این قسمت از سطر 31 تا سطر 148 پاک می کنیم.

تا

نکته:متن هایی که بعد از // نوشته می شود توضیحاتی هستند که در باره کد های نوشته شده به ما می دهد و هیچ تاثیری در برنامه نویسی ما ندارد.به همین خاطر می توان این متن ها را که بعد از // هستند که به رنگ آبی نیز هست را پاک کنیم.

 

p> <!--StartFragmentspan style="font-size: 14pt;">متن برنامه بعد از پاک کردن کد های اضافه و متن هایی که با رنگ آبی نوشته شده است.(بعداز//)<!--EndFragment.

 

بعد کدها را طبق تصویر پایین به متن برنامه اضافه می کنیم.

 

همچنین در قسمت while این کدها را می نویسیم.(طبق تصویر زیر)

 

 

متن برنامه در یک نگاه:

 

 

بعد از اضافه کرد کد ها نوبت به خروجی گرفتن از برنامه میرسد که برای این کار طبق تصویر زیر عمل می کنیم.

 

اگر متن برنامه مشکلی نداشته باشد خروجی را داده و پیغام زیر را به شما می دهد و می نویسد(NO errorsوNo warning)

 

مرحله چهارم : آزمایش مدار در پروتیوس

 در محیط پروتیوس ، روی میکرو کلیک می کنیم و فایلی که از کدویژن خروجی گرفتیم را در داخل میکرو قرار می دهیم:

 

نکته:در قسمت program File ،فایلی را که توسط کدویژن تولید کرده ایم را از محلی که آن را ذخیره کردیم انتخاب می کنیم و همچنین در قسمت CKSEL Fuses ،سرعت کلاک میکرو را انتخاب می کنیم.

 

بعد Ok را می زنیم و بر روی دکمه شروع کلیک میکنیم و عملکرد مدار را مشاهده می کنیم.

 

تصویری از عملکرد مدار ساخته شده:

 

 

دانلود پروژه LM35 به صورت فایل+فایل پروتیوس

 

ساخت دماسنج با LM35
انتشار : ۲۶ فروردین ۱۳۹۷

آموزش مبدل آنالوگ به دیجیتال ( ADC )


 

 

واحد مبدل آنالوگ به دیجیتال ( ADC )

تنظیمات واحد ADC در AVR

نهوه اتصال پایه های آنالوگ به منبع تغذیه 5 ولت

تنظیمات ADC در کدویزارد

آموزش مبدل آنالوگ به دیجیتال ( ADC )
انتشار : ۲۴ فروردین ۱۳۹۷

پورت های ورودی و خروجی میکروکنترلر AVR


 

انواع پورت های خروجی و ورودی میکروکنترلرATmega16

 

میکروکنترلر Atmega16 دارای 4 پورت ورودی و خروجی است که در حالت عادی می توان از این پورت ها به عنوان ورودی و خروجی استفاده کرد.پورت های میکروکنترلر Atmega16 به صورت زیر است:

 

1- پورت A

یکی از پورت های میکروکنترلر است که در حالت عادی می توان از این پورت به عنوان خروجی ، ورودی استفاده کرد.از کاربرد دوم این پورت مبدل آنالوگ به دیجیتال است.(ADC)

 

2- پورت B

یکی از پورت های میکروکنترلر است که در حالت عادی می توان از این پورت به عنوان خروجی ، ورودی استفاده کرد.

 

3-پورت C

یکی از پورت های میکروکنترلر است که در حالت عادی می توان از این پورت به عنوان خروجی ، ورودی استفاده کرد.

 

4-پورت D

یکی از پورت های میکروکنترلر است که در حالت عادی می توان از این پورت به عنوان خروجی ، ورودی استفاده کرد.

 

برای درک بهتر پورت ها به تصویر زیر نگاه کنید:

پورت های ویکرو

عملکرد های بعدی میکروکنترلرATmega16

 

همان طور که در آموزش های بالا گفته شد هر 4 پورت میکروکنترلر می تواند به عنوان ورودی یا خروجی برنامه ریزی شوند.اما این پورت ها قابلیت های دیگری نیز دارند و میتوانند به صورت کاربرد مختلف برنامه ریزی شوند که در پایین به توضیح کاربرد بعدی پورت ها می پردازیم.

 

1-کاربرد های دیگر پورتA

next fantion port A

تمامی میکروکنترلر ها به صورت دیجیتالی کار می کنند و اگر بخواهیم میکروکنترلر یک ورودی آنالوگ را بخواند و با توجه به آن کاری انجام دهد ابتدا بایستی این ورودی (دستور) آنالوگ را به دیجیتال تبدیل کنیم در این صورت است که از این پورت برای تبدیل آنالوگ به دیجیتال استفاده می کنیم.

 

2-کاربرد دیگر پورت B

 

 

 

3-کاربرد دیگر پورت C

 

 

 

کاربرد دیگر پورت D

 

 

پین های تغذیه و سایر پین های میکروکنترلرATmega16

 

 

 

p><!--EndFragment

پورت های ورودی و خروجی میکروکنترلر AVR
انتشار : ۲۲ فروردین ۱۳۹۷

راه اندازی LCD کاراکتری با AVR


 

 

راه اندازی LCD کاراکتری

 

توابع کار با LCD کاراکتری

تنظیمات مربوط به LCD در کدویزارد

نکته:همواره قبل از استفاده از کتابخانه lcd.h باید دستورات اسمبلی مربوط به پورت های متصل به LCD در برنامه معرفی شود.

برای مثال دستور زیر بیانگر اتصال lcd  به PORTC است.

 شروع زبان اسمبلی //asm #

  .equ __ lcd_port=0x15//معرفی پورت متصل به نمایشگر

#endasm// پایان زبان اسمبلی

بعد از این تنظیمات مجاز هستیم تا کتابخانه lcd را در برنامه فراخوانی کنیم.

 

 

 

 

راه اندازی LCD کاراکتری با AVR
انتشار : ۲۲ فروردین ۱۳۹۷

تمام حقوق مادی و معنوی این وب سایت متعلق به "" می باشد

فید خبر خوان    نقشه سایت    تماس با ما