میکروکنترولر AVR

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

میکروکنتولر یک IC قابل برنامه ریزیست( قابل توجه برنامه نویس ها !!! ) که در داخل خودش تمام اجزای یک کامپیوتر را دارد البته به صورت بسیار محدود چون میکروکنترولر یک قطعه ی بسیار فشردست.
به عنوان مثال دارای
CPU
RAM
FLASH( برای ذخیره برنامه )
TIMER
USART
I/O PORTs
و امکانات دیگر که بستگی به نوع قطعه متفاوت است .

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

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

تفاوت دیگر سرعت هست . راه حل هایی که با CPU ( با هزینه ی زیاد راه اندازی ! ) و
مدارات منطقی ( با هزینه بسیار کم ) پیاده سازی می شوند بسیار سریعتر از راه حل های میکروکنترولری عمل می کنند ولی به هر حال میکرو کنترولر در موارد کنترول محیط
کاربرد دارد .

در نوشته های بعدی مواردی که برای شروع کار با AVR لازم هست را توضیح میدم.
پایان !

<<بعدی 

Advertisements

دربارهٔ DeltaCode

Somewhere near the sky Far away from people Far away from noise Somewhere near yourself

Posted on دسامبر 7, 2010, in AVR and tagged , . Bookmark the permalink. 17 دیدگاه.

  1. وحید خوش اومدی…. پست اول مبارک

  2. اگه تو نبودی من چی کار میکردم !

  3. آقا وحید ایشالا که با نیرو بتونی همکاریت رو با ما ادامه بدی، راستی موضوع AVR هم اضافه کردم.

  4. دستت درد نکنه

    لطفا اگر نظر یا پیشنهادی در مورد آموزشهای بعدی دارید بنویسید.

  5. ا من توي دبيرستان يه كنفرانس راجع به ميكرو كنترلر ها دادم البته به انگليسي
    چقدر هم واسش زحمت كشيدم
    خيلي خوب بود ممنونم

  6. با سلام به همه بچه های طرفدار AVR / با اجازه دوستان و آقا وحید گل سوال های برنامه نویسی سی مربوط به AVR رو همین جا بپرسیم تا همه استفاده کنن.سینتکس هایی که به زبان سی هست جابجا میفته متاسفانه 😦 / . مح مود

    سوال 1
    برنامه ای بنویسید که بیت های portB را 200 بار معکوس کند .

    =========================================

    #include
    int main (void)
    {
    DDRB=0XFF
    unsigned char z;
    for(z=0;z<200;z++)
    {
    portB=0X55
    portB=0XAA;
    }
    while(1);
    return 0 ;
    }

    سوال : اون خط از برنامه که portB=0x55 و portB=0xAA رو نوشته داره چه اتفاقی میفته ؟ در واقع 55 و AA هگزا دسیمال چه تغیری رو بیت های portB میده لطفا راهنمایی کنید

  7. خوب بالاخره یه نفر یه سوال AVR از ما پرسید .آقا من هر ترم روی چند نفر سرمایه گذاری میکردم ولی هیچکدوم هیچی نشدن ! ! ! امیدوارم که تو به یه جایی برسی . ماشالا به این پشت کار .

    هر پورت 8 بیت داره یعنی یک بایت . هر بایت با دو رقم hex نشان داده میشود و اولش با 0x شروع میشه . اگر بخواهی به صورت باینری بنویسی باید اولش 0b بذاری .

    اعداد 0xAA , 0x55 به صورت باینری میشن 0b10101010 , 0b01010101 . اگر دقت کنی میبینی که بیتهای متناظر در هر دو عدد Not هم هستن ، یعنی بیت صفرم در اولی set هستش و در دومی clear و . . . منظورش این بود . مثل اینه که 0xAA رو با عدد 0xFF یای انحصاری Xor کنی .

    PORTB یک رجیستر به آدرس0x18 است . با هربار نوشتن روی رجیستر اگر خروجی تعریف شده باشه این مقدار به پین ها انتقال پیدا میکنه . راستی PORT هم با حروف بزرگ باید بنویسی همون طور که میدونی C به بزرگ و کوچک بودن حروف حساسه .

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

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

    تاخیر زمانی در AVR

    الف-استفاده از حلقه for
    ب- استفاده از توابع c
    ج-استفاده از تایمر های داخلی AVR

    میخوام روش الف رو توضیح بدم . به خاطر این این روش رو توضیح دادم چون به نظرم کمتر کسی از روش الف استفاده میکنه و ظاهرا زیاد طرف دار نداره / به هر حال به نظرم جالب اومد

    توض___یح روش الف :

    در صورتی که از حلقه for جهت تولید تاخیر زمانی استفاده میکنید باید توجه داشته باشید که عوامل زیر بر طول یک تاخیر تاثیر گذار هستند
    1- فرکانس نوسانگری که به پایه های XTAL1 & XTAL2 متصل است مهمترین عامل در تعیین طول زمان یک حلقه FOR محسوب میشود . زیرا زمان زمان اجرای هر دستور به زبان ماشین بر اساس طول یک پالس ساعت سنجیده میشود و طول پالس ساعت وابستگی مستقیم به فرکانس نوسانگر دارد

    2- عامل دوم که در تعیین طول اجرای زمانی حلقهFOR دخالت دارد ,نوع مشخصات کامپایلر است . هنگامی که شما به زبان اسمبلی برنامه مینوسید , چون کنترل کامل بر دستورات و ترتیب اجرای ان دارید میتوانید زمان اجرای یک قسم از برنامه را به طور دقیق اندازه گیری کنید .ولی هنگامی که به زبان C یک برنامه را منویسید کامپایلرهای مختلف یک برنامه را به صورت های متفاوتی کامپایل میکنند , که در این صورت زمان اجرای یک حلقه FOR در کامپایلر های مختلف متفاوت خواهد بود
    پس :
    بر اساس دلایلی که توضیح داده شد در صورت استفاده از حلقه FOR میبایست با کمک اسیلوسکوپ و یا شبیه ساز طول دقیق اجرای یک حلقه FOR را اندازه گرفت

    با استفاده از اسیلوسکوپ و محاسبه طول دقیق یک حلقه FOR میتوان به این مثال اشاره کرد :
    برنامه ای بنویسید که بیت های PORTB را هر 100 میلی ثانیه معکوس کند

    #include
    void delay100ms(void)
    {
    unsigned int 1;
    for(i=0;i<42150;i++);
    }
    int main (void)
    {
    DDRB=0XFF
    while(1)
    {
    PORTB=0XAA
    delay100ms();
    PORTB=0X55;
    delay100ms();
    }
    return 0;
    }

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

  9. اتفاقاً اشتباه فکر کردی چون حتی توابع خود C هم مثل delay_ms از همین روش برای ایجاد تاخیر استفاده میکنن و طرفدار هم زیاد داره ولی اشکالش اینه که وقت پردازنده صرف شمارش میشه و کار دیگه ای انجام نمیده , با عوض شدن فرکانس هم باید دوباره محاسبات رو انجام بدی .ولی اگر از توابع کتابخانه ای استفاده کنی خود کامپایلر این محاسبات رو انجام میده و تعداد تکرار رو خودش قرار میده .این روش زیاد هم دقیق نیست .
    اسمبلی به همین دلیل قدرتش نسبت به C بیشتره چون دقیقا زمان انجام هر سیکل دستورات مشخصه و میشه محاسبه کرد که چند تا دستور باید به کار برده بشه تا تاخیر ایجاد بشه .به همین دلیل از اسمبلی برای برنامه هایی که Time Critical هستن استفاده میشه .

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

  10. حل تمرين AVR : دسترسي بايتي به ژورت هاي ورودي و خروجي

    تمرين 1 : برنامه اي بنوسيد كه مقدار پورت c را خوانده و با عدد 100 مقايسه كند . چنان چه مقدار پورت كمتر از عدد 100 است / ان را به پورت B و در غير اين صورت به پورت D منتقل كند

    حل :

    #include
    int main(void)
    {
    DDRC=0;
    DDRB=0xFF;
    DDRD=0xFF;
    unsigend char temp ;
    while(1)
    {
    temp=PINC;
    if(temp<100)
    PORTB=temp;
    else
    PORTD=temp;
    }
    return 0;
    }

    اين تمرين خيلي واضحه ! ديگه توضيح نميخواد / ميخواد ؟

    =========================تمرين 2 ===========

    تمرين 2 – به پايه هاي پورت B هشت عدد LED مثصل است . برنامه اي بنويسيد كه اعداد 0 تا 255 را به صورت دودويي روي پايه هاي پورت B نمايش دهد .

    حل تمرين 2 :
    #include
    int main(void)
    {
    DDRB=0xFF;
    while(1)
    {
    PORTB=PORTB+1;
    _delay_ms(2000);
    }
    return 0;
    }

    دوستان توجه كنيد كه در اين برنامه چون PORTB يك ثبات 8 ذبيتي است پس از 255 مقدار 0 خواهد شد . اين تابع تاخير رو خودم گزاشتم اون وسط تا اگر واقعا مدار رو سر هم كرديم اعداد رو با اختلاف زماني 2 ثانيه نشون بده تا قابل فهم تر بشه / هنوز تستش نكردم .

  11. تمرين / حل به عهده دانشجو D-:

    تمرين 1-يكشنبه-21 / 1

    يك برنامه به زبان C بنويسيدپيوته بيت 4 از پورت B را بدون تغيير ساير بيت ها معكوس كند .

    تمرين 2-يكشنبه-21 / 1

    برنامه اي بنويسيد كه مقدار بيت 5 از پورت C را بررسي كند . چنان چه صفر بود عدد AAH و در غير اين صورت عدد 55H را به پورت D منتقل نمايد .

    (راهنمايي : استفاده از دستورت منطقي )

    موفق باشيد . مح مود

  12. تمرین اول رو با اسمبلی برات نوشتم تا توابع تاخیر رو در اسمبلی ببینی که به صورت بسیار دقیق میشه محاسبه کرد . در صورتی که فرکانس میکرو 1MHz باشه برای تاخیر 100ms به 100000 سیکل نیاز داریم تا تلف بشه .

     
    
    .nolist
    .include "m8def.inc"
    .list
    
    rjmp RESET	;Reset vector
    
    RESET:
    	ldi	r16,high(RAMEND)
    	out	sph,r16
    	ldi	r16,low(RAMEND)
    	out	spl,r16
    
    	ldi	r16,0xFF
    	out	DDRB,r16	;PORTB as output
    
    	ldi	r17,0x10	;4th bit set
    MAIN:
    	in	r16,PINB	;reading PINB to r16
    	eor	r16,r17		;Inverse 4th bit
    	out	PORTB,r16	;writing to PORTB
    
    	rcall	Delay
    
    	rjmp	MAIN		;jump to MAIN
    
    ;********************
    ;*  Delay 100ms     *
    ;*                  *
    ;*  100 000 cycles  *
    ;********************						
    
    				;cycles
    Delay:				; (3)
    	ldi	r24,0x5A	; (1)
    	ldi	r25,0x9E	; (1)
    
    Delay_Loop:
    	adiw	r24,1	        ; (2)
    	brne	Delay_Loop      ; (2)if true (1)if false
    
    	ret			; (4)
    
    

    اسمبلی تخصص بنده ست در این ضمینه هم اگر سوالی داشتی بپرس.

  13. وحید دمت گرم . جدا که محفل رو نورانی کردی

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

     
    
    .nolist
    .include "m8def.inc"
    .list
    
    .cseg
    .org	0x0000
    	rjmp	RESET	       ;Reset vector
    				;other vectors . . .
    Reset:
    	ldi	r16,0x00
    	out	DDRC,r16	;PORTC as input
    	ldi	r16,0xFF
    	out	DDRD,r16	;PORTD as output
    MAIN:
    	ldi	r16,0xAA
    	sbic	PORTC,5	;skip if 5th bit is clear
    	ldi	r16,0x55
    	out	PORTD,r16	;write on PORTD
    
    END:
    	rjmp	END	       ;loop for ever
    
    

    قطعه کد C

     
    
     if(PORTC.5 == 0)
    	PORTD = 0xAA;
     else  PORTD = 0x55;
    
    
  15. دوستان از این به بعد مبا حث رو در این پست مطرح کنید .

  16. مرسی آقا وحید . واقعا لذتشو بردیم / زندهباد اسمبلی و برنامه نویساش

    بسمه تعال________ی

    معرفی تایمر در AVR :

    AVR بسته به نوع خانواده میتونه از 1 تا 6 تایمر داشته باشه
    که با نام های تایمر 0 1 2 3 4 5 نشون داده میشند / از این تایمرها میتونیم جهت تولید تاخیر زمانی یا به عنوان شمارنده برای شماردن رویدادهای خارجی میکرو کنترلر استفاده کنیم . در AVR تایمرها میتونن 8 بیتی یا 16 بیتی باشند

    در ATmega32 ها 3 تایمر وجود داره / تایمر 0 1 2 که تایمرهای 0 و2 هشت بیتی هستند و تایمر یک 16 بیتی /

    ث__بات های اصلی تایم___ر :

    در AVR برای هر هر تایمر یک ثبات TCNTn وجود داره / یعنی تو AVR داریم : TCNT0 TCNT1 TCNT2

    TCNTn یک شمارنده است که به محض ریست شدن محتوای ثبات صفر میشه

    حالا هر تایمر یک پرچم TOVn هم داره که در صورت سر ریز شدن تایمر این ثبات یک میشه

    به علاوه هر تایمر یک ثبات TCCRn و OCRn هم داره که بعدا توضیح میدم

    نکته ای که به نظر مهم میاد و باید بهش اشاره کرد اینه که : ثبات هایتایمر در حافظه ثبات I/O قرار دارند / در نتیجه میتونیم مثل بقیه ی ثبات های I/O با استفاده از دستورات IN و OUT ثبات های تایمر رو بخونیم یا روی اون بنویسیم

    مثال به زبان اسمبلی : مقدار 25 را بر روی TCNT0 کپی کنید

    LDI R20 ,25
    OUT TCNT0,R20

    توض________یح : دستور LDI یک داده 8 بیتی رو داخل یک ثبات همه منظوره میریزه / دستور OUT به CPU میگه محتوای یک ثبات همه منظوره رو بر روی ثبات I/O ذخی___ره کند

    ادامه داره / به زودی / بخش بعد بر نامه ریزی تایمرها / موفق باشد

  17. وحید ببخشید حواسم نبود . کامنت جدید رو یک بارم تو پست جدید گزاشتم .

پاسخی بگذارید

در پایین مشخصات خود را پر کنید یا برای ورود روی شمایل‌ها کلیک نمایید:

نشان‌وارهٔ وردپرس.کام

شما در حال بیان دیدگاه با حساب کاربری WordPress.com خود هستید. بیرون رفتن / تغییر دادن )

تصویر توییتر

شما در حال بیان دیدگاه با حساب کاربری Twitter خود هستید. بیرون رفتن / تغییر دادن )

عکس فیسبوک

شما در حال بیان دیدگاه با حساب کاربری Facebook خود هستید. بیرون رفتن / تغییر دادن )

عکس گوگل+

شما در حال بیان دیدگاه با حساب کاربری Google+ خود هستید. بیرون رفتن / تغییر دادن )

درحال اتصال به %s

%d وب‌نوشت‌نویس این را دوست دارند: