آموزش میکروکنترولر AVR از ابتدا تا پیشرفته

در اين بخش مي‌توانيد آموزش و مثال‌های مرتبط با میکروکنترلرهای AVR را مشاهده بفرمایید

مدیران انجمن: SAMAN, sinaset, شوراي نظارت

مطالب برایتان مفید بود

عالی و ساده بود،ادامه دهید
21
81%
خوب و قابل فهم بود،ادامه دهید
5
19%
ساده و قابل فهم نبود.
0
بدون راي
تکراری و سخت بود.
0
بدون راي
 
مجموع رای گیری: 26

New Member
پست: 6
تاریخ عضویت: پنج شنبه 9 آذر 1396, 4:36 pm
سپاس‌های ارسالی: 50 بار
سپاس‌های دریافتی: 2 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(نمایش عدد،7سگ

پست توسط mohsen2017 » جمعه 10 آذر 1396, 12:28 pm

سلام
اگر ممکنه بحث رو ادامه بدید
بی صبرانه منتظریم
راستی مبحث ADC و تایمر و interrupt رو اگه میشه مفصلا توضیح بدید
سپاس از جنابعالی

New Member
پست: 2
تاریخ عضویت: یک شنبه 12 آذر 1396, 3:14 am
سپاس‌های ارسالی: 3 بار
سپاس‌های دریافتی: 2 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(+فهرست)

پست توسط Khan1364 » دو شنبه 13 آذر 1396, 3:05 am

sinaset نوشته شده:بنام خداوند بخشنده و مهربان
با سلام

خوب تا اینجا کار متوجه شدیم که، برنامه که ما می نویسیم،در حافظه فلش ذخیره میشود.سپس به کمک واحد "شمارنده برنامه" یا Program counter یکی یکی خوانده (دستور اول و دوم و ...) و بعد به واحد ترجمه فرستاده (instruction Register وInstruction Decoder) سپس به کمک Sram ( قسمت "ثبات های همه منظوره") به واحد ALU فرستاده میشود و در انجا محاسبات منطقی و محاسباتی انجام میشود و در نهایت.بعد از تغییرات نتیجه گزارش میشود.

اما سی پی یو و واحد های میکروکنترولر. به کمک واحدی، این داده ها و یا همان بیت و بایت های خود را درست و تنظیم می کند،که اگر ان واحد نباشد! عملا هیچ گونه دیتایی به وجود نمی اید...!

واحد کنترول کلاک AVR

[HIGHLIGHT=#00b0f0]همه واحدهای تحت کنترولر میکروکنترولر،با فرکانس یا کلاک فعالیت خود را شروع و محاسبات لازمه را انجام میدهند. در واقع به کمک همین کلاک هاست،که 0 و 1 در سی پی یو و دیگر واحد به وجود و محاسبه میشود.   که کمی قبل تر هم توضیحات ارائه کردیم،میکروکنترولر های AVR اغلب به فرکانس 20 تا 16 مگاهرتز فعالیت می کنند(نهایت فرکانس کاری). که با هر کلاک کاری می توان دیتا های مختلفی را به وجود اورد!
اما اینطور نمی شود،که هر واحد،هر میزان که دلش بخواهد،کلاک یا فرکانس را به خودش اختصاص دهد. برای همین به کمک واحد کنترول کلاک AVR ، هر واحد (یا مجموعه واحدها) به میزان مشخصی (که کارخانه تایین کرده) فرکانسشان را دریافت می کنند (که البته برنامه نویس می تواند فرکانس هر واحد را قطع و وصل کندتصویر   که در تصویر بالا می بینید، واحد کنترول کلاک AVR ، برای هر واحد از میکروکنترولر، یک خط کلاک تایین کرده و کلاک کاری برایش ارسال می کند.   یک نکته در تصویر بالا نامشخص است، واحد کنترول کلاک AVR ، وظیفه اش کنترول کلاک سیستم می باشد،اما این کلاک خودش از کجا تهیه میشود؟!!!!  منابع کلاک (یا نوسان سازی) در میکروکنترلر  AVR به طریق مختلف کلاک خود را تامین می کند،که برای میکروکنترولر های Avr ،مجموعا 5 روش می باشد.
لازم به ذکر است،واحد منبع کلاک درون میکروکنترولر وجود دارد،که ما باید به کمک برنامه نویسی و به کمک فیوزبیت ها(که،انشالله بعد اشنا خواهید شد) آن را برای میکرو مشخص کنیم. تصویر  ما به ترتیب از سمت راست انها را معرفی می کنیم:  
  Calibrated Rc Oscillator - اسیلاتور کالیبره داخلی.  به صورت دیفالت و پیش فرض (کارخانه ی) میکروکنترولر از این اسیلاتور یا نوسان ساز (داخلی خود)، استفاده می کند .   نوسان ساز می تواند با فرکانس 1 تا 8 مگاهرتز ، کلاک ، میکروکنترولر را تامین کند. دقت این اسیلاتور تا حدود زیادی خوب می باشد. اما! برای پروژه های ، با دقت (مثل ساعت و ارتباط سریالی (usart) و .. )درصد خطایی دارد.  پس اسیلاتور داخلی بیشتر برای کارهایست که دقت برایمان چندان مهم نیست! می باشد .  Low-frequency Crystal Oscillator - اسیلاتور فرکانس پایین.   که از نامش پیداست،به کمک این واحد از منبع کلاک. ما می توانیم فرکانس پایین درست کنیم .  در دنیایی الکترونیک به کمک کریستال 32.768 کیلوهرتز می توان یک ساعت دقیق ساخت. اگر همین الان ساعت های مچی و دیواری و .. را ببینید،همگی از یک کریستال 32.768 کیلوهرتزی استفاده می کند.  ما با وصل کردن یک کریستال 32.768 کیلوهرتزی به میکروکنترولر می توانیم ثانیه ی ،دقیق و قابل قبول درست کنیم .   ما به کمک اسیلاتور فرکانس پایین می توانیم زمان سنج دقیق درست کنیم.  تصویر  کریستال 32.768 کیلوهرتزی  CrystalOscillator -اسیلاتور خارجی .   توان به این واحد از منبع کلاک. کریستال خارجی وصل کرد .   همانطور که قبلا هم گفتیم. اسیلاتور داخلی خود میکروکنترولر چندان دقیق نمی باشد و سرعت ان نهایت 8 مگاهرتز می باشد.  ما می توانیم به کمک این واحد، کریستال مد نظر خودمان را (از 1 تا 16 مگاهرتز) وصل کنیم، و دقت میکروکنترولر خودمان را تقریبا به حالت ایده ال(یا همان بسیار خوب ) برسانیم!  تصویر  کریستال 8 مگاهرتز    تصویر  وصل کردن کریستال 16 مگاهرتز به میکروکنترولر atmega8  External Clock- نوسان سازی با کلاک خارجی   کمک این واحد (که کمتر مورد استفاده قرار می گیرد) می توان یک کلاک غیر از کلاک (کریستالی) وصل کرد .  (*معمولا در تنظیم فیوزبیت ها،کاربران تازه کار، این فیوزبیت را با اسیلاتور خارجی اشتباه می گیرن و میکروکنترولر را بر رویش تنظیم می کنند،در نتیجه میکروکنترولر به حالت کما! می رود،که برای رفع ان باید به کمک یک میکروکنترولر دیگر یک کلاک 1 مگاهرتزی تولید کرد و به میکروکنترولر داد)  External RC Oscillator- استفاده از نوسان ساز RC خارجی.   واحد نیز کمتر مورد استفاده قرار می گیرد.   این واحد به کمک خازن و مقاومت، کلاک سیستم تهیه میشود .  چند اصطلاح به کار رفته در مقاله:  نوسان ساز:نوسان ساز به انگلیسی Oscillator (اسیلاتور) یک مدار الکتریکست که می تواند یک موج سینوسی و یا مربعی تولید کند.  نوسان سازی:تولید فرکانس یا موج را نوسان سازی می گویند.  کریستال: به انگلیسی (Crystal)، یک قطعه الکتریکیست که از ماده کریستال کوارتز به وجود اماده است.کریستال،توانایی دارد،موج ها بسیاری دقیق و ایده ال برای نوسان سازی تولید کند( کوارتز یک جور خاصیتی دارد،که وقتی جریان برق از درونش رد میشود،ان را تبدیل به موج می کند.از این قابلیت می توان برای ساخت ان فرکانس ها استفاده کرد)  . 

تشکر تصویرتصویرتصویرتصویرتصویرتصویرتصویرتصویرتصویرتصویرتصویرتصویرتصویرتصویرتصویرتصویرتصویر

Colonel II
Colonel II
نمایه کاربر
پست: 7170
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9217 بار
سپاس‌های دریافتی: 21336 بار
تماس:

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(نمایش عدد،7سگ

پست توسط sinaset » دو شنبه 13 آذر 1396, 1:14 pm

سلام به همگی
ممنون و تشکر از نظرات خوب شما.
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 7170
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9217 بار
سپاس‌های دریافتی: 21336 بار
تماس:

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(نمایش عدد،7سگ

پست توسط sinaset » پنج شنبه 23 آذر 1396, 9:07 am

بنام خدا
باسلام

لطفا هرکس از مباحث قبلی که مطرح شده،سوال یا .. دارید مطرح کند.تا انشالله مدتی بعد،مباحث جدیدتر رو اغاز کنیم.
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 7170
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9217 بار
سپاس‌های دریافتی: 21336 بار
تماس:

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(نمایش عدد،7سگ

پست توسط sinaset » شنبه 25 آذر 1396, 8:45 am

بنام خدا
باسلام

مرور بر مباحث کمی قبلی

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

در اینجا متوجه شدیم،می توانیم با پایه ها پورت (که معمولا، در مجموع 8 پایه (وبعضی پورت ها،کمتر )) هستن،حالت ها مختلفی را به وجود بی اوریم .

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

گفته شده،هر پایه میکروکنترولر تقریبا می تواند سرعتی بین 100 تا 1 مگاهرتز در ثانیه داشته باشد! (بسته به فرکانس میکروکنترولر ) (البته این امار تقریبی اینجانب می باشد! البته بدون ازمایش!)

ازمایش سرعت پایه های میکروکنترولر
 تصویر 

برای اینکه بتوانید بفهمید پایه میکروکنترولر چه سرعتی دارند


ابتدا DDRB.0=1 و PORTB.0=1 قرار دهید (در تابع اصلی،قبل از شروع حلقه) سپس اینطوری بنویسید.

(while(1
}
PORTB.0=1
;(delay_us(1
PORTB.0=0
{
*البته بهتر است،یک بار بدون تاخیر delay بنویسید و امتحان کنید،اگر جواب نگرفتید،تاخیر را قرار دهید.

سپس به کمک فرکانس متر(که بعضا مولتی متر ها ان را دارند) اندازه بگیرید ببینید چه سرعتی به شما میدهد ! (و در فرکانس ها مختلف ان را ازمایش کنید.
--
نحویه خواندن دستورات در میکروکنترولر

همانطور که قبلا به شما گفتیم،میکروکنترولر،توسط واحد به Program Counter یا PC یا شمارش گر برنامه .. (در صفحه 2 توضیح داده شده) . تک تک خط برنامه را به نوبت می خواند و اجرا می  تصویر 


که گفته شده،تقریبا برای خوانده هر یک دستور حدود 1 میکروثانیه طول میکشد!

تاثیر واحدهای درونی میکروکنترولر
 تصویر  مطالب چند خط بالاتر (سرعت پورت ها) و نحویه خواندن و واکشی دستورات را اکنون در ذهن مرور کنید،متوجه میشوید،میکروکنترولر یک ضعف دارد! و ان این است،که شاید گاهی وقت ها نیاز باشد،خیلی فوری یک دستوری زودتر خوانده شود،شاید نیاز باشد بلافاصله اگر روی پایه از پورت اتفاق افتاد،میکرو متوجه شود و دستورات مطابق با ان را اجرا کند
یا حتا شاید نیاز باشد،با یک ایسی کار کرد،که نیاز به 2 یا 4 یا .. مگابیت سرعت باشد!

این ضعف ها رو میکروکنترولر،به کمک واحدهای درونیش مثل تایمر،اینتراپت،SPIیا USART و ... می توان پوشش داد!

مثلا فرض کنید یک مدار محافظه برای یک دستگاه ساخته شده!می خواهیم بعد از اندازه گیری ولتاژ،اگر ولتاژ از میزان مشخص شده بیشتر باشد! بلافاصله،میکرو دستگاه را خاموش کند! ما برای حل مشکل می توانیم از اینتراپت ها یا حتی تایمر ها استفاده کنیم،چرا؟!

واحد های درونی میکروکنترولر در واقع به نوعی یک ایسی می باشند! ایسی ها که خودشان به صورت مستقل کارشان را انجام میدهند! فرض کنید به واحد تایمر می گوییم،تا 100 میلی ثانیه بشمار و بعد ما را مطلع کن! وقتی برنامه به خط که برنامه راه اندازی اولیه برای تایمر نوشته شده،رسید.تایمر کارش را شروع میکند،میکرو نیز به سراغ باقی دستورات می رود و انها را اجرا می کند! این درحالی می باشد،که تایمر نیز در حال محاسبه و انجام کارهای خود به صورت مستقل می باشد!

یا فرض کنید،می خواهید،با یک قطعه،که البته رابط SPI هم دارد(یک نوع رابط رد و بدل کردن اطلاعات می باشد).با سه پایه با برنامه نویسی،اطلاعات را بگیرید یا ارسال کنید! فرض کنید می خواهید حروف ABCD را برای ایسی ارسال کنید! حال باید یک برنامه خیلی قوی نوشته شود،تا پایه های میکروکنترولر خودشان را براساس ،رابط ان ایسی در بی اورند! یعنی طوری پایه ها خودشان را به موقع خاموش و روشن کنند،که ایسی مقابل متوجه ان شود! خوب بعد از کلی برنامه نویسی و .. حروف ABCD رو ابتدا میکروکنترولر می گیرد،سپس پایه های خروجی را برارسال اطلاعات اماده میکنند،برای هر پروسس زمان زیادی تلف می شود!(که پایه در 1 میکرو ثانیه خاموش،سپس روشن و ..)در نهایت نیز با سرعت نسبتا کم،اطلاعات فرستاده میشود! اما! حال فرض کنید ما از رابط SPI استفاده کنیم(ایسی درونی!). حروف ABCD را برای واحد می فرستیم! سپس میکرو به سراغ باقی دستورات میرود،SPI نیز دستورات را با سرعت بالا می فرستد!

واحدها،در سرعت انجام دادن،کارها بسیار تاثیرگذارهستن،مخصوصا درجایی که نیاز به پروسس و پردازش بالا است! و می تواند بارها پردازشی زیادی را از سی پی یو بردارند،یا به کمک وقفه ها واحدها،سرعت عمل میکروکنترولر را افزایش بدهند
*لازم به ذکر است،در میکروکنترولر پیشرفته تر مثل ARM ، از واحد به نام DMA استفاده میشود،این واحد،به نوعی باعث شده،که نسب سیستم عامل به روی میکروکنترولر اسان تر شود! چون به کمک این واحد دیگر نیازی نیست،واحدها و .. به کمک سی پی یو اطلاعات رم را بخواند!خودشان مستقیم به کمک DMA می روند و اطلاعات را بر می دارند!که این خود بسیار بسیار به افزایش سرعت سی پی یو و راندمان کاری ان،کمک می کند.


انشالله ادامه خواهد داشت...
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 7170
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9217 بار
سپاس‌های دریافتی: 21336 بار
تماس:

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته

پست توسط sinaset » یک شنبه 26 آذر 1396, 3:03 pm

بنام خدا
باسلام


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

واحدهای میکروکنترولر!

پس واحدهایی میکروکنترولر،به نوعی باعث ارتقاء توانایی هایی یک میکروکنترولر میشوند! البته لازم به ذگر همیشه اینطور نیست،که واحدهایی میکروکنترولر برایمان مفید باشد! فرض کنید،می خواهیم یک LED چشمک زن ساده بسازیم،خوب واحدهایی درونی میکروکنترولر در این طرح ها،کاریی ندارند!

یا نه،فرض کنید،می خواهید،یک فایل ویدئویی را با سرعت بالا روی LCD نمایش دهید! خوب با یک میکروکنترولر معمولی 8 بیتی! حتی اگر واحدهایی ان پیشرفته باشد! این کار مشکل است! چون نیاز به محاسبات زیاد دارد! (حال مگر اینکه،خود LCD ، ایسی پیشرفته داشته باشد،که مجهز به کتابخانه ها گرافیکی درونی باشد! تا ما فقط دستورات را بفرستیم،ان خودش اجرا کند!)

شروع مبحث اینتراپت ها(وقفه) interrupt

وقفه ها امروزه بسیار پرکاربرد هستن! اصول اصلی وقفه این است،که وقتی اتفاقی افتاد،فوری سی پی یو رو خبر کند! سپس نیز بعد از خواندن خط برنامه نویسی(اخرین خط برنامه نویسی که به ان رسید و ان را تمام کرده) به سراغ اینتراپت می رود و کدهایی ان را بررسی می کند
 تصویر   مثال بالا ببینید،وقتی موس کامپیوتری کاری می کند،بلافاصله،سی پی یو رو خبر می کند،سی پی یو نیز بلافاصله،کدهایی مربوط به ان وقفه را بررسی و دستورات لازمه را اجار می کنید..   دیگر نیز برای بررسی اینتراپت ها وجود دارد،که معمولا کمتر استفاده میشود! چون در این روش منابعی بیشتر برای بررسی وقفه ها انجام میشود!  تصویر   poling،در این روش،خود سی پی یو بررسی می کند،ببینید وقفه صورت گرفته یا که خیر! از این روش،برای زمانی استفاده میشود،که نیاز است،خیلی سریع بررسی شود،که وقفه صورت گرفته یا که خیر! در روش همانجور که گفته شد،سی پی یو زیاد استفاده میشود!   خواندن دستورات در اینتراپت ها به مانند شکل زیر می   تصویر   سی پی یو در حال خواندن دستورات اصلی می باشد!بلافاصله بعد از اینکه سیگنال اینراپت رسید ،به سراغ دستورات اینتراپت می رود،انها را می خواند،سپس بر می گردد و اخرین دستورات اصلی بعدی را می خواند و اجرا می کند.   بیشتر واحد میکروکنترولر،یک اینتراپت نیز دارند،به غیر این ،خود میکروکنترولر چندپایه اش قابلیت اینتراپت نیز دارند!یعنی می تواند به کمک سیگنال های بیرونی که به ان ارسال میشوند،یک حلقه وقفه (مختص به ان پایه) را اجرا و کدهاش رو پردازش کند .  انشالله ادامه خواهد داشت.  . 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 7170
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9217 بار
سپاس‌های دریافتی: 21336 بار
تماس:

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته

پست توسط sinaset » سه شنبه 28 آذر 1396, 2:25 pm

بنام خدا
باسلام


ادامه مبحث وقفه ها

اگر بخواهیم مثالی برای درک بهتر وقفه ها بزنیم،وقفه ها مثل این می مانند،که شخصی در خانه خودش مانده کارهای خودش رو انجام میدهد (* CPU) ، ان وقت،وقتی بسته پستی برایش بیاید،اداره پست،ان را به درب خانه اش می اورد! (بجایی انکه،خودش دائم زنگ بزند و پرسجو کند)

 تصویر   میکروکنترولر AVR همانجور که گفته شد،بیشتر واحد وقفه نیز دارن! اما چند پایه نیز وجود دارد،که می تواند با سیگنال ها که از بیرون داده میشوند! می تواند سیگنال وقفه مختص به خود را برای سی پی یو ارسال کنند.  تصویر   بالا،پایه های مربوط به وقفه ها خارجی در میکروکنترولر ATMEGA8    همانطور که در تصویر می ببینید INT0 و INT1 دو پایه وقفه هایی خارجی میکرکنترولر می باشند.    ها،همیشه در یک تابع جداگانه،خارج از تابع ها فرعی و اصلی نوشته میشوند! و تابع،هر وقفه،با یک نام بخصوص مشخص میشوند.میکروکنترولر نیز بعد،از اینکه یک سیگنال وقفه ارسال میشود،ان تابع را بلافاصله بررسی می    عنوان مثال،تابع مربوط وقفه شماره 0 میکروکنترولر ATmega8 (*کد ویزارد ،کدویژن خودش کدها مربوط را میسازد! و از این جهت نگرانی بخصوصی وجود ندارد) 

کد: انتخاب همه

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here

}



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

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

1- سیگنال زمین! (یعنی وقتی پایه وضعیتش 0 شود) .سیگنال وقفه ارسال  
2-لبه بالا رونده !rising edge( یعنی زمانی که خروجی کلاک در وضعیت سعودی یا بالا قرار دارد) .سیگنال وقفه ارسال  
3-لبه پایین رونده Falling Edge(یعنی زمانی که خروجی کلاک در وضعیت سقوط یا پایین قرار دارد) .سیگنال وقفه ارسال  

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

New Member
پست: 6
تاریخ عضویت: پنج شنبه 9 آذر 1396, 4:36 pm
سپاس‌های ارسالی: 50 بار
سپاس‌های دریافتی: 2 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته

پست توسط mohsen2017 » پنج شنبه 30 آذر 1396, 3:48 pm

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

Colonel II
Colonel II
نمایه کاربر
پست: 7170
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9217 بار
سپاس‌های دریافتی: 21336 بار
تماس:

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته

پست توسط sinaset » سه شنبه 5 دی 1396, 9:26 am

بنام خدا
باسلام

نحویه تنظیم وقفه خارجی در میکروکنترولر

میکروکنترولرها،برای کنترول واحدهایی درونی خودشان از یک سری ریجستر ها! که به نوعی تنظیمات ان واحد می باشد،استفاده می کنند! به کمک این ریجسترها،می توانید،بگوید،این واحد چگونه رفتار کند،یا چه قابلیت ها از خودش را فعال یا غیر فعال کند.

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

موضوع فرعی==> Regisiter یا ریجستر به زبان فارسی ثابت چیست؟!

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

ثابت به صورت هشت بیتی هستن! که قابلیت اعمال تغییرات به روی انها وجود دارد! معمولا میکروکنترولر،قبل از شروع به کار و در تابع اصلی (یا در کتابخانه ها ابتدایی) واحدهایی خودش را به اساس ان تنظیم می کند.

در نرم افزار کدویژن،ریجسترهای مربوط به واحد ها با هم نام و مشخصات (که در دیتا شیت قید شده) وجود دارند و لازم نیست انها را تعریف کنیم،بلکه فقط باید انها را مقدار دهیم کنید.به عنوان مثال ریجسترهای مربوط به وقفه خارجی در ATMEGA8 با نام های GICR و MCUCR و GIFR هستند
*لازم به ذکر است،خود نرم ازار کدویزارد AVR کم دست می باشد، و می توان تقریبا همه واحد میکروکنترولر را به صورت گرافیکی مقدار دهی کرد!(البته به صورت گرافیکی مقدار دهی میشود،در پایان کدهایی مربوط تحویل دهد میشود)که خود این مسئله باعث میشود کد نویسی بسیار اسان تر و سریع تر شود .

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

ریجسترهای وقفه خارجی میکروکنترولر ATMEGA8 :

ریجستر GICR :
 تصویر 
این ریجستر 8 بیتی می باشد! منتها فقط 2 بیت اخر ان مورد استفاده قرار می گیرد!
به کمک این ریجستر می توانید وقفه خارجی شمار0 و 1 را فعال کنید! نام بیت شماره 6 این ریجستر INT0 می باشد (که با یک کردن ان،وقفه شماره 0 فعال میشود) و نام بیت شماره 7 ان INT1 (که با یک کردن ان،وقفه شماره 1 فعال میشود).

در نرم افزار کدویژن در منو اصلی،به عنوان مثال اگر بخواهیم ، وقفه شماره 0 را فعال کنیم،باید ان را اینطور بنویسیم

کد: انتخاب همه

GICR|=(0<<INT1) | (1<<INT0);

*خود نرم افزار کدویژن در نسخه ها جدید کدها را به مانند مثال بالا کرده است،برای راحتی و درک بهتر از کدها


ابتدا کد یعنی GICR|= ،ریجستر مورد نظر را تعریف کرده ایم،و ان را اماده گرفتن کدهایی بیت کرده ایم،سپس در بین پرانتز INT1 را شیفت به 0 و INT0 را شیفت به 1 کرده ایم،که با این کار وقفه شماره 0 فعال میشود!


ادامه دارد.
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 6
تاریخ عضویت: پنج شنبه 9 آذر 1396, 4:36 pm
سپاس‌های ارسالی: 50 بار
سپاس‌های دریافتی: 2 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته

پست توسط mohsen2017 » شنبه 9 دی 1396, 9:29 pm

سلام و ممنون منتطر ادامه مطالب هستیم...
همچنین لطفا با مثال مطالب رو آموزش بدید

Colonel II
Colonel II
نمایه کاربر
پست: 7170
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9217 بار
سپاس‌های دریافتی: 21336 بار
تماس:

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته

پست توسط sinaset » یک شنبه 10 دی 1396, 10:30 am

بنام خدا
باسلام

البته چون هنوز مباحث ابتدایی می باشد،مثال هنوز زده نمی شود! تا مباحث پایه تمام شود،مثال ها نیز زده میشود!

ادامه ..

ریجسترها یا به فارسی ثابت ها! همانطور که گفته شده،تنظیمات یا setting هر واحد هستن! هر واحد ممکن است،چندین ریجستر داشته باشد! تا به کمک ان بتوان قابلیت هایی ان واحد را تنظیم یا فعال سازی کند! ریجستر ها هر کدام 8 بیتی هستن! هر ریجستر با یک نام مشخص شده است! و تقریبا هر بیت یک ریجستر نیز یک نام نیز دارد! که به کمک ان نام ها قابلیت هایی ان ریجستر معرفی شده است! در نرم افزار کدویژن نیز این ریجستر و ادرس ها بصورت پیش فرض در نرم افزار ذخیره شده است، و شما فقط نام ان ریجستر و مقدار بیت مد نظر را بنویسید،تنظیمات اعمال خواهد شد!

ریحستر MCUCR با نام کامل MCU Control Register
 تصویر 
این ریجستر کارش تنظیم،سیگنال دریافتی و واکنش دادن وقفه! لازم به ذکر است ISC00 , ISC01 مربوط به دو بیت وقفه شماره 0 و ISC10 ،ISC11 مربوط به وقفه شماره 1 می باشد!

در واقع هر وقت بخواهیم نحویه تنظیم سیگنال دریافتی به وقفه شماره 0 رو تنظیم کنیم به سراغ ISC00 , ISC01 می رویم، و هر وقت بخواهیم سیگنال دریافتی به وقفه شماره 1 را تنظیم کنیم به سراغ ISC10 ،ISC11 می رویم . و تنظیمات این دو دقیقه شبیه به هم می باشند! چون هر دو 4 حالت مشخص دارند!
 تصویر   شکل بالا نشان داده شده است! وقتی ISC00 , ISC01 هردو 0 باشند! یعنی اگر به پایه شماره 4 سیگنال 0 یا زمین برسد! یک وقفه شکل می گیرد! در واقع در این روش،یک مقاومت 4.7 تا 10 کیلواهم از +5 ولت به پایه شماره 4 (وقفه صفره) اتصال داده میشود،تا پایه مربوط همیشه،در وضعیت 1 باشد، سپس یک کلید(به عنوان مثال!) نیز به روی پایه گذاشته میشود و (و طرف دیگرش نیز به GND یا زمین اتصال داده میشود) تا وقتی کلید زده شود، یه سیگنال GND ارسال شده و عمل وقفه انجام گیرد !  
  وقتی 1=ISC01=0 ISC00 باشد، با هر تغییری یک وقفه صورت می گیرد! چه GND صورت بگیرید چه VCC شود! به عبارتی بهتر،وقتی در ابتدا GND است سپس VCC میشود،یک وقفه صورت می گیرد،وقتی از دوباره از VCC به GND می رود،بازهم یک وقفه صورت می گیرد! پس با هر تغییر یک وقفه صورت می   وقتی 0=ISC01=1 ISC00 باشد، وقتی کلاکی که به پایه وقفه ارسال میشود،در شکل موج پایین رونده باشد!یعنی به محض اینکه،کلاک فرستده میشود،وقفه صورت می   وقتی 1=ISC01=1 ISC00 باشد، وقتی کلاکی که به پایه وقفه ارسال میشود،در شکل موج بالا رونده باشد! یعنی وقتی کلاک زمانی که در شکل موج بالا رونده قرار می گیرد،وقفه صورت می گیرد.   وقفه شماره 1 و دو بیت تنظیم شونده ان ISC10 ،ISC11 درست وضعیتشان به مانند ISC01 ،ISC00 می باشد!   طور کلی به کمک این چهار بیت می توانید،تنظیمات مربوط به سیگنال دریافت وقفه را تنظیم کنید ..  ادامه دارد ..  . 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 7170
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9217 بار
سپاس‌های دریافتی: 21336 بار
تماس:

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته

پست توسط sinaset » یک شنبه 17 دی 1396, 9:53 am

بنام خدا
باسلام


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

ریجستر GIFR با نام کامل General Interrupt Flag Register (ریجستر پرچم وقفه )
 تصویر 
FLAG یا پرچم،در ثبات،یک نوع اعلام امادگی می باشد! معمولا واحد های مختلف میکروکنترولر از Flag زیاد استفاده میکنند، FLAG یا پرچم این واحد قابل خواندن و نوشتن می باشد(یعنی هم می توان مقدار ان را خواند و هم اینکه ان را تغییر داد)
ما به کمک این ریجستر،اینتراپت وقفه ها را فعال یا غیر فعال میکنم! حتما می پرسید فرق ان با GICR چیست؟! GICR خود وقفه ها را فعال یا غیر فعال می کرد! اما این ریجستر،پرچم اینتراپت شدن را فعال میکند،تا به محض اینکه،پرچم های GIFR ، یک تابع وقفه فعال شود!
*اگر ریجسترهای GIFR فعال نشود،وقفه ها فعال هستن،منتها تابع وقفه ها اجرا نمی شوند!.

همانطور که در تصویر می ببینید،این ریجستر دو بیت قابل استفاده دارد،که بیت 6 و 7 می باشند،باقی ریجستر خالی می باشد و غیرقابل استفاده!

بیت INTF0 برای فعال سازی پرچم وقفه 0
بیت INTF1 برای فعال سازی پرچم وقفه 1

خوب بهتر است،به سراغ یک مسائل عملی برویم :

فعال سازی وقفه شماره 0 با سیگنال زمین یا GND
ابتدا ریجستر فعال سازی وقفه را اینطور مقدار دهی می کنیم

کد: انتخاب همه

GICR|=(0<<INT1) | (1<<INT0);   //فعال سازي وقفه شماره 0

*برای مقدار دهی ریجستر،نام ریجستر نوشته میشود،سپس همانطور که در مثال بالا می ببینید،بیت فعال ساز مد نظر 1 درجه شیف داده میشود! در این مثال INT0 به 1 شیفت داده شده.
سپس : (جدول که پست بالا معرفی شده را ببینید)

کد: انتخاب همه

MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);   //مد وقفه 0 در وضعيت سيگنال زمين

سپس:

کد: انتخاب همه

GIFR=(0<<INTF1) | (1<<INTF0);  //پرچم وقفه شماره 0 فعال


همیشه برای استفاده از وقفه ها،باید قبل از شروع چرخه (یا عملیات مد نظر!) با دستور

کد: انتخاب همه

 #asm("sei")

قابلیت وقفه جهانی! میکروکنترولر را فعال کنید! وگرنه وقفه ها صورت نمی گیرند
پس دستور("asm("sei# باعث میشود،میکروکنترولر بفهمد،وقفه های قراراست صورت بگیرد و خود را اماده کند! (برای هر وقفه در هر واحدی،این دستور باید نوشته شود) تصویر اما خود برنامه!
برنامه بدین شکل است که یک مقاومت 10 کیلواهم از پایه VCC به پایه وقفه شماره 0 وصل شده تا ان را در وضعیت HIGH یا 1 ببرد، پایه کلید فشاری نیز به GND وصل شده است.
در تابع وقفه نیز دستورات زیر نوشته شده است :

کد: انتخاب همه

interrupt [EXT_INT0] void ext_int0_isr(void)   //تابع وقفه 0
{
/*
زماني که وقفه 0 (پرچم وقفه فعال ميشود)اين تابع فعال شده
و کدهايي ان بررسي ميشود
*/
PORTB.0=!PORTB.0;      //وضعيت ال اي دي برعکس شود
delay_ms(500);         //زمان تاخير
}

و LED نیز به پایه PORTB.0 وصل شده است.و دستور PORTB.0=!PORTB.0 نیز در تابع نوشته شده(این دستور هر بار اجرا شود،وضعیت را معکوس میکند،یعنی اگر پایه portb.0 برابر با 0 باشد،ان را 1 میکند،اگر 0 باشد ان را یک میکند!)
وقتی کلید فشرده شود،وضعیت GND میشود،و یک وقفه صورت می گیرد، و LED روشن میشود،اگر یک بار دیگر فشرده شود و رها شود، LED خاموش میشود! و همین چرخه ادامه پیدا می کند.

کدها:

کد: انتخاب همه

/*******************************************************
Project : learn-6
Date    : 1396.10.17
Author  :  sinaset
centralclubs.com

-->روشن کردن ال اي دي با وقفه شماره 0<--

ATMEGA8:ميکروکنترولر مورد استفاده
1MHZ:فرکانس کاري ميکروکنترولر
*******************************************************/
#include <mega8.h>     //کتابخانه ميکروکنترولر
#include <delay.h>     //کتابخانه تاخير

interrupt [EXT_INT0] void ext_int0_isr(void)   //تابع وقفه 0
{
/*
زماني که وقفه 0 (پرچم وقفه فعال ميشود)اين تابع فعال شده
و کدهايي ان بررسي ميشود
*/
PORTB.0=!PORTB.0;      //وضعيت ال اي دي برعکس شود
delay_ms(500);         //زمان تاخير
}

void main(void)      //تابع اصلي که هميشه بايد تعريف شود را تعريف مي کنيم
{ //پرانتز آغاز کدهايي تابع اصلي

DDRB=0xFF;    // همه پايه هاي پورت بي به صورت خروجي تعريف شده اند
PORTB=0x00;   //قرار مي دهيمGNDهمه پورت در وضعيت صفر يا همان

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: Off
GICR|=(0<<INT1) | (1<<INT0);   //فعال سازي وقفه شماره 0
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);   //مد وقفه 0 در وضعيت سيگنال زمين
GIFR=(0<<INTF1) | (1<<INTF0);  //پرچم وقفه شماره 0 فعال

#asm("sei")   //فعال سازي وقفه جهاني خود ميکروکنترولر
//اين دستور هميشه بايد نوشته شود،وگرنه وقفه ي صورت نمي گيرد

while (1) //!و بعد شرط حلقه،که در اينجا 1 گذاشته شده و حلقه تا بي نهايت مي چرخد،whileتعريف چرخه
    {  //while آغاز چرخه   

        //ما در اين برنامه براي درک بهتر مثال،در چرخه بي نهايت چيزي نمي نويسيم


    }  //while انتهايي چرخه 
   
}  //پرانتز انتها کدهايي تابع اصلي


[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]مثال (همراه با کد و شبیه ساز)
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

ارسال پست

بازگشت به “آموزش و مثال‌ها AVR”