میکروکنترلر -Microcontroller

میکروکنترلر چیست ؟

میکروکنترلر AVR چیست ؟

میکروکنترلر AVR چیست ؟

مقدمه:

مهمترین هدف برنامه سازی سیستم، دسترسی، مدیریت و بهره برداری از سخت افزار یک سیستم کامپیوتری می باشد. در محیط PC ، دسترسی به سخت افزار از ۳ طریق ممکن است اولین راه، دسترسی مستقیم به سخت افزار است که برای بررسی و تحلیل دسترسی ها با استفاده از این روش ، در صدد برامدیم که از میکروکنترلر های AVR استفاده می کنیم دانشجویان واساتید ارجمند بهتر است برای درک بهتر، برنامه هایی را در کلاس های عملی برای این میکروکنترلرها نوشته و نحوه ارتباط با سخت افزار را بطور قابل لمس تری مشاهده نمایند.

میکروکنترلر چیست؟ و نحوه برنامه ریزی آن به چه صورت است.

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

نخستین ویژگی میکرو قابلیت ذخیره سازی و اجرای برنامه است. یک میکرو تمامی خصوصیات یک کامپیوتر را به صورت محدودتر داراست. میکروکنترلرها تراشه هایی هستند که توسط یک نرم افزار به یکی از زبانهای C یا Basic یا اسمبلی برنامه نویسی می شوند و سپس برنامه نوشته شده (که همان اعمال مورد نظر کاربر از میکروکنترلر است) توسط کامپایلر یا اسمبلر کامپایل شده و اگر کامپایل بدرستی صورت گیرد فایلی را تولید خواهد کرد که این فایل دقیقا همان دستورات، اما به زبان ماشین (یعنی زبان قابل فهم توسط میکروکنترلر) است ، در نهایت این فایل تولید شده توسط ابزاری به نام پروگرمر به میکروکنترلر منتقل می شود . با اتصال منبع تغذیه مناسب به میکرو و ابزارهای جانبی و مورد نیاز به پایه های آن، میکروکنترلر شروع به اجرای دستورات خواهد نمود.

چرا AVR ؟

خانواده های مختلف میکروکنترلر:
امروزه خانواده های مختلفی از میکروکنترلر وجود دارد که موارد زیر نمونه هایی از آنها می باشد.
Intel شرکت ۸۰۴۸ و ۸۰۵۱
Motorola شرکت۶۸HC11
Zilog شرکتZ80
Microchip شرکت PIC
Hitachi شرکت H8
Atmel شرکت AVR

در حالت کلی هیچ نوع میکروکنترلری را نمی توان بعنوان بهترین معرفی کرد چرا که هر میکروکنترلر، کاربردهای خاص خودش را دارد و بر اساس خصوصیات داخلی، می توان تنها برای موارد ویژه ای بعنوان بهترین انتخاب گردد . اما برخی ویژگی های خاص این میکرو عبارتند از :

۱-دارای بهترین MCU برای حافظه فلش در جهان ! (MCU: Master Control Unit)

۲-دارای سیستمی با بهترین هماهنگی

۳-دارای بالاترین کارایی و اجرا در CPU (یک دستورالعمل در هر سیکل کلاک)

۴-دارای کدهایی با کوچکترین سایز

۵-دارای حافظه خود برنامه ریز

۶-دارای واسطه JTAG که با IEEE 1149.1 سازگار است.

(IEEE: Institute of Electrical and Electronics Engineers.)

۷-دارای سخت افزار ضرب کننده روی خود

۸-دارای بهترین ابزارها برای پیشرفت و ترقی

۹-دارای حالات زیادی برای ترفیع دادن یا Upgrade

میکروکنترلر های AVR دارای ویژگی های منحصر بفردی دیگری نیز نسبت به میکروکنترلرهای دیگر موجود هستند، از جمله AVR ها میکروکنترلرهایی ۸ بیتی از نو ع CMOS با توان مصرفی پایین هستند که بر اساس ساختار پیشرفته RISC ساخته شده اند که با استفاده از این معماری عملیات خود را در یک کلاک سیکل انجام می دهند. خانواده AVR ، ۳۲ رجیستر همه منظوره و مجموعه دستورات قدرتمندی را شامل می گردند. تمام این ۳۲ رجیستر مستقیما به ALU متصل شده اند. بنابراین دسترسی به ۲ رجیستر در یک کلاک سیکل هم امکان پذیر است. این ساختار موجب می گردد تا سرعت آنها نسبت به میکروکنترلرهای CISC بتواند تا ۱۰ برابر هم افزایش یابد.

میکروکنترلرهای AVR ، میتوانند تا ۱۰۰۰۰ مرتبه پاک شده و مجددا برنامه ریزی شوند. این میکروها از تکنولوژی حافظه کم مصرف غیر فرار استفاده می کنند.

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

با پیشرفت علم و تکنولوژی در عرصه الکترونیک، تراشه هایی به عنوان میکروپروسسورها طراحی و تولید شدند تا قبل از سال ۱۹۷۱ میلادی اگر شخص طراح، قصد طراحی سیستمی را داشت باید سیستم مورد نظر را به شرکت های سازنده میکروپروسسور ارائه می داد تا طراحی و ساخته شود و یا اینکه مجبور بود با استفاده از IC هایی سیستم مورد نظر خود را طراحی کند. از این پس شرکت های سازنده میکروپروسسورها، از جمله شرکت Zilog تصمیم به ساخت میکروپروسسوری نمود که بتوان آن را در اختیار کاربر قرار داد و به هر صورت ممکن که می خواهد سیستم مورد نظر خود را طراحی کند و به همین دلیل میکروپروسسور Z80 را به بازار عرضه کرد و نرم افزار کامپایلر به زبان اسمبلی و پروگرمر آنرا نیز ارائه نمود. بطور کلی اگر یک شخص از میکروپروسسور ۸ بیتی Z80 برای سیستمی استفاده کند، باید المان های جانبی CPU را نیز علاوه بر سخت افزار سیستم مورد نظر، در کنار میکروپروسسور Z80 قرار دهد.

شکل بلوک دیاگرام یک CPU بهمراه اجزای جانبی آن

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

درسال ۱۹۸۱ میلادی شرکت اینتل تراشه ای را به عنوان میکروکنترلر خانواده ۸۰۵۱ به بازار عرضه کرد که این میکروکنترلر دارای CPU 8 بیتی، تایمر یا کانتر، تبادل سریال ، حافظه SRAM و حافظه غیر فرار (Flash) داخلی بود. ابتدا این میکروکنترلر حافظه PROM بهره می برد که فقط یکبار قابل برنامه ریزی بود. سپس این میکروکنترلر را توسعه دادند و در آن از حافظه EPROM استفاده کردند مزیت استفاده از این نوع حافظه در آن است که می توان توسط پنجره شیشه ای که در بالای تراشه قرار داشت، در مجاورت نور ماورائ بنفش مانندنور خورشید قرار داده و بعد از چند دقیقه آنرا پاک کرد. با ادامه این روند شرکت اینتل تصمیم به استفاده از حافظه ای گرفت که بتواند با ولتاژ الکتریکی نوشته و پاک شود (حافظه Flash). این سری با شماره ۸۹Cxx آغاز می شود که امروزه نیز مورد استفاده قرار می گیرد. شرکت های سازنده دیگری از جمله شرکت Atmel تحت لیسانس شرکت اینتل میکروکنترلر ۸۰۵۱ تولید کردند. شرکت Atmel بعدا نوع توسعه یافته ۸۰۵۱ را با سری AT89Sxx ارائه کرد.

این روند با ارائه میکروکنترلرهای جدیدی که دیگر شرکت های سازنده قطعه از جمله شرکت Microchip که میکروکنترلرهای PIC را تولید کرده است ادامه یافت تا در نهایت شرکت Atmel خانواده AVR را در سال ۱۹۹۷ به بازار عرضه نمود.

طراحی برای زبانهای Basic و C

زبانهای Basic و C بیشترین استفاده را در دنیای امروز بعنوان زبانهای HLL (high level language) دارند. امروزه معماری بیشتر میکروها برای زبان اسمبلی طراحی شده و کمتر از زبانهای HLL حمایت شده است.

هدف Atmel طراحی معماری بود که هم برای زبان اسمبلی و هم زبانهای HLL مفید باشد. بطور مثال در زبانهای C و Basic می توان یک متغیر محلی به جای متغیر سراسری در داخل زیر برنامه تعریف کرد، در این صورت فقط در زمان اجرای زیر برنامه مکانی از حافظه RAM برای متغیر اشغال می شود در صورتی که اگر متغیری بعنوان سراسری تعریف گردد در تمام وقت مکانی از حافظه Flash را اشغال کرده است.

برای دسترسی سریعتر به متغیرهای محلی و کاهش کد، نیاز به افزایش رجیسترهای همه منظوره است. AVR ها دارای ۳۲ رجیستر هستند که مستقیما به ALU (Arithmetic Logic Unit) متصل شده اند، و تنها در یک کلاک سیکل به این واحد دسترسی پیدا می کنند.

خانواده AVR به سه دسته تقسیم می شوند:

سری AT90S

این دسته، اعضای کلاسیک خانواده AVR را تشکیل می دهند و قابلیت های کمتری نسبت به دو دسته بعدی دارند و کمتر نیز ورد استفاده قرار می گیرند.

AT90S1200

AT90S2323

AT90S4433

AT90S8535

AT90S4434

AT90S2313

AT90S2343

AT90S8515

AT90S4414

AT90S8534

سری ATtiny : این میکروکنترلرها در ابعاد کوچک ۸، ۲۰ و ۲۸ پایه ای هستند و قابلیتهای بهتری نسبت به دسته اول دارند و اکثرا در سیستم هایی که نیاز به پورت بالا نیست استفاده می شوند.

ATtiny85

ATtiny28

ATtiny25

ATtiny15

ATtiny12

ATtiny10

ATtiny2313

ATtiny45

ATtiny26

ATtiny22

ATtiny13

ATtiny11

سری ATmega : این دسته، امکانات بیشتری نسبت به دو دسته قبلی دارند . این نوع میکروکنرلرها قابلیت خود برنامه ریزی دارند و می توان آنها را با استفاده از مدارات اضافی برنامه ریزی کرد. در این کتاب سعی شده دسته ATmega برای آموزش انتخاب شود، زیرا تمامی سرفصل های آموزش AVR را شامل می شود.

ATMEGA103

ATMEGA128

ATMEGA1280

ATMEGA1281

ATMEGA8515

ATMEGA16

ATMEGA162

ATMEGA8535

ATMEGA165

ATMEGA88

ATMEGA168

ATMEGA670

ATMEGA169

ATMEGA6450

ATMEGA2560

ATMEGA2561

ATMEGA32

ATMEGA324

ATMEGA325

ATMEGA3250

ATMEGA325P

ATMEGA238

ATMEGA329

ATMEGA3290

ATMEGA48

ATMEGA64

ATMEGA640

ATMEGA644

ATMEGA645

ATMEGA649

ATMEGA6490

ATMEGA48

معماری میکروکنترلر های AVR :

بطورکلی دو نوع معماری برای ساخت میکروکنترلرها وجود دارد:

معماری CISC : (Complex Instruction Set Computer)

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

معماری RISC (Reduced Instruction Set Computer)

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

فیوز بیت های میکرو کنترلر ATMEGA32

فیوز بیت ها قسمتی از حافظه FLASH هستند که امکاناتی را در اختیار کاربر قرار می دهند. فیوز بیت ها با پاک کردن میکروکنترلر (ERASE) از بین نمی روند و می توانند توسط بیت های قفل مربوطه، قفل شوند. تغییر آنها فقط از طریق پروگرمر امکان پذیر است و برای تنظیم آنها نیاز به برنامه نویسی خاصی نداریم و موقع پروگرم کردن توسط ابزار نرم افزار Codevision یا BASCOM آنها را تنظیم و برنامه ریزی می کنیم. فیوز بیت ها با ۰ برنامه ریزی و با ۱ غیر فعال می شوند. توجه کنید که برنامه ریزی فیوزبیت ها باید قبل از قفل کردن تراشه صورت گیرد. میکرو کنترلر های AVR بسته به نوع قابلیتی که دارند دارای فیوز بیت های متفاوتی هستند. بعلت توجه بیشتر این کتاب به میکرو کنترلر ATMEGA32 ، به توضیح فیوز بیت های این میکرو می پردازیم. برای اینکه بدانید میکروکنترلری که با آن کار می کنید دارای چه ویژگی و چه فیوز بیت هایی می باشد. به Data Shit آن مراجعه نمایید. میکروکنترلر ATMEGA32 دارای ۲ یایت فیوز بیت طبق جدول زیر می باشد.

فیوز بیت OCDEN (On Chip Debug Enable)

زمانیکه فیوز بیت ارتباط دهی JTAG فعال شده باشد و همچنین برنامه میکروکنترلر را قفل نکرده باشیم می توان با فعال کردن فیوزبیت OCDEN برنامه میکروکنترلر را به طور آنلاین در حین اجرا توسط مدار واسطی که از ارتباط سریال JTAG استفاده می کند توسط نرم افزار AVR Stdio مشاهده کرد. به این نوع آنالیز امولاتور (Emulator) یا شبیه ساز سخت افزاری گفته می شود. همچنین برنامه ریزی شدن این بیت به قسمتهایی از میکرو امکان می دهد که در مدهای SLEEP کار کنند. درهر صورت فعال کردن این بیت مصرف توان میکرو کنترلر را افزایش می دهد. این بیت بصورت پیش فرض برنامه ریزی نشده (۱) است.

نکته در مورد واسط JTAG واسطه ای که تسلیم قانون IEEE 1149.1 است و می تواند به صورت NVM برنامه ریزی کند یعنی با استفاده از فیوزها و بیتهای قفل هنگام قطع جریان برق داده ها از بین نروند. بیشتر برای دیباگ کردن آنچیپ و به منظور تست استفاده می شود .

فیوز بیت JTAGEN : با فعال کردن این بیت میکرو را از طریق ارتباط دهی استاندارد IEEE (JTAG) می توان برنامه ریزی کرد. (این فیوز بیت بطور پیش فرض فعال است) . میکرو می تواند از این ارتباط برای برنامه ریزی خود استفاده نماید.

فیوز بیت SPIEN : با فعال کردن این فیوز بیت می توان میکرو را از طریق ارتباط دهی سریال SPI برنامه ریزی کرد. این فیوز بیت بطور پیش فرض فعال است.

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

فیوز بیت EESAVE : در زمان پاک شدن (ERASE) میکرو حافظه EEPROM ریست (پاک) می شود ولی در صورتیکه این بیت برنامه ریزی شود محتویات EEPROM در زمان پاک شدن حافظه FLASH محفوظ می ماند. این بیت بطور پیش فرض غیرفعال است.

فیوز بیت های BOOTSZ0 و BOOTSZ1 : این دو بیت، مقدار حافظه اختصاص د اده شده BOOT را طبق جدول زیر تعیین می کنند. در زمان برنامه ریزی شدن فیوز بیت BOOTRST اجرای برنامه از آدرس حافظه BOOT آغاز خواهد شد.

جدول تعیین ظرفیت حافظه BOOT

فیوزبیت BOOTRST : این بیت برای انتخاب بردار Reset است اگر غیر فعال باشد آدرس بردار RESET از $۰۰۰۰ است و اگر این بیت فعال شود به آدرسی که فیوز بیت های BOOTSZ0 و BOOTSZ1 مشخص کرده اند تغییر می یابد.

فیوز بیت BODEN : مدار BROWN-OUT آشکارساز ولتاژ تغذیه است که اگر از ۲.۷ یا ۴ ولت کمتر شود میکروکنترلر را ریست می کند. برای فعال کردن این مدار، باید فیوزبیت BODEN فعال گردد. این فیوز بیت بطور پیش فرض غیرفعال است.

فیوز بیت BODLEVEL : اگر فیوزبیت BODEN فعال و فیوز بیت BODLEVEL غیرفعال باشد با کاهش ولتاژ VCC کمتر از ۲.۷ ولت میکروکنترلر ریست می شود اما اگر فیوز بیت BODLEVEL را فعال کنیم آنگاه با کاهش ولتاژ VCC کمتر از ۴ ولت میکروکنترلر ریست می شود. مطاابق جدول زیر سطح ولتاژ BROWN-OUT تعیین می شود. فیوز بیت BODLEVEL بصورت پیش فرض غیر فعال است.

فیوز بیت های SUT0 و SUT1 : این دو بیت، زمان راه اندازی (Start-up) را در هنگام متصل کردن منبع تغذیه مطابق جدول زیر تعیین می کنند .

فیوز بیت های CLKSEL3 ، CLKSEL2، CLKSEL1، CLKSEL0

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

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

سیستم کلاک پالس در میکروهای AVR بسیار متنوع است. در شکل زیر سیستم توزیع و پخش کلاک و همینطور انواع نوسان ساز ها مشخص شده است. همانطور که در شکل مشخص است منبع کلاک توسط یک مالتی پلکسر, پالس لازم را به واحد کنترل کننده کلاک (AVR Clock Control Unit) اعمال می کند. در واقع کار این انتخاب کننده، انتخاب کردن یکی از نوسان سازهای تامین کننده کلاک ، برای قسمت های مختلف از جمله هسته cpu (CPU Core) یا ADC و یا … می باشد.

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

کلاک غیرهمزمان تایمر_ CLK ASY : با این کلاک تایمر یا کانتر بصورت غیر همزمان توسط فرکانس اسیلاتور HZ32768 کار می کند حتی اگر سیستم در حالت SLEEP باشد.
کلاک I/O – CLK I/O : این کلاک برای تولید پالس ماژول های ورودی و خروجی مانند USART ، SPI ، شمارنده و وقفه ها بکار می رود.
کلاک ADC _ (CLKACD) : کلاک لازم را جهت قسمت مبدل آنالوگ به دیجیتال فراهم می کند که نوسط قسمت مبدل ADC می تواند بطور مجزا تقسیم گردد.
کلاک (CPU)_ CLKcpu : این پالی به هسته (اجزای درونی) CPU و SRAM داخلی اعمال می شود. توقف و به مکث بردن این کلاک باعث می شود که عملیات و محاسبات AVR انجام نگیرد.
کلاک FLASH _ CLKFLASH : کلاک لازم را برای حافظه فلش و EEPROM داخلی فرام می سازد. کلاک فلش معمولا با کلاک CPU فعال می گردد.

نکته آخر اینکه تایمر WATCHDOG از یک اسیلاتور مجزا داخلی (Watchdog Oscillator) برای تاکین کلاک خود استفاده می کند.

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

فیوز بیت های STU0 و STU1

این دو فیوز بیت زمان شروع (Start-up) را در موقع وصل تغذیه جدول ۱-۷ تعیین می کنند (بطور پیش فرض STU0 فعال و SUT1 غیرفعال است).

جدول ۱-۷ تنظیم فیوز بیت های Start-up

فیوز بیت های CKSEL0 , CKSEL1 , CKSEL2 , CKSEL3

توسط این فیوز بیت ها نوع و مقدار فرکانس اسیلاتور را تعیین می کنیم. به طور پیش فرض فیوز بیت CKSEL0 غیرفعال و بقیه فعال هستند یعنی فرکانس ۱MHZ داخلی انتخاب شده است. اگر بخواهیم فرکانس کاری اسیلاتور داخلی را تنظیم کنیم این فیوز بیت ها را طبق جدول ۱-۸ تنظیم می کنیم و اگر بخواهیم از کریستال خارجی استفاده کنیم باید این فیوز بیت ها را طبق جدول ۱-۹ در حالت یک یعنی غیرفعال قرار دهیم در تنظیم این فیوز بیت ها دقت نمایید بطور مثال اگر اشتباهی تمام این فیوز بیت ها را فعال کنیم طبق جدول ۱-۹ مد کلاک خارجی انتخاب می شود که در این حالت میکروکنترلر نه با نوسان داخلی و نه با کریستال خارجی کار می کند بلکه توسط کلاک خارجی که به پایه XTAL1 اعمال می شود کار می کند همچنین توجه کنید اگر شما از کریستال خارجی برای میکروکنترلر خود استفاده می نمایید باید حتما موقع پروگرمر کردن نیز کریستال به میکروکنترلر وصل باشد ولی در حالت استفاده از نوسان ساز داخلی نیازی به قرار دادن کریستال بیرونی ندارید.

جدول ۱-۸ تنظیم نوسان ساز کالیبره شده داخلی

جدول ۱-۹ تعیین منبع کلاک سیستم

نکته: اگر بطور تصادفی فیوز بیت ها را اشتباه تنظیم کرده اید و با قراردان کریستال خارجی، میکروکنترلر توسط پروگرامر شناسایی نشد، یک فرکانس ۱MHZ توسط ی میکروکنترلر دیگری به پایه XTAL1 میکروکنترلر مذکور اعمال کنید و توسط پروگرامر ، فیوز بیت ها را صحیح تنظیم نمائید.

۱-۵ پورت های ورودی و خروجی میکروکنترلر ATmega16

در میکروکنترلر AVR بسته به نوع قابلیت و بسته بندی که دارد دارای یک سری پایه های ورودی و خروجی است. ممکن است عموما یک پورت دارای ۸ پایه نباشد بطور مثال پورت c میکرووکنترلر Atmega دارای ۵ پایه می باشد. پورتهای تمام میکروکنترلرهای AVR می توانند به صورت ورودی و خروجی عمل کنند در حالت اولیه Reset تمام ورودی و خروجی ها در حالت Tri-state قرار می گیرند. Tri-state یعنی حالتی که پایه پورت امپدانس بالا می باشد. همچنین تمامی پایه های پورت ها مجهز به مقاومت بالاکش(Pull-up) داخلی هستند که می توانند در حالت ورودی فعال شوند. از آنجائیکه مقاومت بالاکش (Pull up) داخلی هستند که می توانند در حالت ورودی فعال شوند. از آنجائیکه جریان دهی پورت های میکروکنترلرهای قدیمی نمی توانستند حتی یک LED را روشن کنند شرکت های سازنده میکروکنترلرهای جدید سعی کرده اند که جریان دهی پایه های پورت ها را افزایش دهند بافر latch داخلی میکروکنترلرهای AVR می تواند در جریان دهی (Source) و جریان کشی (Sink) در حالت فعال، جریانی تا ۲۰mA را تامین کند البته در حالت حداکثر می تواند جریان ۴۰mA را تحمل کند. بنابراین به راحتی میتواند یک LED و یا سون سگمنت را جریان دهی کند. بطور کلی تمامی پورت های میکروکنترلرهای AVR دارای سه رجیستر تنظیم کننده به فرم زیر هستند:

۱. DDRx.n : این رجیستر (Data Direction Register) برای تنظیم هر پایه از یک پورت به عنوان ورودی و خروجی در نظر گرفته شده است .اگر بیتی از این رجیستر یک شود نشان دهنده تعیین آن پایه به عنوان خروجی و اگر صفر شود آن پایه ورودی خواهد بود.

مثال:

تمام پایه های پورت A به عنوان خروجی // DDRA=0xFF;

تمام پایه های پورت A به عنوان خروجی // DDRB=0x00;

پایه PC.0 از پورت C به عنوان خروجی // DDRC.0=1;

پایه PC.0 از پورت C به عنوان ورودی // DDRC.0=0;

۲. PORTx.n : این رجیستر (Port Data Register) برای ارسال دیتا به خروجی می باشد. هر موقع میکروکنترلر بخواهد داده ای را به خروجی بفرستد باید ابتدا رجیستر DDRx.n در حالت خروجی تنظیم شده باشد و سپس داده موردنظر در رجیستر PORTx.n قرار می گیرد.

تمام پایه های پورت B به عنوان خروجی // DDRB-0xFF;

عدد ۴۶ دسیمال به خروجی پورت B ارسال می گردد// PORTB=46;

۳. PINx.n : این رجیستر (Port Input Pin Address) برای دریافت دیتا از ورودی است هرگاه میکروکنترلر بخواهد داده ای را از ورودی بخواند باید رجیستر DDRx.n در حالت ورودی تنظیم شده باشد و سپس داده موردنظر از رجیستر PINx.n به صورت بیتی توسط دستورهای شرطی خوانده می شود. همچنین خواندن به صورت بایتی ، با یک متغیر ۸ بیتی انجام می شود.

مثال

فعال کردن مقاومت Pull-up داخلی پایه PCS // PORTC.5=1;

تعیین پایه PCS به عنوان ورودی // DDRC.5=0;

اگر پایه PCS برابر صفر شد دستورالعمل ها اجرا شوند// if(PINK.5==0) {

دستورالعمل ها

}

تعیین تمام پایه های پورت C به عنوان ورودی // DDRC=0Î۰۰;

خواندن دیتا از پورت C و قرار دادن آن در متغیر Data// Data=PINK;

در شکل ۱-۳ بلوک دیاگرام، یک پایه از پورت میکروکنترلر سری ATmega را مشاهده می فرمائید.

Comment

Pull-up

I/O

PUD

(in SFIOR)

PORTxn

DDxn

Tri-state(Hi-2)

No

Input

Î

۰

۰

Pxn wil source current ext pulled low

Yes

Input

۰

۱

۰

Tri-state(Hi-2)

No

Input

۱

۱

۰

Output Low(Sink)

No

Output

Î

۰

۱

Output High (Source)

No

Output

Î

۱

۱

جدول ۱-۱۰ نحوه ی پیکربندی پورت ها

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

پورت A

پایه های PA0 تا PA7 پورت A را تشکیل می دهند. در حالت عادی می توان از این پایه ها به عنوان ورودی و خروجی استفاده کرد. کاربرد بعدی پایه های پورت A به عنوان ورودی مالتی پلکسر مدل آنالوگ به دیجیتال می باشند. توجه کنید در صورتی که شما به طور مثال از کانال ADC0 استفاده می کنید می توانید از دیگر پایه های پورت A برای کاربردهای دیگر به عنوان ورودی و خروجی استفاده کنید اما بهتر است در هنگام عمل تبدیل مبدل آنالوگ به دیجیتال داده ای به خروجی پورت A ارسال نشود برای آشنائی بیشتر با عملکرد دوم این پورت می توانید به فصل مبدل آنالوگ به دیجیتال مراجعه نمائید.

Alternate Function

Port Pin

ADC7(ADC input channel 7)

PA7

ADC6(ADC input channel 6)

PA6

ADC5(ADC input channel 5)

PA5

ADC4(ADC input channel 4)

PA4

ADC3(ADC input channel 3)

PA3

ADC2(ADC input channel 2)

PA2

ADC1(ADC input channel 1)

PA1

ADC0(ADC input channel 0)

PA70

جدول ۱-۱۱ کاربردهای دیگر پورت A

پورت B

پایه های PB0 تا PB7 پورت B را تشکیل می دهند. در حالت عادی ی توان از این پایه ها به بعنوان ورودی و خروجی استفاده کرد. عملکرد بعدی این پورت ارتباط دهی سریال SPI، وقفه خارجی دو، ورودی مقایسه کننده آنالوگ، خروجی مد مقایسه ای تایمر صفر و ورودی کانتر صفر و یک می باشد که به توضیح آنها می پردازیم.

جدول ۱-۷ کاربردهای دیگر پورت B

پایه PB0(XCK/T0)

اگر کانتر صفر استفاده شود ورودی کانتر صفر پایه T0 خواهد بود همچنین اگر USART در مد سنکرون کار کند، پایه XCK به عنوان خروجی کلاک همزمان کننده USART عمل می کند.

پایه PB1(T1)

اگر کانتر یک استفاده شود ورودی کانتر یک پایه T1 خواهد بود.

پایه PB2(INT2/AIN0)

اگر وقفه خارجی دو توسط رجیسترهای مربوطه فعال شود آنگاه پایه INT2 به عنوان ورودی وقفه خارجی دو عمل می کند. همچنین اگرمقایسه کننده آنالوگ داخلی فعال شده باشد پایه AIN0 به عنوان ورودی مثبت OPAMP داخلی عمل می کند.

پایه PB3(OC0/AIN1)

در صورتی که از مد مقایسه ای تایمر صفر استفاده کنیم و خروجی مقایسه ای فعال شده باشد پایه OC0 به عنوان خروجی مد مقایسه ای تایمر صفر و در مد PWM تایمر صفر به عنوان خروجی سیگنال PWM تولید شده عمل می کند. همچنین اگر مقایسه کننده آنالوگ داخلی فعال شده باشد پایه AIN1 به عنوان ورودی منفی OPAMP داخلی عمل می کند.

پایه PB4(SS)

در شرایطی که از ارتباط دهی SPI استفاده کنیم و میکروکنترلر در حالت Slave باشد پایه SS به عنوان ورودی انتخاب Slave عمل می کند.

پایه PB5(MOSI)

اگر از ارتباط دهی سریال SPI استفاد ه کنیم پایه MOSI به عنوان خروجی در حالت Master و به عنوان ورودی در حالت Slave عمل می کند. در حالت ورودی برای Slave تنظیم DDRB.5 تاثیری بر عملکرد این پایه ندارد.

پایه PB6(MISO)

اگر از ارتباط دهی سریال SPI استفاده کنیم پایه MISO به عنوان ورودی در حالت Master و به عنوان خروجی در حالت Slave عمل می کنند. در حالت ورودی برای Master تنظیم DDRB.6 تاثیری بر عملکرد این پایه ندارد.

پایه PB7(SCK)

در ارتباط دهی SPI پایه SCK به عنوان خروجی Master و به عنوان ورودی کلاک Slave عمل می کند. زمانی که Slave انتخاب شود این پایه ورودی خواهد بود و اگر Master انتخاب شود باید توسط DDRB.7 جهت داده تنظیم گردد.

پورت C

پایه های PC0 تا PC7 پورت C را تشکیل می دهند. در حالت عادی می توان از این پایه ها به عنوان ورودی و خروجی استفاده کرد. عملکرد بعدی این پورت ارتباط دهی سریال TW1 ، ارتباط دهی استاندارد JTAG و کریستال پالس ساعت واقعی RTC تایمر دو است.

Alternate Function

Port Pin

TOSC2(Timer Oscillator Pin2)

PC7

TOSC2(Timer Oscillator Pin1)

PC6

TDI(JTAG Test Data In)

PC5

TOO((JTAG Test Data Out)

PC4

TMS((JTAG Test Mode Select)

PC3

TCK((JTAG Test Clock)

PC2

SDA(Twc-wire Seriall Bus Data Input/Output Line)

PC1

SCL(two-wire Serial Bus Clock Line)

PC0

جدول ۱-۱۳ کاربردهای دیگر پورت C

پایه PC0(SCL)

زمانی که از ارتباط دهی سریال دو سیمه TW1 استفاده شود. پایه SCL ب عنوان کلاک عمل می کند. این پایه کلاک استاندارد I2C است.

پایه PCI(SDA)

زمانی که از ارتباط دهی سریال دو سیمه TW1 استفاده شود، پایه SDA به عنوان خط دیتا عمل می کند. این پایه، دیتا استاندارد I2C است.

پایه PC2(TCK)

در ارتباط دهی استاندارد JTAG که برای برنامه ریزی میکروکنترلر نیز استفاده می شود پایه TCK به عنوان کلاک تست به صورت سنکرون عمل می کند. توجه کنید در صورت فعال بودن ارتباط دهی JTAG نمی توان از این پایه به عنوان ورودی و خروجی استفاده کرد. برای غیرفعال این ارتباط دهی به بخش توضیح فیوز بیت ها مر اجعه کنید.

پایه PC3(TMS)

در ارتباط دهی JTAG پایه TMS بر ای انتخاب مد تست می باشد. در صورت فعال بودن JTAG دیگر نمی توان از این پایه به عنوان ورودی و خروجی استفلاده کرد.

پایه PC4(TDO)

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

پایه PC5(TDI)

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

پایه PC6(TOSC1)

در صورتی که بخواهیم از RTC تایمر دو استفاه کنیم باید از کریستال ۳۲.۷۶۸KHZ پالس ساعت استفاده کنیم پایه TOSC1 به عنوان پایه اول اسیلاتور پالس زمان واقعی می باشد. در صورت فعال شدن بیت AC2 در رجیستر ASSR، تایمر دو، پالس خود ر ا از کریستال پالس ساعت تامین می کند و دیگر نمی توان از این پایه در این حالت، به عنوان ورودی و خروجی استفاده کرد.

پایه PC7(TOSC2)

در صورتی که بخواهیم از RTC تایمر دو استفاده کنیم باید از کریستال ۳۲.۷۶۸KHZ پالس ساعت استفاده کنیم پایه TOSC2 به عنوان پایه دوم اسیلاتور پالس زمان واقعی می باشد. در صورت فعال شدن بیت AC2 در رجیستر ASSR، تایمر دو ، پالس خود را از کریستال پالس ساعت تامین می کند و دیگر نمی توان از این پایه در این حالت، بعنوان ورودی و خروجی استفاده کرد.

پورت D

پایه های PD0 تا PD7 پورت D را تشکیل می دهند در حالت عادی می توان از این پایه ها به عنوان ورودی و خروجی استفاد ه کرد عملکردهای بعدی این پورت ارتباط دهی سریال USART، وقفه های خروجی صفر و یک، خروجی های مد مقایسه ای تایمر یک و خروجی مد مقایسه ای تایمر ۲ و ورودی Capture تایمر یک می باشد.

Alternate Function

Port Pin

OC2(Timer/Counter2 Output Compare Match Output)

PD7

ICP

PD6

OC1A

PD5

OC1B

PD4

INT1 (External Interrupt 1 Input)

PD3

INT0 (External Interrupt 0 Input)

PD2

TXD(USART Output Pin)

PD1

RXD(USART Input Pin)

PD0

جدول ۱-۱۴ کاربردهای دیگر پورت D

پایه PD0(RXD)

در ارتباط دهی سریال USART پایه RXD بدون در نظر گرفتن DDRD.0 به عنوان ورودی داده سریال پیکربندی می شود.

پایه PD1(TXD)

در ارتباط دهی سریال USART یا به TXD بدون در نظر گرفتن DDRD.1 به عنوان خروجی داده سریال پیکربندی می شود.

پایه PD2(INT0)

اگر وقفه خارجی صفر فعال شده باشد پایه INT0 به عنوان منبع ورودی وقفه صفر عمل می کند.

PD3(INT1)

اگر وقفه خارجی یک فعال شده باشد پایه INT1 به عنوان منبع ورودی وقفه یک عمل می کند.

PD4(OC1B)

استفاده از مد مقایسه ای تایمر یک و فعال کردن خروجی مقایسه ای، پایه OC1B به عنوان دوم مقایسه ای تایمر یک عمل می کند همچنین در مد PWM تایمر پک، این پایه می تواند سیگنال PWM تولید شده باشد.

PD5(OC1A)

استفاده از مد مقایسه ای تایمر یک و فعال کردن خروجی مقایسه ای، پایه OC1A به عنوان اول مقایسه ای تایمر یک عمل می کند همچنین در مد PWM تایمر یک این پایه می تواند سیگنال PWM تولید شده باشد.

PD6(ICP

حد تسخیر کننده یعنی مد Capture تایمر یک فعال شده باشد پایه ICP به عنوان ورودی Capture یک عمل می کند.

PD7(OC2)

استفاده از مد مقایسه ای تایمر ۲ و فعال کردن خروجی مقایسه ای، پایه OC2 به عنوان مقایسه ای تایمر دو عمل می کند. همچنین در مد PWM تایمر دو، این پایه می تواند خروجی PWM تولید شده باشد.

۱-۶ تغذیه مناسب جهت بایاس میکروکنترلر

VCC و GND تغذیه میکروکنترلر را تامین می کنند میکروکنترلرهای AVR همان طور که در میکروکنترلرهای ATmega16 بیان کردیم می توانند با ولتاژ ۲.۷v تا ۵.۵v برای نوع L و ولتاژ ۴v تا ۵.۵v برای کار کنند اما از آنجائی که اکثر تراشه ها و المان هایی نظیر LCD و آی سی های دیجیتال و ولتاژ ۵v استفاده می کنند بنابراین به طور استاندارد تغذیه میکروکنترلر را ۵ ولت انتخاب و چون ولتاژ بیشتر از ۵ ولت، باعث سوختن میکروکنترلر می شود برای تغذیه آن از رگولاتور ۲۸۰ استفاده می شود البته باید نویز محیط را نیز در نظر بگیریم.

منبع تغذیه DC ورودی ۹ ولتی استفاده کرده ایم زیرا ولتاژ ورودی رگولاتور بهتر است ۳ ولت از ولتاژ نامی باشد همچنین ورودی را می توان ۱۲ ولت انتخاب کرد اما این امر باعث افزایش و گرما در رگولاتور می شود. استفاده از دیود برای حافظت رگولاتور در برابر پلارینه معکوس باشد. سلف ۱MH به همراه خازن عدسی ۱۰Nf به عنوان فیلتر حذف نویز ورودی رگولاتور عمل کند و خازن عدسی ۱۰۰nF نویزهای تغذیه ۵ ولت خروجی رگولاتور را حذف می کند و خازن الکترولیتی ۱۰۰uf در ورودی رگولاتور به صاف کردن تغذیه ورودی کمک می کند و همچنین خازن الکترولیتی ۱۰uf خروجی رگولاتور باعث جلوگیری از افت ولتاژ تغذیه

۵ ولت می شود

.

در صورتی که بخواهیم از تغذیه با ورودی AC برای میکروکنترلر خود استفاده نمائیم باید طبق مدار شکل ۱-۵ عمل کنیم تمام توضیحات داده شده در مدار قبلی ، در این مدار نیز صدق می کند. تنها تفاوت این مدار وجود ترانس کاهنده ۲۲۰ ولت به ۹ ولت می باشد که توسط این دیود به صورت تمام موج یکسو می باشد و توسط خازن شیمیایی ۱۰۰۰mF صاف می گردد.

توجه) رگولاتورهای موجود در بازارهای الکترونیکی می توانند تا ۵۰۰mA حداکثر جریان بدهند در صورتی که بخواهیم جریانی بیشتر از حدمجاز استفاده کنیم می توانیم از یک ترانزیستور و با موازی کردن دو رگولاتور و یا رگولاتورهای با جریان بیشتر و یا از منبع تغذیه سوئیچینگ استفاده کنیم. همچنین برای استفاده جریانی بیشتر از ۱۰۰mA از خروجی رگولاتور مدار فوق، باید از گرماگیر (Heat Sink) استفاده کنیم ابعاد هیت سینک را ۲Î۲ سانتی متر انتخاب کنید.

ساختار داخلی میکروکنترلر ATmega16

همان طور که در بلوک دیاگرام شکل ۱-۶ مشاهده می کنید اجزای درونی میکروکنترلر توسط باس های داخلی به هم متصل شده اند و یک بخش از این بلوک دیاگرام با خط چین با نام AVR CPU مشخص شده است که در واقع پردازنده اصلی AVR می باشد. در این قسمت قصد داریم اجزای تشکیل دهنده شمارنده برنامه، اشاره گر پشته، رجیستر دستورات، آشکارساز دستورات، رجیسترهای X، Y و Z رجیسترهای همه منظوره واحد محاسبه و منطق (ALU) و رجیستر وضعیت از اجزای تشکیل دهنده CPU میکروکنترلر AVR هستند.

میکروکنترلر AVR از معماری RISC استفاد ه می کند و برای کارایی بهتر از ساختار Harvard و همچنین از حافظه ها و باس های جداگانه برای انتقال داده استفاده می کند دستورات به یک سطح pipelining اجرا می شوند و هنگامی که یک دستور در حال اجرا می باشد دستور بعدی از حافظه برنامه pre-fetched می شود به این روش هر دستور تنها در یک کلاک سیکل اجرا می شود.

شکل۱-۶ بلوک دیاگرام داخلی میکروکنترلرATmega16

کار اصلی یک CPU دسترسی به حافظه، محاسبات ریاضی و منطقی، کنترل وسایل جانبی و بررسی وقفه های هر یک از قسمت ها می باشد.

شکل۱-۷ بلوک دیاگرام ساختار میکروکنترلرهای AVR

شمارنده برنامه PC (Program Counter)

CPU میکروکنترلر برای اینکه دستورات را از اولین آدرس حافظه برنامه خط به خط بخواند نیاز به یک شمارنده برنامه می باشد. افزایش PC آدرس خط بعدی را برای اجرای دستورات فراهم می کند.

اشاره گر پشته SP (Stack Pointer) :

در میکروکنترلر AVR اشاره گر پشته از دو رجیستر ۸ بیتی استفاده می کند. اشاره گر پشته برای ذخیره موقت اطلاعات در دستورالعملهای فراخوانی CALL ، PUSH و POP و متغیرهای محلی، روتین های وقفه و توابع استفاده می شود.

رجیستر دستورات (Instruction Registe)

CPU میکروکنترلر برای فهمیدن انجام یک دستورالعمل از کد ماشین استفاده می کند و به هر کدام از این کدها یک سمبل در زبان اسمبلی اختصاص داده می شود. رجیستر دستورات تمامی دستورهای اسمبلی در نظر گرفته شده از طرف شرکت سازنده Atmel را شامل می شود.

آشکارساز دستورات(Instruction Decoder)

شمارنده برنامه افزایش می یابد و کد هر دستور توسط CPU خوانده می شود و با توجه به رجیستر دستورات، خوانده شده آشکار می گردد و CPU متوجه می شود که کد دستور به چه معنی و مفهومی است.

رجیسترهای همه منظوره (General Purpose Register)

میکروکنترلرهای AVR دارای ۳۲ رجیستر همه منظوره هستند این رجیسترها قسمتی از حافظه SRAM میکروکنترلر می باشند که اکثر دستورات اسمبلی AVR مستقیما با این رجیسترها دسترسی دارند یک کلاک سیکل اجرا می شوند.

R0

R1

R2

۰۰۰

R13

R14

R15

R16

R17

۰۰۰

R26

R27

R28

R29

R30

R31

شکل ۱-۸ رجیسترهای همه منظوره CPU میکروکنترلرهای AVR

رجیسترهای X، Y و Z

وظیفه این سه رجیستر که البته از ترکیب رجیسترهای R26 تا R31 بوجود می آیند اشاره گر ۱۶ بیتی آدرس دهی غیرمستقیم فضای داده هستند و بسیاری از دستورات اسمبلی AVR با این سه رجیستر عمل می کنند.

۰ ۷

۰ ۷

۰ ۷

۰ ۷

۰ ۷

۰ ۷

واحد محاسبه و منطق ALU (Arithmetic Logic Unit)

ALU در میکروکنترلر AVR به صورت مستقیم با تمام ۳۲ رحیستر همه منظوره ارتباط دارد. عملیاتهای محاسباتی با رجیسترهای همه منظوره در یک کلاک سیکل اجرا می شوند به طور کلی عملکرد ALU را می توان به سه قسمت اصلی ریاضیاتی، منطقی و توابع بیتی تقسیم بندی کرد در برخی از ALUهای توسعه یافته در معماری میکروکنترلرهای AVR از یک ضرب کننده با قابلیت ضرب اعداد بدون علامت و علامتدار و نیز اعداد اعشاری استفاده شده است.

رجیستر وضعیت SREG (Status Register)

۰

۱

۲

۳

۴

۵

۶

۷

Bit

C

Z

N

V

S

H

T

I

 

R/W

Read/Write

 

Initial Value

بیت های این رجیستر در واقع پرچم هایی هستند که CPU را از نتایج دستورات و وضعیت برنامه آگاه می کنند.

بیت ۰-C پرچم Carry

انجام دستوراتی که عملیات محاسباتی یا منطقی را انجام می دهند سبب تاثیر بر پرچم نقلی(Carry) می شود. بطور مثال اگر نتیجه جمع ۸ بیتی بیشتر از ۸ بیت شود Carry برابر یک خواهد شد.

بیت ۱ –Z پرچم Zero

برخی از دستورات منطقی و محاسباتی سبب تاثیر بر روی این پرچم می شوند اگر حاصل عملیات صفر شود این پرچم فعال می گردد.

بیت ۲-N پرچم Negative

این بیت نشانگر نتایج منفی در عملیاتهای محاسباتی یا منطقی است.

بیت۳-V پرچم Two’s Complement Overflow

در دستورات محاسباتی این بیت نشانگر سرریز مکمل عدد دو می باشد.

بیت ۴-S بیت علامت Sign Bit

این بیت حاصل XOR دو پرچم N و Y می باشد. S=N xor V(S=0 علامت + و S=1 علامت-)

بیت ۵- H پرچم Half Carry

در انجام دستورات محاسباتی BCD پرچم نقلی کمکی تاثیر می بیند.

بیت۶- T پرچم Bit Copy Storage

می توانیم از بیت T به عنوان مبدا و یا مقصد یک عملیات بیتی استفاده کنیم.

بیت ۷- I پرچم Global Interrupt Enable

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

در زبان برنامه نویسی C این بیت بصورت زیر فعال و غیرفعال می شود.

فعال کردن وقفه همگانی// #asm (“sei”)

غیرفعال کردن وقفه همگانی// #asm (“cli”)

۱-۸ انواع حافظه در میکروکنترلرهای AVR

میکروکنترلرهای AVR دارای سه نوع حافظه هستند.

حافظه Flash

در این حافظه کدهای برنامه یعنی همان فایل *.hex که توسط پروگرامر بر روی تراشه Load میشود، قرار می گیرد و CPU میکروکنترلربرنامه را که اجرا می کند کد دستورالعمل را از این حافظه برداشت می کند. حافظه ثابت (Flash) میکروکنترلرهای

AVR از نسل جدید این حافظه می باشد و دارای دو قسمت Application و Boot Loader هستند. در قسمت Application کدهای برنامه قرار می گیرد اما ناحیه Boot این امکان را فراهم می کند که میکروکنترلربدون استفاده از ابزار پروگرامر، برنامه حافظه Flash را تغییر دهد. بطور مثال نحوه ی تعیین یک آرایه در حافظه ثابت بصورت زیر است:

۲عدد ۸بیتی ذخیره شده در Flash // flash char row[]={0xte,Uxtd,oxtd,0xtb,0x17}

شکل ۱-۹ آدرس و تقسیم بندی حافظه Flash را به دو قسمت نشان می دهد.

شکل ۱-۹

نقشه حافظه برنامه (Flash)

حافظه EEPROM

این حافظه جزء حافظه های ماندگار می باشد که میکروکنترلر می تواند اطلاعاتی را در این حافظه داخلی بنویسد و یا اطلاعاتی را از آن بخواند همچنین لازم به یادآوری است که این حافظه در صورت قطع تغذیه میکروکنترلر پاک نمی گردد. از این حافظه زمانی استفاده می شود که میکروکنترلر باید دیتایی را در خود ثبت کند و بعدا آن دیتا را به کاربر اعلام کند و در صورتی که میکروکنترلر Reset شد با تغذیه آن قطع گردید داده ذخیره شده از بین نرود باید توجه کنید که برای خواندن و نوشتن در حافظه eeprom باید یک زمان تاخیری در نظر بگیرید. در جدول ۱-۱۵ مدت زمان مناسب با کلاک ۱MHZ ، ۸.۵ میلی ثانیه بیان شده است.

تعریف متغیر در حافظه EEPROM بصورت زیر است:

متغیر X در حافظه EEPROM ذخیره شده است// eeprom unsigned int X=0xff;

Type Programming Time

Number of Calibrated RC

Oscillator Cycles1

Symbol

۹.۵ ms

۸۴۴۸

EEPROM write(from CPJ)

Note: 1.Uses 1 MHZ clock, independent of CKSEL Fuse setting

جدول ۱-۱۵ زمان برنامه ریزی حافظه eeprom

حافظه SRAM

همانطور که ذکر کردیم کدهای برنامه در حافظه Flash قرار می گیرند و CPU میکروکنترلر کدهای دستورات را آشکار می کند حال باید خاص دستورات انجام شده در یک حافظه موقت ذخیره گردد. این حافظه در میکروکنترلر AVR از نوع Static RAM می باشد رجیسترهای همه منظوره و رجیسترهای ورودی و خروجی نیز جز این حافظه می باشند محتوای این حافظه با قطع تغذیه پاک می گردد و در صورتی که میکروکنترلر را Reset کنیم محتوای رجیسترها صفر می شود اما محتوای حافظه SRAM صفر نمی شود.

بطور مثال متغیر M را در حافظه SRAM ذخیره کنید .

Unsigned char M=0x12;

بنابراین مشخص می شود در تعریف هر متغیری که قبل از آن کلمه کلیدی flash و eeprom استفاده نشود به مفهوم ذخیره متغیر در حافظه SRAM می باشد.

شکل ۱-۱۰ تقسیم بندی حافظه SRAM داخلی میکروکنترلر ATmega16 را نشان می دهد.

۱-۹ کلاک سیستم در میکروکنترلرهای AVR

سیستم پالس ساعت (سیکل ماشین) در میکروکنترلرهای AVR بسیار متنوع است بر خلاف میکروکنترلر ۸۰۵۱ که فقط با کرپیستال خارجی کار می کرد میکروکنترلرهای جدید می توانند علاوه بر کریستال خارجی از نوسان ساز داخلی نیز استفاده کنند. در این قسمت می خواهیم سیستم توزیع کلاک و انواع نوسان ساز ها را توضیح دهیم.

شکل ۱-۱۰ نقشه حافظه دیتا (RAM)

شکل ۱-۱۱ سیستم پالس ساعت را برای قسمت های مختلف درونی نشان می دهد.

شکل ۱-۱۱ بلوک دیاگرام کلاک سیستم

همانطور که در شکل ۱-۱۱ مشاهده می فرمائید منبع کلاک توسط یک مالتی پلکسر، پالس لازم را به واحد کنترل کننده کلاک اعمال می کند. در واقع کلاک لازم جهت راه اندازی می تواند یکی از نوسان سازها باشد و امکان استفاده همزمان از آنها وجود ندارد.

پالس CLKCPU به هسته(اجزای درونی) CPU و SRAM داخلی اعمال می شود، پالس CLKADC ، کلاک لازم را جهت مبدل آنالوگ به دیجیتال فراهم می کند که توسط قسمت مبدل ADC می تواند بطور مجزا تقسیم گردد، پالس CLKFLASH کلاک لازم را بر ای حافظه Flash و eeprom داخلی فراهم می سازد. پالس CLK/IO برای تولید پالس ماژول های ورودی و خروجی نظیر USART، SPI ، شمارنده و وقفه ها بکار برده می شود.پالس CLKASY برای راه اندازی آسنکرون تایمر یا کانتر دو برای استفاده از فرکانس ۳۲.۷۶۸MHZ اسیلاتور RTC است همچنین تایمرWatchdog از یک اسیلاتور مجزا داخلی استفاده می کند.

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

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

میکروکنترلر دارای انواع منابع کلاک اختیاری است که می توان انواع آنرا بوسیله بیت های قابل برنامه ریزی FLASH (FLASH FUSE BITS) انتخاب کرد. کلاک انتخاب شده به عنوان ورودی کلاک AVR طبق جدول زیر در نظر گرفته شده و کلاک مناسب به هر قسمت سیستم داده می شود.

در تمام جداول مربوط به فیوز بیت ها, ۰ به معنای بیت برنامه ریزی شده (PROGRAMMED) و ۱ به معنای بیت برنامه ریزی نشده (UNPROGRAMMED) می باشد.

CKSEL3..0فیوز بیت های

انتخاب کلاک سیستم

۱۱۱۱-۱۰۱۰

اسیلاتور با کریستال خارجی External Crystal/Cermic Resonator

۱۰۰۱

کریستال فرکانس پایین خارجی External Low-Frequency Crystal

۱۰۰۰-۰۱۰۱

اسیلاتور RC خارجی Oscillator External RC

۰۱۰۰-۰۰۰۱

اسیلاتور RC کالیبره شده داخلی Calibrated Internal RC Oscillator

۰۰۰۰

کلاک خارجیExternal Clock

جدول تعیین منبع کلاک سیستم

نوسان ساز با کریستال خارجی

برای استفاده از کریستال خارجی،باید فیوز بیت های CKSEL3.0 را طبق جدول ۱-۱۶ بصورت “۱۱۱۱” برنامه ریزی کنیم . پایه های خارجی XTAL1 و XTAL2 طبق شکل ۱-۱۲ توسط دو خازن عدسی (خازن های بالانس) با مقادیر یکسان به یک کریستال متصل می گردند.

شکل ۱-۱۲ نحوه اتصال کریستال خارجی

خازن های C1 و C2 را معمولا ۲۲PF انتخاب می کنیم. وظیفه این خازن حذف نویز الکترومغناطیس اطراف کریستال می باشد که طبق جدول ۱-۱۷ با توجه به کریستال استفاده شده تعیین می شوند. در PCB برای حذف نویز ، بدنه کریستال خارجی را به زمین وصل می کنند اما نباید بدنه کریستال حرارت بیند زیرا ممکن است به آن آسیب برسد.

Recommended Range for

C1,C2 for Use with Crystals

Frequency Range

MHZ))

CKSEL 0.1

CKOPT

۰.۴-۰.۹

۱۰۱

۱

۱۲-۲۲

۰.۹-۳.۰

۱۱۰

۱

۱۲-۲۲

۳.۰-۳.۸

۱۱۱

۱

۱۲-۲۲

۱.۰ s

۱۰۱.۱۱۰.۱۱۱

۰

جدول ۱-۱۷ انتخاب خازن ها در فرکانس های مختلف

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

این حالت برای محیط های پر نویز مانند کارخانه های صنعتی بسیار مناسب است . البته فعال کردن این فیوز بیت به اندازه چند میلی آمپر جریان مصرفی میکروکنترلر را افزایش می دهد در میکروکنترلرهای بدون پسوند L اگر بخواهیم از کریستال ۱۶MHZ استفاده کنیم باید فیوز بیت CKOPT فعال گردد در غیر اینصورت حداکثر کریستال خارجی ۸MHZ خواهد بود. زمان Start-up برای استفاده از کریستال خارجی توسط فیوز بیت های SUT0 و SUT1 طبق جدول ۱-۱۸ تعیین می گردد.منظور از زمان Start-up مدت زمانی است که تغذیه به میکروکنترلر وصل می شود و بعد از مدتی که نوسانات اسیلاتور پایدار شد میکروکنترلر Reset شده و برنامه را اجرا می کند این مدت زمان در حدود چند میلی ثانیه می باشد.

جدول ۱-۱۸ انتخاب زمان شروع (Start-UP) در حالت نوسان ساز خارجی

نوسان ساز با کریستال فرکانس پائین

منظور از کریستال فرکانس پائین، کریستال ۳۲.۷۶۸MHZ می باشد در صورتی که فیوز بیت های CKSEL 3.0 به صورت برنامه ریزی شوند پالس ساعت سیستم از کریستال خارجی فرکانس پایین استفاه می کند. در این حالت اگر فیوز بیت CKOPT فعال شود خازن داخلی بین دو پایه XTAL1 و XTAL2 فعال می گردد و مقدار این خازن ۳۶F است. نحوه استفاده از این نوسان طبق شکل ۱-۱۲ می باشد و همچنین زمان Start-up در این حالت طبق جدول ۱-۱۹ تعیین میشود.

جدول ۱-۹ انتخاب زمان شروع در حالت نوسان ساز خارجی فرکانس پایین

نوسان ساز با RC خارجی

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

شکل ۱-۱۳ نحوه ی استفاده از اسیلاتور خارجی RC را نشان می دهد

Frequency Range(MHZ)

CKSEL3.0

۰.۹≥

۰۱۰۱

۰.۹-۰.۳

۰۱۱۰

۳.۰-۰.۸

۰۱۱۱

۸.۰-۱۲

۱۰۰۰

جدول ۱-۲۰ انتخاب محدوده نوسان ساز RC خارجی

Recommended Usage

Additional Delay from Reset

Start-up Timer from Power-down and Power-save

SUT1

BOD enabled

۱۸ CK

۰۰

Fast rising Power

۴.۱ ms

۱۸ CK

۰۱

Slowly rising Power

۶۵ms

۱۸ CK

۱۰

Or BOD enabled Fast rising Power

۴.۱ ms

۱۸ CK

۱۱

جدول ۱-۲۱ انتخاب زمان شروع (Start-up) در حالت نوسان ساز RC خارجی

نوسان ساز با اسیلاتور RC کالیبره شده داخلی

اسیلاتور RC کالیبره شده داخلی می تواند فرکانس های ثابت ۱MHZ ، ۲MHZ ، ۴MHZ و ۸MHZ را در شرایط تغذیه +۵v و در دمای ۲۵c ایجاد نماید. فرکانس کاری این اسیلاتور به شدت به ولتاژ تغذیه، درجه حرارت محیط و مقدار بایت رجیستر OSSCAL وابسته می باشد.

از آنجایی که این نوع نوسان ساز به دما و ولتاژ وابسته است پیشنهاد می کنیم در موقع استفاده از تبادل سریال USART و دیگر پروتوکل ها و برنامه هایی که به زمان بسیار وابسته هستند از کریستال خارجی استفاده کنید. در تمامی پروژه های این کتاب از کریستال خارجی استفاده شده است که در برخی می توانستیم از اسیلاتور داخلی استفاده کنیم . همچنین لازم به ذکر است که میکروکنترلر ATmega16 به طور پیش فرض از اسیلاتور کالیبره شده داخلی با فرکانس ۱MHZ استفاده می کند که شما باید فیوز بیت های CKSEL3.0 را طبق مباحث این بخش تنظیم کنید.

زمانی که اسیلاتور داخلی استفاده می شود نیازی به قرار دادن اسیلاتور خارجی نیست و پایه های XTAL1 و XTAL2 آزاد گذاشته می شود و همچنین در این نوسان ساز، نباید فیوز بیت های CKOPT فعال باشد. مقدار فرکانس این اسیلاتور توسط فیوز بیت های CKSEL3.0 طبق جدول ۱-۲۲ تعیین می شود.

Normal Frequency(MHZ)

CKSEL3.0

۱.۰

۰۰۰۱

۲.۰

۰۰۱۰

۴.۰

۰۰۱۱

۸.۰

۰۰۰۰

زمان Start-up نیز توسط فیوز بیت های SUT0 و SUT1 طبق جدول ۱-۲۳ تنظیم می گردد.

Recommended Usage

Additional Delay from Reset

Start-up Timer from Power-down and Power-save

SUT1

BOD enabled

۶ CK

۰۰

Fast rising Power

۴.۱ ms

۵CK

۰۱

Slowly rising Power

۰.۵ms

۵CK

۱۰

Or BOD enabled Fast rising Power

Reserved

۱۱

جدول ۱-۲۳ انتخاب زمان شروع (Start-up) در حالت نوسان ساز کالبیره شده داخلی

رجیستر کالیبراسیون OSCCAL

۰

۱

۲

۳

۴

۵

۶

۷

Bit

CAL0

CAL1

CAL2

CAL3

CAL4

CAL5

CAL6

CAL7

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Read/Write

Initial Value

در صورت استفاده از اسیلاتور RC کالیبره شده داخلی در هر بار که میکروکنترلر Reset می شود مقدار رجیستر OSCCAL، Load می شود و اسیلاتور به طور خودکار تنظیم می گردد. در حالت عادی استفاده از این نوع اسیلاتور ۴۳% خطا دارد اما اگر از شرایط تغذیه +۵v و یا دمای ۲۵c خارج گردد ممکن است این خطا به ۱۰% افزایش یابد که با توجه به اینکه برای دسترسی به حافظه Flash و حافظه eeprom از این اسیلاتور می خواهد استفاده شود ممکن است نتایج نامشخصی داشته باشد. با نوشتن مقدار ۰Î۰۰ کمترین و با نوشتن مقدار ۰xFF در این رجیستر بیشترین فر کانس ممکن انتخاب می گردد. تنظیم دقیق این کالیبراسیون خیلی تضمینی نیست. اما مقدار بایت کالیبراسیون را می توانیم در هر شرایط دمایی طوری تنظیم کنیم که خطا به ۱ کاهش یابد.

Min Frequency

OSSCAL

۱۰۰

۵۰

۱۵۰

۷۵

۲۰۰

۱۰۰

جدول ۱-۲۴ محدوده فرکانسی نوسان ساز RC کالیبره شده داخلی

نوسان ساز با کلاک خارجی

در صورت تنظیم فیوز بیت های CKSEL3.0 به صورت “۰۰۰۰” میکروکنترلر AVR پالس ساعت خود را از یک منبع خارجی که به پایه ورودی تقویت کننده نوسان ساز یعنی XTAL1 اعمال می شود.

منتظر شنیدن دیدگاه شما هستیم

ارسال دیدگاه

ایجاد حساب کاربری
نام و نام خانوادگی (ضروری)
شماره موبایل (ضروری)
تخصص
شهر
بازیابی رمز عبور
رفتن به نوار ابزار