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

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

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

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

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

New Member
پست: 2
تاریخ عضویت: سه شنبه 19 دی 1396, 9:28 am
محل اقامت: tehran
سپاس‌های دریافتی: 2 بار
تماس:

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

پست توسط kourosh E big110 » سه شنبه 19 دی 1396, 10:10 am

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

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

بهتر است کم کم شروع کنیم و وارد جزییات کامپیوتر کوچک پر سر و راز شویم .

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

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


ابتدا حافظه EEPROM (قسمت اول)

مخفف کلمه Electrically Erasable Programmable Read-Only Memory پاک سازی با ولتاژ و قابلیت خواندن و نوشتن .

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

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

این ایسی می تواند اطلاعات را در درون خود ذخیره کند و همچنین می توادند این اطلاعات را بخواند.(یعنی هم قابلیت خواندن دارد و هم ذخیری سازی)

بطور کلی و عمومی میکروکنترولر مقداری حافظه EEPROM دارن که بسته به مدلشان این حجم از 64 بایت تا 4کیلوبایت (و کمی بیشتر) متغییر است(در خانواده AVR). که البته اگر شخصی بیش از نیاز داشته باشد،باید ایسی ان را تهیه کند(ایسی ان هم نسبتا ارزان قیمت هستن،)

باهم دیگر حافظه EEPROM میکروکنترولر MEGA32 را بررسی کوتاه میکنیم.

این حافظه در این قسمت از میکروکنترولر مگا32 قرار داده شده: تصویر  تصویر   یکی از گذرگاه های ارتباطی میکروکنترولر می باشد ، و میکرو به راحتی می تواند به ان ارتباط برقرار   و مشخصات فنی ان :  تصویر   که می ببینید، حافظه EEPROM مگا 32 حدود 1024 بایت یا به عبارتی ساده تر 1 کیلوبایت می باشد(هر 1024 بایت می شود 1 کیلوبایت)  یک نکته مهم دیگر که باید در رابطه با حافظه EEPROM بدانید، این است که یک چرخه برای پاک و نوشتن اطلاعات دارد،که بعد از ان دیگر حافظه خراب میشود و قابلیت نوشتن و پاک کردن را از دست میدهد. همانجور که بر روی تصویر قید کردیم،برای این حافظه،حدود 100 هزاربار چرخه نوشتن و پاک کردن می باشد( 100 هزاربار کامل حافظه پر شود و سپس خالی شود)که این البته فقط مربوط به حافظه EEPROM نیست بلکه بیشتر حافظه های دیجیتال امروز چنین مشکلی را دارن . 
و در پایان نیز این حافظه می تواند تا 100 سال اطلاعات خود را نگه دارد (که این البته در نوع خود بی نظیر است!)

ایا این میزان حافظه کم نیست؟!
(ادامه دارد...)
باتشکر.

New Member
پست: 2
تاریخ عضویت: سه شنبه 19 دی 1396, 9:28 am
محل اقامت: tehran
سپاس‌های دریافتی: 2 بار
تماس:

سورپرایز AVR

پست توسط kourosh E big110 » سه شنبه 19 دی 1396, 10:19 am

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

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

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

پست توسط sinaset » سه شنبه 19 دی 1396, 1:51 pm

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

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

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

پست توسط sinaset » چهار شنبه 27 دی 1396, 9:46 am

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


ادامه مبحث وقفه
وقفه با پالس پایین رونده! تصویر 

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

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

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


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

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

/*******************************************************
Project : learn-7
Date    : 1396.10.27
Author  :  sinaset
centralclubs.com

-->روشن کردن ال اي دي با پالس پايين رونده<--

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

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

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

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

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

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

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

       
      if(PIND.2==1 && PORTB.0!=0) PORTB.0=0;  //کدي براي خاموش کردن ال اي دي در وضعيت که پالس در وضعيت معمولي است
      //دانستن دستور بالا چندان مهم نمي باشد،بيشتر مسئله پالس پايين رونده مهم مي باشد و وقفه که ايجاد مي کند

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


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

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

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

پست توسط sinaset » سه شنبه 3 بهمن 1396, 10:17 am

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

ادامه مبحث...

بهتر است خود مثال هایی وقفه را انجام دهد و در شرایط مختلف ان را ازمایش کنید!

خودم نیز،در گذشته ازمایشاتی داشتم،به این نتیجه رسیدم،وقفه ها واکنش نسبتا سریعی دارند! اما نه به ان شکل که شاید تصور میشود!(دستورات برنامه باید درست نوشته شوند!)

فرض کنید،شما دستور 500 میلی ثانیه،تاخیر در تابع اصلی while داده باشید،در همان لحظه (یعنی زمانی که هنوز 500 میلی ثانیه تاخیر تمام نشده و تازه ابتدا ان می باشد) یک اینتراپت صورت بگیرید،در این لحظه،برنامه صبر میکند،تا 500 میلی ثانیه (یا اخرین دستور!در حال اجرا) تمام شود، سپس وارد تابع وقفه میشود!

که این البته خوب نیست! و در زمان کد نویسی و مخصوصا جاهایی که نیاز است،کارها دقیق انجام شود،باید دقت شود،دستورات به چه شکل در برنامه نوشته شده است !

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

فرکانس شمار!

از کارهایی که می توان به کمک وقفه ها انجام داد،شمارش، پالس یا فرکانس ها می باشد! تصویر  مثال البته کمی پیشرفته! به کمک تایمر کانتر و وقفه (مد پایین رونده) فرکانس 2100 هرتزی (2.1 کیلوهرتزی) شمارش میشود (*البته این برنامه فرکانس شمار نوشته شده، می تواند از 1 هرتز تا بیشتر از 2100 هرتز را شمارش کند!) .
قصد نداریم،وارد جزییات مثال شویم!چون از تایمر کانتر استفاده کردیم! (و هنوز مبحث تایمر ها شروع نشده است) .همچنین از LCD کارکتری استفاده کردیم(که هنوز مبحث ان را شروع نکرده ایم) قصد از معرفی مثال،درک بهتره قابلیت هایی وقفه ها می باشد!

ما در این طرح از تایمر استفاده کردیم،یعنی تایمر هر 1 ثانیه یک بار،اور فلو میشود و تابع وقفه اش اجرا میشود. سپس متغیر count که در درون وقفه می باشد،مقدارش خوانده میشود و به روی LCD نمایش داده میشود.
*توضیح از یک بعد دیگر:متغیر Count درون تابع وقفه شماره 0 قرار دارد.هر بار که پالس برای وقفه ارسال میشود،مقدارش افزایش پیدا می کند.تا اینکه به 1 ثانیه برسد! وقتی به 1 ثانیه رسید مقدارش خوانده میشود و به روی LCD نمایش داده میشود.
*واحد سنجش فرکانس هرتز در ثانیه می باشد! برای همین تایمر 1 ثانیه می باشد! وقتی گفته میشود فرکانس 2100 هرتز است،یعنی در ثانیه 2100 موج مربعی تولید میشود و ارسال میکند.


در فایل برنامه،چند تولید کننده پالس قرار داده ام،بهتر است انها را هم استفاده کنید.
[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]شبیه ساز و برنامه.

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

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

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

پست توسط sinaset » چهار شنبه 11 بهمن 1396, 8:25 am

باسلام

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

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

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

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

پست توسط mohsen2017 » پنج شنبه 17 اسفند 1396, 6:43 pm

سلام
دوست عزیزادامه اموزش ها کی انجام میدید ان شالله؟

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

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

پست توسط sinaset » جمعه 18 اسفند 1396, 8:55 am

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

کاربر محترم، من تلاشم رو میکنم در حد توانم ادامه بدم..

مثال با وقفه در مد Any Change

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

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

if(PIND.2==0)    //در صورتي که پايه وقفه 0 بود دستور زير
{
      LCD_C(Bit_0,0);    //شکل کلاک 0
      lcd_gotoxy(x,0);   
      lcd_putchar(0); 
      
}
else if(PIND.2==1)   //درصورتي که پايه وقفه 1 بود دستور زير
{   
       LCD_C(Bit_1,1);   //شکل کلاک 1
      lcd_gotoxy(x,0);
      lcd_putchar(1);    
}
x++;
if(x>15)x=0,lcd_clear();


همانطور که گفته شد،با بالا و پایین رفتن کلاک، وقفه اجرا میشود! مثلا وقتی کلاک بالا است،وقفه یک بار اجرا میشود،وقتی از بالا به پایین می اید و صفر میشود،بازهم یک وقفه اجرا میشود و وقتی از دوباره بالا می رود و 1 میشود،یک وقفه اجرا میشود!
و در هر بار، تابع وقفه اجرا میشود ! حال ما در تابعه وقفه برای اینکه دستورات درست اجرا شوند! PIND.2 در وضعیت 0 و PIND.2 در وضعیت 1 استفاده میکنیم! PIND.2 در واقع، همان پایه وقفه 0 می باشد!
حال در برنامه می گویم ، هر وقت تابع وقفه اجرا شد! و وضعیت PIND.2 در وضعیت 0 بود شکل خروجی را در LCD بدین صورت __ نمایش بده، و هر وقت PIND.2 در وضعیت 1 بود شکل خروجی را در LCD بدین _|--|_ صورت نمایش بده .


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

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

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

پست توسط sinaset » یک شنبه 20 اسفند 1396, 8:50 am

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

ساخت اسیلوسکوپ ساده ! (مدل پیشرفته مثال قبل)

در ادامه،در این مثال به کمک وقفه 0 در مد Any Change (هر تغییری) و تایمر (که فعلا نیاز به دانستن ان ندارید) یک اسیلوسکوپ ساده ساخته میشود ..!

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

برای حل این مسئله باید،یک زمان سنج وجود داشته باشد، که هر لحظه بررسی کند،که شکل موج در چه شکلی می باشد! برای همین از تایمر خود میکرو برای حل این مسئله استفاده می کنیم.
 تصویر  که در تصویر می بینید،برنامه 6 کلید دارد! 6 کلید که می توان به کمک ان مقیاس اندازه گیری را نسبت به فرکانس ورودی انتخاب کرد!
برنامه 4 فرکانس اماده دارد،که به کمک سوئیچ ها می توان ان را برای پایه وقفه 0 انتخاب کرد !( که باید به صورت تک تک انتخاب شود!) این فرکانس ها 1 و 4 و 8 و 12 هرتز می باشد ! (و فرکانس چندان بالایی نیز نمی باشند!)

*مقیاس برای چیست؟!

شما یک موج 12 هرتزی انتخاب کرده اید! اگر مقیاس روی 300 یا 100 میلی ثانیه باشد! شکل موج کناره هم و کوچک به صورت بهم ریخته روی تصویر LCD نمایش داده میشوند، اما وقتی مقیاس میلی ثانیه کمتر میشود،به مرور موج ها بزرگ تر و مرتب تر و بهتر دیده میشوند !

مقیاس در واقع کار نمونه برداری ، از شکل موج ورودی را سریع تر انجام میشود برای همین شکل موج خروجی دقیق تر و بهتر خواهد بود

معرفی کد تابع وقفه

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

//کدهايي درون تابع وقفه 0،که به صورت کوتاه نوشته شده،تا سرعت برنامه افزايش پيدا کند
if(PIND.2==0)BIT=0;   //در صورتي وضعيت پايه 0 بود،متغير بيت را 0 کن

else if(PIND.2==1)BIT=1; //در صوري که وضعيت پايه 1 بود،متغير بيت را 1 کن


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

شرح کوتاه برنامه:
تایمر هر مدت یک بار ( براساس مقیاس که کاربر برای ان مشخص میکند) فعال میشود و یک نمونه، از وضعیت ، ورودی وقفه 0 درون متغیرBIT می ریزد،سپس درون برنامه،در حلقه While دستور Active_lcd فعال میشود و وضعیت BIT بررسی میشود،اگر BIT در وضعیت 1 بود، یک شکل موج بالا روی LCD نمایش داده میشود و اگر 0 بود یک شکل موج پایین به روی LCD نمایش داده میشود !
سپس کلید بررسی میشوند (که ایا فشرده شده اند یا که خیر،تا براساس ان مقیاس تنظیم شود) و در انتها Active_lcd بسته میشود ، تا از دوباره توسط تایمر فعال شود ..


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

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

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

پست توسط sinaset » چهار شنبه 23 اسفند 1396, 9:03 am

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

مثال شمارش افراد عبوری!

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

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

در این طرح وقفه شماره 0 در مد Low level (یعنی زمان که پایه وقفه در وضعیت صفر است) استفاده میشود

کد تابع وقفه:

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

count++;   //با هر قطع شدن نور مادون قرمز يا ليزر تابع وقفه اجرا و مقدار شمارش افزايش پيدا ميکند
Show_lcd=1;


چیز بخصوصی ندارد! هر وقت وقفه اجرا شده، متغیر count شروع به افزایش 1 واحدی خود میکند .. و تابع نمایش LCD اجرا میشود .. و مقدار به روی LCD نمایش داده میشود.

[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]برنامه از اینجا

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

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

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

پست توسط sinaset » چهار شنبه 1 فروردین 1397, 8:26 am

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

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

می توان دو کلید به میکروکنترولر اضافه کرد و در حلقه while برنامه دو خط برنامه نوشت،تا دائم میکرو بررسی کند،ببینید کلید ها فشرده شد یا که خیر! همین کار وقت،میکروکنترولر را می گیرد! (در کارهای معمولی چندان تاثیر گذار نیست! ولی در کارهایی مهم،چرا ..)

اما می توان دو کلید به وقفه های خارجی میکروکنترولر اتصال داد،! تا بجایی اینکه دائم بررسی شود،که اتفاقی برای کلید ها افتاده یا که خیر ! . میکروکنترولر هر وقت وقفه خارجی برایش اتفاق افتاد،خودش خبر بدهد !

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

مد استفاده شده نیز Low level می باشد، یعنی زمانی که کلید در وضعیت صفر می باشد !

دستور وقفه 0 و 1:

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

interrupt [EXT_INT0] void ext_int0_isr(void)
{
  lcd_clear();           //پاک سازي صفحه ال سي دي
  lcd_gotoxy(0,0);         //جايگاه و محل قرار گيري متن در ال سي دي
  lcd_puts("Button 0");      //چاپ يا نمايش متن
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
  lcd_clear();           //پاک سازي صفحه ال سي دي
  lcd_gotoxy(0,0);         //جايگاه و محل قرار گيري متن در ال سي دي
  lcd_puts("Button 1");      //چاپ يا نمايش متن
}


*2 خازن 100 نانو کلید ها : سرعت عمل وقفه ها بسیار بالا می باشد! معمولا پیش می اید،که وقتی کلید فشرده میشود،چندین بار،تابع وقفه اجرا میشود! با گذاشتن خازن 100 نانوفاراد،وقتی کلید فشرده میشود،چند لحظه طول میکشد،تا خازن تخلیه شود،همین میزان تاخیر،جلو اشتباهات و خطا ها را می گیرد .

کدبرنامه :

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

/*******************************************************
Project : learn-10
Date    : 1397.1.1
Author  :  sinaset
centralclubs.com

-->وصل کردن کليد ها به وقفه خارجي<--

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


interrupt [EXT_INT0] void ext_int0_isr(void)
{
  lcd_clear();           //پاک سازي صفحه ال سي دي
  lcd_gotoxy(0,0);         //جايگاه و محل قرار گيري متن در ال سي دي
  lcd_puts("Button 0");      //چاپ يا نمايش متن
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
  lcd_clear();           //پاک سازي صفحه ال سي دي
  lcd_gotoxy(0,0);         //جايگاه و محل قرار گيري متن در ال سي دي
  lcd_puts("Button 1");      //چاپ يا نمايش متن
}

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

//فعال کردن دو وقفه
// INT0: On
// INT0 Mode: Low level
// INT1: On
// INT1 Mode: Low level
GICR|=(1<<INT1) | (1<<INT0);
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
GIFR=(1<<INTF1) | (1<<INTF0);

//اين دستور هميشه بايد نوشته شود،وگرنه وقفه ي صورت نمي گيرد
lcd_init(16);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("Be Name KHoda");
delay_ms(500);
lcd_clear();

#asm("sei")   //فعال سازي وقفه جهاني خود ميکروکنترولر
while (1){}   //حلقه بي کار برنامه   
}  //پرانتز انتها کدهايي تابع اصلي



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

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

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

پست توسط sinaset » جمعه 3 فروردین 1397, 10:18 am

باسلام


LCD 16X2


با توجه به اینکه،مبحث LCD کاراکتری در اینترنت به وفور و با جزییات در رابطه با ان صحبت شده..

برای اشنایی با این LCD این مقالات را مطالعه کنید :

[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید] و [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید] و[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]

-------
تنظیم وقفه ها در کدویزارد

همانطور که قبلا (در صفحه 8) توضیح دادیم،به کمک نرم افزار کدویزارد که درون کدویژن قرار دارد،می توان به راحتی و به صورت گرافیکی واحد ها درونی میکروکنترولر را مقدار دهی کرد.. واحد وقفه هایی خارجی نیز،در کدویزارد وجود دارد!

برای اینکه،بتوانید واحد وقفه های خارجی را تنظیم کنید و به متناسب ان کد دریافت کنید. کدویزارد خود را باز کنید (صفحه 8 را ببینید !)

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

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

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

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

ارسال پست

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