دوره آموزش الکترونیک و برنامه نویسی میکروکنترلر AVR
دوره آموزش الکترونیک و برنامه نویسی AVR در سال تحصیلی 93-94 در دانشگاه صنعتی قم برگزار شد و با استقبال نسبتا خوب دانشجویان همراه بود.
دوره آموزش الکترونیک و برنامه نویسی میکروکنترلر AVR
دوره آموزش الکترونیک و برنامه نویسی AVR در سال تحصیلی 93-94 در دانشگاه صنعتی قم برگزار شد و با استقبال نسبتا خوب دانشجویان همراه بود.
اگر به PORTA.0 تا PORTA.7 نگاه کرده باشید کنارشون یه کلماتی هست : ADC0 تا ADC7 که با استفاده از این پورت( PORTA ) میتونیم سیگنال آنالوگ رو دیجیتال کنیم.
وقفه در AVR
توجه مهم : وقفه به معنی تاخیر زمانی نیست.
بزارید با یه مثال توضیح بدم ، مثال : ما میخایم یه LED رو با یه کلید روشن و خاموش کنیم ؟
1) روش سرکشی (Polling)
ما تو تابع MAIN میایم و میگیم هر موقع که ما کلید رو زدیم فلان پایه ی میکرو فعال شد (یا همون 1منطقی شد) ، اون وقت جنابعالی (منظور میکروکنترلر هستش) هم فلان پایه میکرو رو فعال کن تا LED روشن بشه. حالا مشکل زمانی هستش که ما هنوز کلید رو نزدیم و جناب میکروکنترلر مجبوره که هی بره و ببینه که آیا فلان پایه فعال شده یا نه و هی میره و هی برمیگرده (بیچاره خسته نمیشه این همه راه رو میره !!! ) البته تا حالا من خودم از همین روش استفاده کردم !!! و از روش زیر استفاده نکردم.(آخه چه کاریه گره ای که با دندون باز میشه چرا با دست بازش کنی !!!)
2) روش وقفه ( Interrupt )
تو این روش برخلاف روش قبلی به جای این که ما هی بریم و برگردیم تا بفهمیم که آیا فلان پایه فعال شده یا نه میاییم یه کاری میکنیم : یه موبایل برا دو طرف میخریم و هر موقع که اون پایه هه فعال شد زنگ میزنه به میکرو و میگه دادا بدو بیا که فعال شدم !!!لپ کلوم ای که تو این روش اگه پایه فعال شد خودش ما رو خبر میکنه و دیگه لازم نیس که هی بریم و هی برگردیم و هی بریم و هی … حالا چطور میاد ما رو خبر میکنه رو بعدا یا در ادامه میگم …
1) وقفه داخلی : تقریبا تمام امکانات داخلی میکرو دارای وقفه بوده مانند تایمر –کانترها و پروتکل های ارتباطی و مقایسه کننده ها و مبدل آنالوگ به دیجیتال .
2) وقفه خارجی : در میکرو پایه هایی به نام INTx وجود دارد که زمانی تحریک شوند ، میکرو به زیر برنامه وقفه پرش می کند و کار تعیین شده را انجام می دهد.این وقفه ها می توانند با یک لبه بالا رونده یا پایین رونده و یا یک منطقی تحریک شوند.
نکته : هنگامی که یک پایه به عنوان وقفه استفاده شود دیگر نمی توانیم از آن پایه به عنوان ورودی یا خروجی استفاده کنیم. این یه میکرو کنترلر avr از نوع atmega16 هستش که توش پایه های وقفه صفر-وقفه1 و وقفه 2 رو مشخص کردم.
بیت 7 ( I ) : با یک کردن این بیت ، وقفه سراسری یا کلی فعال میشود.(یعنی میتونیم از وقفه استفاده کنیم.)
توجه مهم : اگه بخواید از وقفه استفاده کنید این بیت حتما باید یک بشه.که این بیت به صورت زیر فعال/غیر فعال میشود.
تو این ریجستر ما فقط با 3 بیت آخرش کار داریم (البته فعلا ! )
بیت 7 (INT1 ) : با یک کردن این بیت وقفه 1 فعال میشود. متناظر با پایه PORTD.3 میباشد.(اون عکس میکروکنترلر avr که در بالا هستش رو نگاه کنید)
بیت 6 (INT0 ) : با یک کردن این بیت وقفه 0 فعال میشود. متناظر با پایه PORTD.2 میباشد.(اون عکس میکروکنترلر avr که در بالا هستش رو نگاه کنید)
بیت 5 (INT2 ) : با یک کردن این بیت وقفه 2 فعال میشود. متناظر با پایه PORTB.2 میباشد.(اون عکس میکروکنترلر avr که در بالا هستش رو نگاه کنید)
اگه وقفه مورد نظر(وقفه صفر-یک یا دو) و وقفه سراسری فعال بود و در صورت تحریک شدن (فعال شدن/غیر فعال شدن)
این ریجستر با توجه به شرایط موجود تصمیم میگیره که دستور اجرای وقفه رو بده یا نده.
برای این که این قدرت تصمیم گیری رو به این ریجستر بدیم باید بیت های لازم و مورد نیازمون از یان ریجستر رو یک کنیم.
مثلا اگه دارید از وقفه صفر استفاده میکنید باید بیت 6 رو یک کنید.
بیت 5 این ریجستر مربوط به وقفه 2»»»بیت 6 این ریجستر مربوط به وقفه 0»»»»بیت 7 این ریجستر مربوط به وقفه 1
این ریجستر هم ریجستر مهمی هستش O_o
ما با نحوه مقدار دهی این ریجستر (که در ادامه میگم) میتونیم نحوه فعال و غیر فعال شدن (نحوه تحریک شدن) وقفه رو تعیین کنیم.
مثلا طوری تعیین کنیم که اگه صفر منطقی شد(0 ولت) فعال بشه (Falling Edge)
یا طوری تعین کنیم که با یک منطقی (5 ولت) فعال بشه (Rising Edge)
نحوه مقدار دهی ریجستر MCUCR
جدول زیر که انواع مقدار دهی بیت های ISC01 و ISC00 رو نشون داده که مربوط به وقفه صفر هستش.
فعلا فقط دوتای آخر رو توضیح میدم و بقیه برای بعدا :
3) اگه 1=ISC01 و 0=ISC00 شد یعنی : با صفر منطقی (همون 0 ولت خودمون) فعال میشه.
4) اگه 1=ISC01 و 1=ISC00 شد یعنی : با یک منطقی (همون 5 ولت خودمون) فعال میشه.
جدول زیر هم مربوط به وقفه یک هستش.
که دیگه من توضیح نمیدم ، چون مثل حالت بالا هستش.
با توجه به توضیحاتی که در بالا دادم ، نحوه تحریک این وقفه که وقفه 2 هست بر خلاف وقفه 1 و 0 که 4 تا حالت داشت ولی وقفه 2 فقط دو حالت دارد لذا دیگر از جدول مدول خبری نیست.
اگه بیت 6 (ISC2) این ریجستر رو صفر کنی با صفر منطقی (همون 0 ولت خودمون) فعال میشه.
اگه بیت 6 (ISC2) این ریجستر رو یک کنی با یک منطقی (همون 5 ولت خودمون) فعال میشه.
تو کد ویژن وقتی یه پروژه جدید ایجاد میکنی و میری تو قسمت کد ویزارد ، میتونی وقفه رو از همون جا فعال کنی و دیگه کد مد ننویسی.
البته به جای EXT_INT0 میتونستیم عدد 2 رو قرار بدیم .
و به جای EXT_INT1 میتونستیم عدد 3 رو قرار بدیم .
و به جای EXT_INT2 میتونستیم عدد 19 رو قرار بدیم .
ارسال و دریافت اطلاعات به دو روش کلی انجام می شود:
1) موازی ( parallel)
۲) سری (serial)
در روش موازی اطلاعات n بیتی در n خط (پایه) انتقال داده می شود اما در روش سریال اطلاعات می تواند در یک خط یا دو خط ارسال گردد.
پس می توان نتیجه گرفت تبادل اطلاعات به صورت موازی با سرعت بیشتری نسبت به حالت سریال صورت می گیرد اما در فواصل طولانی تر تبادل اطلاعات به صورت موازی هزینه بر است و از طرفی نویز پذیری را بالا می برد و در ضمن یک رشته سیم موازی کنار هم در فواصل طولانی باعث ایجاد یک خازن مجازی شده و مقاومت خود سیم ها نیز بر کیفیت دیتا اثر خواهد داشت و البته پارامترهای دیگری نیز وجود دارد که از ضعف های تبادل اطلاعات به صورت موازی است اما روش سریال انتخاب مناسبی در صرفه جویی در تکنولوژی ساخت تراشه ها و کم کردن خطوط انتقال است.
همون طور که در بالا بیان شد ( n بیتی در n خط (پایه) ) میشه نتیجه گرفت که تو این روش مثلا برا تبادل اطلاعات دومیکروکنترلر avr با هم همانند عکس زیر این دو رو به هم وصل میکنیم
و میکروکنترلر 1 (فرستنده) که مثلا قرار است اطلاعات بفرستد ، PORTC (الزامی ندارد که حتما PORTC باشد ) آن را به صورت خروجی تعریف میکنیم.( چون قرار است اطلاعات ارسال کند.)
و میکروکنترلر 2 (گیرنده) که مثلا قرار است اطلاعات بگیرد ، PORTC (الزامی ندارد که حتما PORTC باشد ) آن را به صورت ورودی تعریف میکنیم.( چون قرار است اطلاعات دریافت کند.)
حالا اگه مثلا در میکروکنترلر 1 ، PORTC.0=1 شود آنگاه در میکروکنترلر 2 هم PORTC.0=1 میشود.
از آنجایی که ارتباط سریال مزایای خوبی دارد انواع مختلفی از پروتکل های سریال ارائه شده است ، لذا می توان به صورت کلی خود تبادل سریال را نیز به دو قسمت تقسیم کرد:
۱) ارسال و دریافت اطلاعات سریال به صورت سنکرون( USRT )
در این روش دیتای مورد نظر بر روی یک خط همراه با یک خط کلاک همزمان کننده ارسال می شود و گیرنده نیز می تواند دیتا را بر روی یک خط توسط کلاک همزمان کننده که از طرف فرستنده ارسال می شود ، دریافت نماید. به طور مثال اطلاعاتی که Keyboard یا Mouse کامپیوتر به خروجی ارسال می کنند به همین روش می باشد.
میکرو کنترلرهای AVR در روش سنکرون می توانند به صورت چند پردازنده ای به شکل Master و Slave (منظور همون فرستنده گیرنده هستش) کار نمایند.
این ویژگی فقط در بعضی از میکرو کنترلر های AVR حمایت شده است که البته ATmega16 قابلیت تبادل سریال در مد سنکرون را دارد.
2) ارسال و دریافت اطلاعات سریال به صورت آسنکرون( UART )
در این روش دیتای مورد نظر بر روی یک خط ارسال ( TXD ) یا یک خط دریافت( RXD ) منتقل می شود و به همراه دیتا کلاکی ارسال نمی گردد بنابراین به اصطلاح می گوییم فرستنده و گیرنده غیر همزمان عمل می کنند.
پس در چنین روشی باید دیتای مورد نظر با قالب بندی خاصی به صورت بیت به بیت با فواصل زمانی تعریف شده برای فرستنده و گیرنده منتقل شود ، که به این فواصل زمانی در این نوع ارتباط نرخ انتقال داده یا Baud rate گفته می شود.
از کاربردهای مهم این روش می توان به تبادل اطلاعات با کامپیوتر و میکروکنترلر های دیگر و یا تراشه های دیگر اشاره نمود.
به طور مثال می توان ارتباط با ماژول GSM ، ماژول GPS ، ماژول فرستده و گیرنده RF و… را از کاربردهای مهم این روش برشمرد.
3) ارتباط جانبی سریال ( SPI )
4) ارتباط سریال دو سیمه ( TWI )
تو این جلسه که عنوانش ” ارتباط سریال USART ” هست یه 5 تا ریجستر داریم با نام های UCSRA – UCSRB – UCSRC – UBRRL – UBRRH که در ادامه توضیح میدمشون.بریم سراغ آموزش avr مون و این بار با موضوع قشنگ و زیبا USART !!!
بیت 0 : میکروکنترلر avr به حالت ارتباط سریال چند پردازنده ای میرود ؛ مربوط به اتصال چند میکروکنترلر به صورت سریال.
بیت 1 : فقط در حالت آسنکرون کاربرد داره ، در حالت سنکرون باید صفر شود ، با یک کردنش تقسیم فرکانسی (برا تولید نرخ انتقال داده) از 16 به 8 تغیر میکند.
بیت 2 : اگر در قالب دریافتی خطای توازن رخ دهد این بیت یک میشود.(موقع مقدار دهی به این ریجستر ، این بیت را باید صفر کرد.)
بیت 3 : اگه بافر دریافت پر شده باشه و بازم اگه اطلاعات جدیدی بهش داده شه ، اطلاعات جدید از بین میروند.(موقع مقدار دهی به این ریجستر ، این بیت را باید صفر کرد.)
بیت 4 : اگه در قالب داده دریافتی مشکلی رخ دهد این بیت یک میشه.(موقع مقدار دهی به این ریجستر ، این بیت را باید صفر کرد.)
بیت 5 : اگه بافر خالی باشه و آماده دریافت داداه جدید باشه این بیت یک میشه.(موقع مقدار دهی به این ریجستر ، این بیت را باید صفر کرد.)
بت 6 : اگه داده جدیدی برا ارسال موجود نباشه این بیت یک میشه.(موقع مقدار دهی به این ریجستر ، این بیت را باید صفر کرد.)
بیت 7 : زمانی که داده دریافتی در بافر دریافت موجود باشه و این بافر هنوز خونده نشده باشه.
بیت 0 : اگه فریم داده ارسالی رو 9 بیت انتخاب کنیم ، این بیت به عنوان بیت 9 ام عمل میکند لذا باید این بیت رو یک کنیم.
بیت 1 : اگه فریم داده دریافتی رو 9 بیت انتخاب کنیم ، این بیت به عنوان بیت 9 ام عمل میکند لذا باید این بیت رو یک کنیم.
بیت 2 : این بیت به همراه بیت 1 و 2 ریجستر UCSRC مربوط به تعیین تعداد بیت داده هستش که با توجه به جدول زیر میتونید تعیینش کنید.
بیت 3 : برا تعیین قطعه مورد نظر (مثلا میکرو) به عنوان ارسال کننده داده باید این بیت یک شود.(با این کار عملکرد عادی پایهPORTD.1 قطع شده و نقش دومش یعنی TXD فعال میشه.)
بیت 4 : برا تعیین قطعه مورد نظر (مثلا میکرو) به عنوان دریافت کننده داده باید این بیت یک شود.(با این کار عملکرد عادی پایهPORTD.0 قطع شده و نقش دومش یعنی RXD فعال میشه.)
بیت 5 : با یک کردن این بیت وقفه خالی بودن بافر دریافتی فعال میشه.(البته به شرطی که بافر کلی(یا همون سراسری!) هم فعال باشه)
بت 6 : با یک کردن این بیت وقفه کامل شدن ارسال فعال میشه.(البته به شرطی که بافر کلی(یا همون سراسری!) هم فعال باشه)
بیت 7 : با یک کردن این بیت وقفه کامل شدن دریافت فعال میشه.(البته به شرطی که بافر کلی(یا همون سراسری!) هم فعال باشه)
بیت 0 : در مد سنکرون کاربرد دارد.
بیت 1 , 2 : توسط این دو بیت به همراه بیت 2 ریجستر UCSRB میتوان تعداد بیت داده رو تعیین کرد. که با توجه به جدول بالا میتونید تعیینش کنید.
بیت 3 : تعیین تعداد بیت های STOP (اگه صفرش کنیم>>یک بیت STOP و اگه یکش کنیم>> دوبیت STOP )
بیت 4 و 5 : تعیین بیت توازن ارسالی توسط ارسال کننده.با توجه به عکس(جدول!) زیر این کار رو کنید.
بیت 6 : انتخاب مد ارتباط سریال ؛ 0»»مد اسنکرون و 1»»مد سنکرون
بیت 7 : انتخاب دسترسی به یکی از ریجستر های UCSRC یا UBRRH ، برای دسترسی به UCSRC باید این بیت یک شود.
بیت 0 تا 11 : این 12 بیت برا تعیین نرخ انتقال داده استفاده میشوند.(توسط جدول زیر—جدول زیر رو از دیتاشیت مگا16 گرفتم)
روی عکس ها کلید کنید و در اندازه اصلی ببینیدشون
توضیح : مبحث SPI هم کارش تقریبا مثل USART هستش فقط یه کم باهاش تفاومت داره>>>هر کدوم از این روش ها کاربرد خاص خودشون رو دارند>>>مثلا برا اتصال SD CARD به میکرو باید از روش SPI استفاده کنید و برا بیشتر ماژول ها از USART >>>در کل هر کدوم جای خودشون کاربرد هایی دارند.
منم اصلا نمیخواستم این مطلب رو بزارم>>>ولی مجبور شدم>>>چون برا کار با LCD گرافیکی های بزرگ >>اگه بخوای توشون تصویر نشون بدی>>>با توجه به این که میکروکنترلر حافظش کم و محدود هستش ما میایم و به میکرو یه SD CARD وصل میکنیم و تصاویر رو در SD CARD ذخیره میکنیم و از این طریق تصاویر رو تو LCD نشون میدیم.
و به احتمال زیاد مطلب بعدی در مورد “آموزش اتصال SD CARD به میکرو” هستش.>>>و مطلب بعدی در مورد LCD گرافیکی های سری توشیا >>> انشاالله.
این عکسی که مشاهده میکنید مربوطه به mega16 و اون 4 تا پایه که تو شکل مشخص کردم مربوطه به بحث ارتباط سریال SPI ، در زیر پایه ها رو مختصرا توضیح میدم.
SS : انتخاب SLAVE مورد نظر (با صفر فعال میشه.>>یعنی اگه پایه SS یه SLAVE رو صفر کنی>>به حالت انتخاب در میاد)
MOSI : پایه انتقال اطلاعات از MASTER به SLAVE
MISO : پایه انتقال اطلاعات از SLAVE به MASTER
SCK : خط کلاکی که توسط MASTER ایجاد میشه
توجه : در کد نویسی باید ورودی خروجی بودن این پایه ها رو (مثل بقیه پایه ها) تعیین کنیم.
ورودی خروجی بودن پایه ها باید بر طبق جدول زیر باشد. (اگه 4-5 خط بالا رو بخونید و تصویر زیر رو نگاه کنید و نیم ثانیه فکر کنید >>کار جدول زیر رو میفهمید.)
مبحث SPI هم زیاد با USART فرق نداره (اه اه اه دماغم چرا داره بزرگ میشه؟؟؟) >>> هر کدوم جای خودشون کار برد هایی دارند.
تو مبحث USART میگفتیم فرستنده گیرنده اما در SPI میگیم Master_slave یعنی :
دستگاهی که فرستنده هستش رو میگن Master و دستگاهی که گیرنده هست رو میگن Slave (نامردا اسم فرستنده گیرنده رو عوض کردن…^_^)
توجه : ما میتونیم با یک master شونصد تا (تعداد زیادی) slave رو کنترل کنیم و بهشون اطلاعات بدیم.
توجه : اونایی که با رنگ سبز مشخص کردم ، مهم هستن و با بقیه فعلا کاری نداریم.
بیت0 و 1 : تعیین تقسیم فرکانسی(تعیین فرکانس کاری SPI)>>>در جدول زیر بیت 0 ریجستر SPSR رو هم ابردم(اگه یک بشه>>فکانس دوبرابر میشه)
بیت2 : نمونه برداری از پایه های MOSI و MISO >>>صفر : لبه بالا رونده ___ یک : لبه پایین رونده
بیت3 : وضعیت اولیه پایه ی SCK >>> صفر : پایه SCK صفر میشه ___ یک : پایه SCK یک میشه (البته اینا در صورتی هستن که پالسی ارسال نمیشه)
بیت4 : صفر : انتخاب مد SLAVE __ یک : انتخاب مد MASTER
بیت5 : یک : ابتدا بیت LSB ارسال میشه ___ صفر : ابتدا بیت MSB ارسال میشه
بیت6 : یک : فعال کردن SPI ___ صفر : غیر فعال کردن SPI
بیت7 : فعال شدن وقفه SPI (البته به شرط فعال بودن وقفه همگانی) >>> با یک شدن بیت SPIF واقع در ریجستر SPSR
بیت 0 : با یک کردن این بیت>>فرکانس SCK در MASTER دو برابر میشه.
بیت 1تا5 : رزرو شده(یعنی شما نمیتونید از این بیت ها استفاده کنید و باید بجاشون صفر قرار بدید.)
بیت 6 : اگه در حین انقال دیتا در ریجستر SPDR ، دیتای جدیدی نوشته بشه>>این بیت یک میشه.
بیت 7 : زمانی که دیتا به طور کامل ارسال شود >> این بیت یک میشه.
خواندن و نوشتن دیتا توسط این ریجستر انجام میشود.
توجه توجه : عمل دریافت فرستادن اطلاعات(تو کد نویسی منظورمه)با تابع زیر صورت میگیره :
1 |
spi();
|
این تقریبا پروژه مربوط به جلسه 3 لینک بالا هستش که من یه کم ویرایشش کردم و…
کار این پروژه اینه که هر 20ms یه led رو روشن خاموش میکنه.>>>led به PORTB.0 وصل هستش.
1) فرکانس کاری میکرو 8MHZ هستش.
2) فرکانس کاری تایمر/کانتر : ما تقسیم فرکانسی 256 رو براتایمر/کانتر انتخاب میکنیم.>>>لذا 8 مگا هرتز(فرکانس کل) رو بر 256 تقسیم میکنیم و عدد حاصل فرکانس کاری تایمر/کانتر هستش.
3) به دست ابردن تعداد کلاک مورد نیاز برای تولید زمان مورد نیاز ما : >>>>زمان مورد نیازمون رو بر فرکانس تایمر/کانتر تقسیم میکنیم(یا زمان مورد نیازمون رو بر دوره تناوبتایمر/کانتر ضرب میکنیم)>>>و بعد مقدار به دست اومده رو منهای 1 میکنیم>>>و بعد عدد رو رند میکنیم.>>>عدد حاصل در این پروژه تقریبا میشه 249 تا کلاک.
توجه : تایمر/کانتر 0 هشت بیتی فقط میتونه از 0 تا 255 تا کلاک رو بره.
در کدویژارد باید تنظیمات مطابق شکل زیر باشه(دو پروژه ای که در زیر گزاشتم به صورت شکل زیر هستن.)
1) انتخاب Timer0
2) Clock Source : انتخاب منبع فرکانسی…>>>>ما فرکانس کاری میکرو رو انتخاب کردیم.
3) Clock Value : فرکانس کاری تایمر هستش>>>با فرض این که تقسیم فرکانسی 256 هستش و فرکانس کاری میکرو 8 مگا هرتز هستش.
4) Mode : انتخاب مد نرمال. (جلسات بعد در مورد بقیه مد ها پروژه هایی رو میزارد انشاالله)
5) Output : گفتم که خروجی تغییر نکنه (منظور PORTB.0 یا همون T0 در میکروکنترلر هستش)
6) Overflow Interrupt : وقفه سر ریز رو فعال کردم>>>>یعنی هر موقع به کلاک 255 رسیدیم >>>وقفه رخ میده.
اگه در مورد وقفه چیزی نمیدونید مطلب مقابل رو بخونید : آموزش جامع میکروکنترلر AVR جلسه۳
پروژه 1 >>>مد نرمال>>>تقسیم فرکانسی 256>>خروجی تغییر نمیکند>>>فرکانس کل میکرو 8 MHZ
توضیح پروژه : تو کد به میکرو میگم هر موقع تایمر/کانتر 125 بار به کلاک 255 رسید(شمارش کلاک ها از 7 آغاز میشود) شما! led رو اگه خاموشه روشن کن و اگه روشنه خاموشش کن.تو این پروژه led هر 1 ثانیه روشن میشه(البته اگه خاموش باشه و اگه خاموش باشه روشن میشه)
اینم از مدار پروژه
اینم از کد های پروژه
پروژه 2 >>>مد نرمال>>>تقسیم فرکانسی 256>>خروجی تغییر نمیکند>>>فرکانس کل میکرو 8 MHZ
اگه در کدویژن روی دکمه ی زیر ( Chip Programmer ) کلیک کنید.
صفحه ی زیر باز میشه که در این مطلب میخوام تمام موارد شکل زیر رو توضیح بدم.
در زیر میخوام به ترتیب شماره ای که در عکس بالا گزاشتم….تمام مواردش رو توضیح بدم.
(توضیح اون 16 تا مورد که تو عکس بالا داخل اون مستطیل آبی میبینید)
توجه : فیوزبیت ها با 1 غیر فعال و با 0 فعال میشوند.
عمل کرد : با این 4 تا فیوز بیت ما فرکانس کاری میکرو رو تعیین میکنیم…..که هر چی عدد بزرگتری رو انتخاب کنید ….پروژتون سریع تر عمل میکنه.
توجه1 :
توجه 2 : مقدار فرکانس پیش فرض 1Mhz میباشد.(در حالتی که فیوز بیت ها رو تغییر ندید ، مقدار فرکانس پیش فرض 1Mhz هستش)
به نظر من : بهتره که رو 8Mhz تنظیم کنید.
منبع فرکانس و اندازش | CKDEL3..0 |
1Mhz – داخلی | 0001 |
2Mhz – داخلی | 0010 |
4Mhz – داخلی | 0011 |
8Mhz – داخلی | 0100 |
عملکرد : زمان شروع به کار میکروکنترلر بعد از اتصال به منبع تغزیه.تو حالت پیشفرض SUT0 فعال و STU1 غیر فعال هستش.
به نظر من : بهتره که تو حالت عادی دست بهش نزنید و بزارید رو حالت پیش فرض بمونه
Delay | SUT1..0 | CKSEL0 |
4.1ms | 00 | 0 |
65ms | 01 | 0 |
– | 10 | 0 |
4.1ms | 11 | 0 |
65ms | 00 | 1 |
– | 01 | 1 |
4.1ms | 10 | 1 |
65ms | 11 | 1 |
عملکرد : با فعال کردن و غیر فعال کردن این دو فیوز بیت تعیین میکنیم که اگه ولتاژ تغزیه میکرو از چه حدی پایین تر اومد اون وقت میکرو ریست بشه.
به طور پیش فرض فیوز بیت BDEN فعال و BODLEVEL غیر فعال هستش.
عملکرد | BODLEVEL | BODEN |
اگه VCC کمتر از 4v بشه ، میکرو ریست میشه | 0 | 0 |
غیر فعال | 1 | 1 |
اگه VCC کمتر از 2.7v بشه ، میکرو ریست میشه | 1 | 0 |
این فیوز بیت برا انتخاب بردار RESET هستش.تو حالت عادی اگه میکروکنترلر AVR ریست بشه بردار RESET از 0X0000 شروع میشه (زمانی که این فیوز بیت غیر فعال هستش) ولی اگه این فیوز بیت رو فعال کنیم بردار RESET از جایی شروع میشه که توسط 2 فیوز بیت BOOTSZ1 و BOOTSZ0 تعیین کردیم.(یعنی اگه زمانی میکرو ریست شد ؛ بردار ریست از 0X0000 دیگه شروع نمیشه و مثلا از 0X00FF شروع میشه.)>>>>اگه نفهمیدید بگید تا بیشتر توضیح بدم.
توجه : تو ( بعضی از ) میکروکنترلر ها حافظه فلش به دو قسمت کاربردی(جایی که اطلاعات ما موقع پروگرام کردن اطلاعاتمون درش قرار میگیره) و BOOT تقسیم میشود.
توضیح : این فیوز بیت میزان حافظه اختصاص داده شده به BOOT رو تعیین میکنند.
Boot Loader چیست
(تو حالت عادی هر دو فیوز بیت فعال هستند…یعنی هر دو صفر هستن)
(×_×) اینم از جدول مقدار دهی این دو فیوز بیت.
وقتی میکرو رو اطلاعاتش رو پاک میکنی هم اطلاعات توی FLASH پاک میشه و هم اطلاعات روی EEPROM
حالا اگه بخوایم کاری کنیم که موقه پاک کردن میکرو کنترلر حافظه EEPROM اطلاعاتش پاک نشه باید این فیوز بیت رو فعال کنید
(تو حالت عادی این فیوز بیت غیر فعال هستش)
با فعال شدن این فیوزبیت مقدار توان مصرفی افزایش یافته ولی در عوض سطح نوسان توسط آمپلی فایر افزایش می یابد و باعث بهبود عملکرد در محیط نویزی خواهد شد.(در حالت پیش فرض این فیوز بیت غیر فعال هستش)
این فیوز بیت به طور پیش فرض فعال هستش و پایه های PC2 تا PC5 غیر فعال هستند (MEGA16) و نمیتونید ازشون به عنوان ورودی/خروجی (I/O) استفاده کنید.
این فیوز بیت برا پروگرام کردن میکرو در حالت JTAG هستن.
لذا اگه میخواین از PORTC در پروژتون استفاده کنید ، حتما این فیوز بیت رو غیر فعال کنید.
لپ کلوم : این فیوز بیت برا پیدا کردن عین برنامه به صورت آنلاین هستش.
اگه JTAGEN فعال باشه برنامه میکرو هم قفل نشده باشه ، با فعال کردن این فیوز بیت میشه پروژه مون رو به صورت آنلاین از طریق نرم افزار AVR STDIO مشاهده کرد.
در شکل زیر قسمت فیوز بیت ها (مستطیل آبی رنگ) رو توضیح دادم و بقیه قسمت هاش هم بمونه برا بعد (الان حسش نیست که بگم. ×_×)
تو avr و تو میکرو کنترلر مگا ۱۶ ما ۳ تا تایمر کانتر داریم که به اولی میگن “تایمر/کانتر ۸ بیتی صفر” و به دومی میگن “تایمر کانتر ۱۶ بیتی ۱” و به سومی میگن “تایمر کانتر ۸ بیتی ۲”
پس ۲ تا تایمر/کانتر ۸ بیتی داریم و یه دونه ۱۶ بیتی……
همون طور که تو عکس زیر میبینید تو میکروکنترلر avr یه ۴ تا پایه هستش که میشه به عنوان پایه های pwm یا همون DAC ازشون استفاده کرد…..مثلا اگه از تایمر کانتر ۸ بیتی ۰ یا ۲ استفاده کنید فقط یه پایه برای این کار وجود داره(هر تایمر یه دونه پایه) ولی تو تایمر/کانتر ۱۶ بیتی ۱ دو پایه به برای این کار وجود داره….که ما تو کنترل سرعت موتور مخصوصا برا ساخت ربات ها که معمولا به ۲ موتور و ۲ چرخ برا رباتشون نیاز دارن میان و از تایمر/کانتر ۱۶ بیتی ۱ استفاده میکنن تا سرعت ۲ تا موتور رو کنترل کنن….لذا دیگه از تایمر ۰ یا ۲ استفاده نمیکنن….
توجه ۱ : تایمر کانتر ۰ و ۲ هشت بیتی هستن و تایمر/کانتر ۱ شانزده بیتی هستش.
توجه ۲ : تو حالت ۸ بیت ماکزیمم مقدار۰XFF هستش که یعنی ۲۵۶ و تو حالت ۱۶ بیت ماکزیمم مقدار ۰XFFFF هستش که یعنی ۶۵۵۳۶ ولی باید توجه کرد که چون شمارش کلاک (و کلا شمارش هر چیزی تو AVR ) از صفر شروع میشه و نه یک ، لذا تو حالت ۸ بیت ماکزیمم مقدار ۲۵۵ هستش و تو حالت ۱۶ بیت ماکزیمم مقدار ۶۵۵۳۵ هستش.
همون طور که تو عکس زیر میبینید(تمام عکس ها از دیتاشیت مگا ۱۶ گرفته شده است) ما ۵ تا منبع کلاک برا میکرو داریم که در زیر مشاهده میکنید و در ادامه هر ۵ تا مورد زیر رو تقریبا کامل توضیح میدم.
در شکل زیر مورد ۱ بیشترین کاربرد رو داره : اگه بخواین از کریستال خارجی استفاده کنید و سرعت بالاتر و دقت بیشتری داشته باشید از این گزینه استفاده میکنید.
مورد ۲ و ۳ زیاد کاربرد ندارن، مورد ۴ هم تامین کننده کلاک داخلی میکرو هستش و نیازی به استفاده از کریستال خارجی در این حالت نیست، اگه میخواین از کریستال خارجی استفاده نکنید این گزینه مناسب شماس.
مورد ۵ هم کاربرد های خاص خودشو داره و هر جایی استفاده نمیشه ازش.
توجه ۱ : این مطلب بر اساس مگا ۱۶ هستش، اگه اشتب نکنم برا مگا ۸ و مگا ۳۲ هم همین طوره، ولی این که برا میکرو های دیگه مثلا سری ATINY یا سری XMEGA یا همین سری MEGA مدل های دیگه اش!!! منابع کلاکش به همین صورته یا نه و این که فیوز بیتاش همینا هستن یا نه و این که شاید فرقایی داشته باشن یا نه و… رو من دقیقا نمیدونم.
ولی اگه شما با غیر از این ۳ تا میکرو(مگا۸-۱۶-۳۲) میخواین کار کنید برا اطمینان میتونید دیتاشیت میکرو مورد نظرتون رو یه کوچولو نگاه کنید ببینید جدول مدولاش مثل همین مطلب(مثل مگا۱۶) هستش یا نه.
توجه ۲ : اینو همین جا بگم تا وسط کار قاطی نکنید(مثل من) و بعدا فیوز بیت ها رو اشتباه تنظیم کنید و گند کار دربیاد.
کلاک پیشفرض میکرو ۱MHz اسیلاتور داخلی RC هستش که با تنظیم فیوز بیت ها به صورت “CKSEL = “0001” و “SUT = “10 حاصل میشه، این دو تا فیوز بیت تو حالت عادی همین مقدار رو دارن، مگه این که تغییرشون بدید.(وقتی میکروی جدیدی همون نو ایی میخرید این کلاک رو داره)
توجه : طولانی ترین زمان راه اندازی میکرو مربوط به این کلاکه (طبق گفته دیتاشیت مگا ۱۶ و فهم من!!!)
۱) کریستال خارجی ( External Crystal/Ceramic Resonator )
نحوه اتصال کریستال خارجی به میکرو : مثل شکل زیر کریستال رو وصل کنید به میکرو.
توجه ۱ : خازن های C1 و C2 باید با هم برابر باشند و مقدار این خازن ها تو جدول زیر اومده.
توجه ۲ : توی این حالت وقتی فیوز بیت CKOPT فعال میشه، دامنه نوسانات افزایش پیدا میکنه و میشه کلاک خارجی بیشتری به میکرو اعمال کرد(با فعال بودن این فیوز بت تا سقف ۱۶MHz و با غیر فعال بودنش تا سقف ۸MHz)، وقتی CKOPT فعال باشه توان مصرفی افزایش پیدا میکنه و بیشتر بدرد محیط های صنعتی (که محیط پر نویزی هستش) میخوره.
طبق جدول زیر به ازای مقادیر فرکانس که میخوایم به میکرو اعمال کنیم باس فیوز بیت ها رو مقدار دهی کنیم.
توجه ۳ : همون تور که در ته عکس میبینید، برا سطر اول باید از Ceramic Resonators به جای Crystals استفاده کرد، یعنی اگه بخواین فرکانس بین ۰٫۹ – ۰٫۴ به میکرو اعمال کنید باید از Ceramic Resonators به جای کریستال استفاده کنید، در ضمن تو این مورد نیازی به استفاده از خازن نیست(اون طوری که من از جدول فهمیدم، چون مقداری برا این حالت برا خازن ها ذکر نکرده.)
توجه ۴ : تو سطر آخر میتونیم فرکانس های بین ۱MHz تا ۱۶MHz به میکرو اعمال کنیم(همون طور که در نکات بالا گفتم اگه فیوز بیت CKOPT فعال باشه میشه تا ماگزیمم فرکانس ۱۶ میگ هم به میکرو داد) و مقدار CKOPT = 0 (فیوز بیت ها با صفر فعال و با ۱ غیر فعال میشن) و CKSEL3..1 هم یکی از مقادیر ۱۰۱, ۱۱۰, ۱۱۱ رو میتونه بگیره(که فرق نداره کدومش رو به این ۳ تا فیوز بیت بدید.)
توجه ۵ : اگه توجه کنید تو جدول بالا خبری از CKSEL0 نیست، چون تو جدول زیر به همراه SUT1..0 برا تعیین start-up times (زمان راه اندازی) مورد استفاده قرار گرفته.
خوب تو جدول زیر ما start-up times رو تعیین میکنیم،
وقتی بخواین با میکرو یه ساعت بسازید میتونید از کریستال ۳۲٫۷۶۸kHz به عنوان منبع کلاک میکرو استفاده کنید و برا این کار باید فیوز بیت CKSEL3..0 رو برابر ۱۰۰۱ قرار بدید؛ نحوه اتصال این کریستال به میکرو همانند شکل بالا هستش(اولین عکس بعد از تیتر “کریستال خارجی”)
جدول زیر هم مربوط به تعیین start-up times هستش، مقدار ۱۱ برا SUT1..0 رزو شده(Reserved) هستش و نمیشه این مقدار رو به این ریجستر داد که این مورد در سطر آخر نمایش داده شده.
نکته : اون Note زیر عکس(عکس بالا) میگه : این این گزینه ها تنها باید زمانی استفاده بشن که ثبات فرکانسی در شروع کار(در هنگام راه اندازی) میکرو مهم نیست برا برنامه.
نحوه پیکربندی RC خارجی و اتصال به میکرو رو در شکل زیر میبینید(منظور از NC یعنی به جایی وصل نیست)
در زیر هم میبینید که به ازای رنج های مختلف فرکانس باس مقادیر متناسب باهاش به فیوز بیت CKSEL3..0 داده شود که این موضوع تو جدول زیر اومده :
نحوه تعیین Start-up Times برا این منبع کلاک رو هم تو جدول زیر مشاهده میکنیید :
این منبع کلاک، فرکانس های ۱، ۲، ۴ و ۸ مگا هرتز رو تولید میکنه.(این فرکانس ها در ولتاژ ۵ ولت و دمای ۲۵ درجه سانتی گراد هستش.)
اگه این مورد انتخاب بشه دیگه نباید به پایه های XTAL1 و XTAL2 چیزی وصل کرد.
فیوزبیت CKOPT هنگام استفاده از این منبع کلاک باید غیر فعال باشه.
نحوه انتخاب فرکانس و تنظیم فیوز بیت CKSEL3..0 و تنظیم Start-up Times تو ۲ جدول زیر مشاهده میکنید :
برا این نوع از منبع کلاک یه ریجستر داریم با نام OSCCAL که برا بحث کالیبره کردن کاربرد داره که خودش یه بحث جداس.
این حالات زمانی رخ میدهد که به فیوز بیت CKSEL مقدار ۰۰۰۰ داده شود.
این منبع کلاک توسط تایمر میکروی دیگه ای یا مثلا آی سی ۵۵۵ و… میتونه تامین بشه.
با فعال کردن فیوز بیت CKOPT یه خازن داخلی با مقدار ۳۶pF بین پایه های XTAL1 و GND فعال میشه.
نحوه اتصال کلاک خارجی به میکرو به صورت زیر است.
در جدول زیر هم زمان راه اندازی رو مشاهده میکنید :
در زیر نرم افزار ای سی ۵۵۵ رو میزارم براتون، که همون طور که تو عکس زیر میبینید میشه D.C (دیوتی سایکل، Duty Cycle >>>> لپ کلوم : تعیین میزان یک و صفر بودن موج) مورد نظر رو انتخاب کرد و فرکانس رو داد و مدار و خازن و مقاومت مورد نظر رو دریافت کرد و مدار تولید کلاک با آی سی ۵۵۵ رو ساخت.
محاسبه فرکانس و D.C در مد FAST PWM
خب رسیدیم به بحث جالبی، تو دیتاشیت مگا ۱۶ برا محاسبه فرکانس تایمر تو مد FAST PWM مثل این که دو تا فرمول دارم، یکی برا تایمر ۱۶ بیتی(تایمر۱) و یه فرمول هم برا تایمر های ۸ بیتی(تایمر ۰ و ۲)، حالا این که چرا دو تا فرمول دارم و نه یه دونه و این که از کجا اومدن این فرمول ها، در ادامه میخوام دربارش صحبت کنیم.
تو تایمر ۰ و ۲، تو مد FAST PWM تایمر از BOTTOM (همون ۰) میشموره تا MAX (همون ۲۵۶) و بعد دوباره مقدار تایمر ۰ شده و از BOTTOM میشموره ….
و تو این شمارش هر موقع مقدار تایمر (TCNTn) با مقدار ریجستر های مقایسه (OCRn) برابر بشه، پایه مقایسه ای(OCn) تغییر حلت داده(البته اگه روی toggle تنظیمش کرده باشین.) و تایمر به شمارش خودش ادامه میده و…
تو بالا یه فرمولی(عکس) گزاشتم که در زیر هم میبینیدش، حالا میخوام نحوه محاسبه این فرمول رو بگم و این که این فرمول از کجا اومده و…