e www.project-esisis.com\AVR_Assembly_مقدماتی

اسماعیل بخش زاد محمودی

09118315058

09336485452

09373054607

09390617786

http://telegram.me/Electronic_iran

mehrsa_bm

Esmail_bakhshzad@yahoo.com esmail2bakhshzad@gmail.com

*راهنمای سفارش پروژه*




www.doctronics.co.uk

www.powerengineering.blogfa.com

www.Elecdl.com

www.uoguelph.ca

www.doctronics.co.uk

http://www.sardarjangal.ir

وبلاگ مهندسی برق الکترونیک

 

 

 

 

 

 

 

 

 

 

Google

در اين وبلاگ
در كل اينترنت

الکترونیک مقدماتی

مقاومت

سلف

خازن

دیود

دیود زنر

یک سوسازی دیود

ترانزیستور BJT

دیجیتال Digital

الکترونیک صنعتی

تایرستورها Thyristors

ترایاک TRIAC

ماسفت MOSFET

ترانزیستور دوقطبی IGBT

مبدل های DC به DC

اینورترها(DC/AC Inverter)

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

برنامه نویسی Assembl

1. مقدمه

2. دستورات محاسباتی



11.مدارات میکروکنترلر 8051

12.مدارات میکروکنترلر PIC

13.مدارات میکروکنترلر AVR

14.مدارات دیجیتال Digital

15.مدارات آنالوگ Analog

 


 


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

 


Content on this page requires a newer version of Adobe Flash Player.

Get Adobe Flash player

ساعت

AVR Assembl

Microcontroller AVR (01)

مقدمه:

        هدف از نوشتن این راهنمای آموزشی، آموزش بخش کوچکی از برنامه نویسی میکروکنترلر خانواده AVR می باشد. دقت داشته باشید که معماری این تراشه ها بسیار گسترده و بیشرفته می باشد و نمی شود همه بخش های آن را در این آموزش آورد، تنها بخش های مهم و کاربردی از آن در این راهنما آورده شده. در ادامه برای هرچه بهتر شدن درک شما از برنامه نویسی این تراشه ها مثالهای همراه با سورس و فایل شبیه سازی شده با برنامه Proteus7 آورده شده، ورژن 7 به بعد این نرم افزار برای هماهنگی با دیگر بخش های سایت استفاده شده پس ابتدا برنامه Proteus خود را بروز کنید تا با مشکل اجرا نشدن فایل ها مواجع نشوید برای این کار می توانید از بخش دانلودها و همچنین راهنمای نصب و کار با این نرم افزار که در همین سایت گذاشته شده استفاده نمایید. این راهنما براساس سرفصل های مختلف نوشته شده و از بخش های مختلفی تشکیل شده پس باید تک تک این بخش ها را مطالعه نمایید و به هم مرتبط کنید تا بتوانید نیاز خود را برای برنامه نویسی برطرف نمایید. در پایان اگر با مشکل مواجع شدید می توانید از بخش سفارش پروژه وب سایت www.Project-esisis.com برنامه مورد نظر خود را از من درخواست نمایید تا شما را در اجرای پروژه مورد نظر یاری رسانم.  

معماری AVR  :

  معنی کلمه AVR دقیقاً برای کسی مشخص نیست، بجز دو مهندس شرکت ATMEL به نام های Alf egil bogen و Vegard Wollan که برای اولین بار میکروکنترلر Avr را طراحی نموده اند. البته برخی بر این باور هستند که کلمه AVR مخفف عبارت  Alf,Vegard , RISC یا اینکه Advanced, Virtual , RISC است اما هیچکس جز این دو نفر معنی دقیق AVR را نمی داند.

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

  1. خانواده ATTiny AVR
  2. خانواده AT90S   سری کلاسیک
  3. خانواده ATmega AVR

برنامه نویسی به زبان اسمبلی:

        چرا از زبان اسمبلی استفاده کنیم؟ اسمبلی یا زبان های دیگر؟ سؤال این است که چرا باید زبان دیگری را یاد بگیرید، که قبلاً زبان های برنامه نویسی دیگر را فرا گرفته اید، بهترین دلیل این است که هنگامی که شما در فرانسه زندگی می کنید قادر به گذران زندگی از طریق صحبت کردن به زبان انگلیسی هستند، اما در آنجا هرگز حس بودن در وطن را نمی کنید برا ی کار های ضروری نیز باید زبان آن کشور را به کار ببرید. این مثال جالبی برای درک زبان ماشین یا اسمبلی است، زیرا اگر از زبان های دیگری برای برنامه نویسی پروژه های پیشرفته استفاده نمائید هم فضای بیشتری از حافظه برنامه تراشه مورد نظر را اشغال می کنید هم یکسری تغییرات دلخواه را نمی توانید توسط زبان های دیگر اجرا نمایید چون در آن زبان ها کتابخانه های از بیش تعریف شده استفاده می شود که ابزار مختلف تراشه را به دلخواه خود بکار می برند.

فراگیری اسمبلی آسان است.  

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

چهار برنامه اصلی برای برنامه نویسی به زبان اسمبلی یا هر زبان دیگر ضروری هستند. این ابزار ها عبارتند از :

  1. ویرایشگر،
  2. برنامه اسمبلر،
  3. رابط برنامه ریزی تراشه،
  4. شبیه ساز،

ثبات چیست؟

ثبات ها حافظه های ویژه ای با ظرفیت 8 بیت بوده و به شکل زیر می باشند:

Microcontroller AVR (02)

یک ثبات می تواند اعداد 0 تا 255 ( اعدات مثبت) یا اعدادی از 128- تا 127+ این اعداد کامل هستند با یک بیت علامت در بیت 7 ، یا اینکه یک مقدار نشان دهنده یک کاراکتر ASCII مثلاً  “A”و یا تنها هشت بیت را که هیچ ارتباطی به هم ندارند مثلاً پرچم های هشدار دهنده که به صورت 0 و 1 بله / خیر استفاده شده اند، در خود ذخیره نمایند. البته فراموش نکنید که ثبات ها حافظه های موقت هستند یعنی با قطع تغذیه از تراشه این اطلاعات ازبین خواهد رفت.

ویژگی های ثبات ها:

  1. آنها را می توان به طور مستقیم در دستورات اسمبلر به کار برد،
  2. انجام عملیات برروی محتوای آنها تنها نیاز به یک دستور تک کلمه ای دارد،
  3. آنها به طور مستقیم به واحد پردازش مرکزی که Accumulator یا انباره نامیده می شود متصل هستند.
  4. آنها ورودی-منبع و خروجی- مقصد اعمال محاسباتی هستند.

32 ثبات در یک میکرو AVR وجود دارند. آنها در اصل R0 تا R31 نام گذاری شده اند، اما می توانید با استفاده از راهنمای اسمبلر نام های با معناتری و دلخواه برای آنها انتخاب کنید. مثلاً:

Microcontroller AVR (03)

راهنمای اسمبلر همواره با یک نقطه در ستون اول خط آغاز می شوند، اما دستورات هرگز از ستون اول شروع نمی شوند، و همواره قبل از آنها یک کاراکتر جای خالی یا tab باید آورده شود. توجه داشته باشید راهنمای اسمبلر تنها برای اسمبلر دارای معنی هستند و هیچ کد قابل اجرایی برای تراشه AVR تولید نمی کنند. توجه داشته باشید که در بالا ثبات R6 از این پس با نام Flag_DecimR هم قابل دسترسی است بنابراین در هر بار استفاده از این ثبات باید تعداد کاراکترهای بیشتری بنویسیم یا راحت تر اینکه آنرا از قسمتی از برنامه کپی نموده در محل مورد نظر جاگذاری کنیم، اما در عوض نام این ثبات برای ما نشان دهنده نوع محتویات آن خواهد بود.

خواندن و نوشتن در ثبات ها:

برای انتقال داده و یا خواندن داده ها از ثبات ها از دستورات زیر استفاده می نماییم

  1.  دستورMOV : این دستور رجیستر Rr را در رجیستر Rd کپی می کند. الگوی این دستور به صورت زیر است:
  2. MOV               Rd,Rr

    Rr رجیستر مبداء و Rd رجیستر مقصد می باشد.

    Rr و Rd یکی از رجیستر های R0 تا R31 می باشند.

    مثال: با فرض اگر R1=03 Hex و R2=0F Hex  با اجرای دستور زیر محتوای R2 برابر با 03hex می شود:                                                                               MOV               R2,R1

    Microcontroller AVR (04)

  3. دستورMOVW: این دستور دو رجیستر را در دو رجیستر دیگر کپی می کند. الگوی این دستور  به صورت زیر است:
  4. MOVW               Rd+1:Rd,Rr+1:Rr

    با استفاده از این دستور می توان دو رجیستر پشت هم را در دو رجیستر پشت هم دیگر قرار داد. مثال:

    MOVW               R1:R0,R3:R2

  5. دستور LDI : این دستور یک مقدار ثابت هشت بیتی را درون فایل رجیستر های R16 تا R31 کپی می کند. دقت کنید که رجیستر های R0 تا R15 با این دستور کار نمی کنند.

    LDI               Rd,k

    K یک مقدار ثابت و دلخواه می باشد بصورت هگز یا ....

    مثال:                             LDI               R22,$44

  6. دستورLD : این دستور یک بایت را به صورت غیر مستقیم از فضای داده به درون یک فایل رجیستر کپی می نماید فضای داده می تواند شامل فایل رجیستر ها R0 تا R31 رجیستر I/O و SRAM  داخلی باشد. الگوی این دستور  به صورت زیر می باشد:

    LD               Rd,p
    LD               Rd,p+
    LD               Rd,-p

    مثال: با فرض اینکه محتوای خانه 250H از حافظه داده SRAM برابر با 45H باشد با اجرای دستورات زیر رجیستر R16 برابر 45h خواهد شد.

    LDI               R30,$02-----250----02---50
    LDI               R31,$50
    LD               R16,x

    Microcontroller AVR (05)

  7. دستورLDS : یک بایت از فضای  داده SRAM را در یکی از رجیستر های R0  تا R31 کپی  می کند. K یک مقدار ثابت است و به آدرس خانه ای از فضای داده اشاره می کند.
  8. LDS               Rd,K

    مثال: با فرض اینکه  خانه 100hex از حافظه داده دارای مقدار 2F Hex باشد، با اجرای دستور زیر رجیستر R0 برابر 2F Hex خواهد شد.

    Microcontroller AVR (06)

  9. دستور LDD :  این دستور که به آن بارگذاری یا جابه جایی می گویند، مشابه دستور LD است. با این تفاوت  که رجیستر اشاره گر با یک عدد ثابت جمع شده و حاصل آن آدرس اشاره گر جدید را به وجود می آورد. q یک مقدار ثابت بین 0 تا 63 است.
  10. LDD               Rd,z+q
    LDD               Rd,y+q

    مثال: اگر محتوای خانه 300 تا 303 در حافظه SRAM به ترتیب برابر 10H,20H,30H,40H باشد با اجرای برنامه زیر رجیسترهای R0 تا R3 به ترتیب برابر با 4 رقم بالا می شود.

    LDI               R31,$03
    LDI               R30,$00
    LDD               R0,z+0
    LDD               R1,z+1
    LDD               R2,z+2
    LDD               R3,z+3

  11. دستور STS :  یک بایت از فایل رجیستر R0  تا R31 را در فضای داده ذخیره می نماید. و الگوی آن به صورت زیر است:
  12. STS               K,Rr

    مثال: با فرض R16=15H با اجرای  دستور زیر خانه 150 از SRAM یا حافظه داده برابر 15 خواهد شد.

    LDI               R16,$15
    STS               0x0150,R16

  13. دستور ST : یک بایت را به صورت غیر مستقیم از رجیستر R0 تا R31 به درون فضای داده منتقل می نماید. مکان داده توسط رجیستر های اشاره گر x,y,z تعیین می شود. p یکی از اشاره گر های x,y,z می باشد.
  14. ST               P,Rr
    ST               P+,Rr
    ST               -P,Rr

    مثال: اگر محتوای رجیستر R5= 3FHباشد، با اجرای دستور زیر محتوا ی خانه 135H از حافظه داده برابر با 3F hex خواهد شد.

    LDI               R28,$35
    LDI               R29,$01
    ST                Y,R5


    دقت داشته باشید که منظور از x,y,z رجیستر های اشاره گر می باشد یا همان رجیستر های

    Microcontroller AVR (07)

  15. دستور STD : این دستور که به آن ذخیره یا جابجایی می گویند مشابه دستور ST می باشد با این تفاوت که رجیستر اشاره گر Z با یک عدد ثابت جمع شده و حاصل آن آدرس اشاره گر جدید را به وجود می آورد.
  16. STD               y+q,Rr
    STD               z+q,Rr

    q یک مقدار ثابت بین 0 تا 63 می باشد.
    است R31 تا R30 رجیستر فایل بینRr
    مثال: اگر رجیستر های R16 تا R18 به ترتیب حاوی 5FH,2FH,15H باشند با اجرای برنامه زیر محتوای خانه های  250H تا 252H از حافظه داده به ترتیب برابر 2F,5F,15 خواهد شد:

    LDI               R30,$50
    LDI               R31,$02
    LDI               R16,$15
    LDI               R17,$2F
    LDI               R18,$5F
    STD              z+2,R16
    STD              z+0,R17
    STD              z+1,R18

ثبات های عمومی در AVR :

شکل زیر تصویری از ثبات های عمومی همراه با آدرس آنها در تراشه AVR را نشان می دهد.

Microcontroller AVR (08)

تفاوت ثبات ها:

در تراشه AVR تنها ثبات های R16 تا R31 با دستور LDI یک مقدار ثابت را لود می کنند، R0 تا R15 قادر به انجام این کار نیستند. این محدودیت چندان خوب نیست، اما هنگام ساخت مجموعه دستورات AVR اجتناب ناپذیر بوده است. در این قاعده یک استثنا وجود دارد: برای صفر کردن مقدار یک ثبات دستور زیر برای تمام ثبات ها صحیح است. Rrیکی از ثبات های R0تا R31 می تواند باشد.

CLR               Rr

ثبات های اشاره گر:

       همانطور که در صفحات قبل ذکر شد عملکرد ویژه ای برای زوج ثبات های R26 تا R31 تعریف شده است. این عملکرد به قدری مهم است که در اسمبلر AVR اسامی اظافی برای این زوج ثبات ها در نظر گرفته شده است: Z,Y.X این زوج ثبات ها 16 بیتی هستند که قادر به اشاره به محل های حافظه با آدرس حداکثر  16 بیتی در داخل SRAM یا در داخل حافظه برنامه Z هستند.

      بایت پایین آدرس 16 بیتی در ثبات با شماره پایین تر و بایت بالا در ثبات با شماره بالاتر قرار می گیرد. هر دو بخش نام های مخصوص به خودشان را دارند. به طور مثال بایت بالای Z را ZH یا R31 و بایت پایین آن را ZL یا R30 می نامند این نام ها در سرفایل استاندارد مربوط به تراشه ها تعریف شده است. برای خواندن از حافظه برنامه تنها یک دستور وجود دارد. این دستور فقط برای اشاره گر Z تعریف شده و بنام LPM یا (Load From Program Memory) نامگذاری شده است. این دستور بایت موجود در آدرس Z حافظه برنامه را در ثبات R0 کپی می کند. انتخاب بایت بالا یا پایین توسط بیت با کمترین ارزش انجام می شودبایت پاین=0 و بایت بالا = 1 به همین دلیل باید آدرس اصلی در 2 ضرب شود و بنابراین حوزه دسترسی محدود به 15 بیت یا 32 کیلوبایت حافظه برنامه است.  به این صورت:

LDI              ZH,High(2*Address)
LDI               ZL,Low(2*Address)
LPM

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

ADIW              ZL,1
LPM

ADIW به معنی افزودن بی واسطه یک کلمه Add Immediate Word بوده و حداکثر مقداری که می تواند به این روش اضافه کرد 63 می باشد. مکمل این دستور، تفریق یک مقدار ثابت بین 0 تا 63 از یک ثبات اشاره گر 16 بیتی بنام SBIW تفریق بی واسطة یک کلمه نامگذاری شده است.

چگونه جدولی از مقادیر ثابت را در حافظه برنامه جای دهیم؟ این کار با استفاده از راهنماهای اسمبلر یعنی DB. وDW. انجام می شود، با استفاده از آنها می توانید لیست های مقادیر را به صورت بایت به بایت یا کلمه به کلمه در حافظة برنامه قرار دهید. لیست ها بصورت بایت به بایت به این شکل هستند:

Microcontroller AVR (09)

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

Microcontroller AVR (10)

به طور مشابه ، لیستی از مقادیر کلمه ای به شکل زیر است:

.DW              12345,6789        ;a list of byte characters

توصیه های برای استفاده از ثبات ها:

  1. با راهنمای .def برای ثبات ها نام تعریف کنید و هرگز آنها را با نام مستقیمشان یعنی Rx به کار نبرید چون در برنامه های پیشرفته دچار مشکل خواهید شد.
  2.  اگر نیاز به دسترسی از طریق اشاره گر دارید ثبات های R26 تا R31 را به این کار اختصاص دهید.
  3. برای شمارنده 16 بیتی بهترین انتخاب R24:R25 است.
  4. اگر نیاز به خواندن از حافظه برنامه دارید. مثلاً برای جداول ثابت Z و R0 را به این کار اختصاص دهید.
  5. اگر می خواهید به بیت های برخی ثبات ها به طور مستقیم دسترسی داشته باشید مثلاً برای آزمایش پرچم ها ثبات های R16 تا R23 را برای این منظور به کار ببیرید.
  6. تجربه نشان داده در برنامه های پیشرفته رجیسترهایR0  تا R15  زیاد مورد اطمینان نیستند و اعداد ذخیره شده در آنها ممکن است در طول برنامه تغییر کند پس از آنها برای ذخیره اعداد حیاتی استفاده نکنید.
  7. از یک رجیستر فقط برای ذخیره یک داده استفاده شود تا در طول برنامه دچار بهم ریختگی در داده های تکراری نشوید.
  8. چند رجیستر را همیشه برای متغیر ها  کنار بگذارید تا در طول برنامه برای ذخیره موقت داده ها از آنها استفاده نماید البته نام آنها را می توانید Var یا Temp تعریف کنید معمولاً R16,R17,R18 برای این منظور کنار گذاشته می شود.

حافظه داده SRAM :

       تقریباً واحد کنترل اصلی (MCU) تمام مدل های خانواده AVR دارای Static RAM داخلی هستند. SRAM چیست؟ یک فضای داده برای ذخیره سازی اطلاعات موقت در اختیار کاربر قرار داده و محتوای این حافظه با قطع برق از بین می رود. برای دسترسی به این حافظه معمولاً از یک رجیستر واسط که یکی از رجیستر های R0  تا R31 است استفاده می شود.

نکته: استفاده از حافظه SRAM جهت انجام عملیات زمان بیشتری نسبت به حالتی که عملیات فقط روی رجیستر های عمومی R0  تا R31 انجام می شود. نیاز دارد.

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

تعریف SRAM به عنوان پشته:

   برای استفاده به عنوان پشته ابتدا باید اشاره گر پشته تنظیم شود. اشاره گر پشته یک اشاره گر 16 بیتی بوده و مشابه یک پورت دسترسی به آن انجام می شود. نام این ثبات دو قسمتی SPH:SPL است. SPH بایت با ارزش بیشتر و SPLبایت با ارزش کمتر آدرس را در خود نگه می دارد. در تراشه AVR می توان حداکثر 64K بایت از حافظه داده را جهت فضای پشته درنظر گرفت و شماره آدرس این فضا توسط اشاره گر پشته SP مشخص می شود.

توجه: در ابتدا وقتی سیستم روشن می شود، CPU از محل استقرار حافظه پشته آگاهی ندارد، بنابراین این محل را باید به اطلاع آن رساند. پیش فرض SP=0 است.برای این کار معمولاً با وارد کردن یک آدرس از حافظه SRAM معمولاً آدرس بزرگتر از 60h یا 100h به داخل رجیستر اشاره گر پشته انجام می گیرد. بکمک دستور PUSH می توان به طور مستقیم به فضای پشته دسترسی داشت. به کمک دستور POP می توان اطلاعات ذخیره شده در حافظه پشته را باز یابی نمود.

PUSH              R16        ;Throw that value
POP                R20        ;Read back the value

Microcontroller AVR (11)

پورت هاPorts I/O :  پورت چیست؟

      پورت ها امکان دسترسی میکروکنترلر با دنیای خارج را میسر می سازند. در تراشه AVR پورت ها گذرگاه هایی از واحد پردازش مرکزی به اجزای سخت افزاری و نرم افزاری داخلی و خارجی هستند. CPU با این اجزا مثلاً تایمر ها یا پورت های موازی ارتباط برقرار کرده و داده ها را از آنها خوانده یا به آنها می دهد. پر کاربرد ترین پورت ثبات پرچم Flag Register است که نتایج عملیات های پیشین در آن نوشته شده و شرط های انشعاب ،پرش از آن خوانده می شود.  مجموعاً 64 پورت مختلف وجود دارند که به طور فیزیکی در تمام مدل های AVR موجود نیستند. لیست پورت های قابل دسترسی برای هر نوع پردازنده در برگه اطلاعات Data Sheet مربوط به آن آورده شده است. هر کدام بصورت 8 بیتی عمل می کنند.

توجه: پورت ها علاوه بر کاربرد عمومی به عنوان I/O معمولاً دارای وظایف خاصی نیز هستند،که با توجه به تراشه مورد نظر متفاوت است. که این اطلاعات را نیز می توانید در برگه Data Sheet تراشه موردنظر پیدا نمائید.

Microcontroller AVR (12)

مثلاً  در تراشه ATmega32 پورت A علاوه  بر I/O معمولی ورودی های آنالوگ برای ADC و مقایسه کننده آنالوگ نیز است. PA0 تا PA7 هریک از پین های I/O   دارای دو دیود محافظ برای محافظت از ولتاژ ورودی منفی یا بزرگتر از  VCC است و همچنین دارای یک مقاومت بالاکش Pull-up داخلی می باشد. مقاومت های داخلی را می توان به دلخواه فعال یا غیر فعال نمود. بافر خروجی در هر پین قابلیت جریان کشی& جریان دهی تا 20mA را فراهم می کند. بنابراین می توان بطور مستقیم یک LED را راه اندازی نمود.

هر پین دارای دو نگهدار به نام های DDRx و PORTx می باشد نگهدار اولی وظیفه تعیین جهت پین بصورت ورودی یا خروجی را برعهده دارد. و دومی نگهدار داده می باشد و داده ای که قرار است روی پین قرار گیرد را در خود نگه می دارد. بنابراین هر پورت 3 رجیستر برای کنترل پایه ها دارد.

مدار داخلی یک پین ار پورت میکروکنترلر

Microcontroller AVR (13)

Microcontroller AVR (14)

تعیین جهت پایه ها بصورت ورودی و خروجی :
برای این منظور از رجیستر DDRx استفاده می شود، بطوریکه اگر در بیت مورد نظر از این رجیستر 0 منطقی نوشته شود آن پایه بصورت ورودی  و در صورت 1 شدن به صورت خروجی تعریف می شود.
مثلاً: پایه های 0و1و5و7 از پورت A بصورت خروجی و پایه های دیگر بصورت ورودی تعریف می شود.

Microcontroller AVR (15)

مقاومت بالاکش Pull-Up : هنگامیکه پایه بصورت ورودی تعریف شود اگر در بیت PORTx مقدار یک منطقی و بیت PUD در رجیستر SFIOR نیز صفر منطقی نوشته شود ، مقاومت بالاکش داخلی فعال خواهد شد.

Microcontroller AVR (16)

هنگامیکه بیت PUD برابر یک می گردد، مقاومت بالاکش درون پورت های I/O غیر فعال می شود حتی اگر PORTx و DDRx هم یک شده باشند.
توجه: هنگامیکه پایه بصورت خروجی تعریف شده باشد مقاومت بالاکش غیر فعال خواهد شد.
نکته: هنگامیکه پایه بصورت ورودی تعریف می شود، در صورتیکه مقاومت بالاکش داخلی یا خارجی فعال نباشد، پایه I/O به حالت Hi-z رفته و مقدار خوانده شده از ورودی پایه قابل اطمینان نمی باشد، بنا بر این توصیه می شود هنگام ورودی کردن پایه، مقاومت بالاکش داخلی یا خارجی برای آن درنظر گرفته شود.

نوشتن در پورت ها:

   برای این منظور ابتدا باید جهت پایه مورد نظر را بصورت خروجی تعریف نموده  DDRx=1 سپس با نوشتن در بیت نگهدار PORTx=xxx مقدار دلخواه را برروی پایه مورد نظر بنویسید.

خواندن از پورت:
به دو صورت می توان داده را از پورت خواند:

  1. خواندن مستقیم از روی پایه ها: به کمک PINx می توان اطلاعات را از روی پایه دریافت نمود. بطور مثال دستور  IN       R16,PINC داده ها را بطور مستقیم از روی پایه های پورت C خوانده و در رجیستر R16 قرار می دهد.
  2. خواندن از روی نگهدار پایه ها: در این حالت داده از روی نگهدارنده پایه خوانده می شود. بطور مثال دستور  IN       R16,PORTC داده ها را از رجیستر پورت داده C خوانده و درون R16 ذخیره می نماید. دقت کنید در این حالت اطلاعات آخرین وضعیت پایه ها می باشد.

دستور IN :
این دستور جهت خواندن از رجیستر های I/O به کار می رود و الگوی آن به صورت زیر است:

IN           Rd,A

Rd یکی از رجیستر های R0 تا R31 است.

A آدرس رجیستر مورد نظر در فضای I/O می باشد

دستور OUT :
این دستور جهت نوشتن مقدار موجود در رجیستر های R0 تا R31 روی فضای رجیستر های I/O به کار می رود و الگوی آن به صورت زیر است:

OUT           A,Rr

A آدرس رجیستر مورد نظر در فضای I/O می باشد.

برای بهتر فهمیدن توضیحات بالا مثال زیر در نرم افزار Proteus 7 و نرم افزار AVR Studio 4 طراحی شده پس از دانلود فایل ها را اجرا کنید:

آن را از لینک زیر دانلود نمائید:

http://s3.picofile.com/file/7406128709/Circuit_In_Out_AVR.zip.html

توضیح برنامه:
در این مثال ابتدا اطلاعات از پورت C خوانده شده و هم زمان بر روی پورت A نمایش داده خواهد شد:

Microcontroller AVR (17)

مدار مثال بالا

Microcontroller AVR (18)

استفاده از پشته PUSH/POP :

         استفاده از پشته ساده است. محتویات ثبات ها به صورت زیر بر روی پشته قرار می گیرد:

PUSH           Rd

دستور PUSH ابتدا محتوای فایل رجیستر Rd را در محلی که اشاره گر پشته Stack Pointer اشاره می کند ذخیره نموده و سپس اشاره گر پشته را یک واحد کاهش می دهد، البته در مکان حافظه SRAM ذخیره می شود. اگر دوباره به مقدار ذخیره شده نیاز داشته باشیم تنها کافی است از دستور زیر استفاده نماییم:

POP           Rd

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

  1. در چند خط بعدی برنامه به آن مقدار نیاز داشته باشیم.
  2. تمام ثبات ها در حال استفاده باشند.
  3. ذخیره این مقدار در هیچ محل دیگری امکان پذیر نباشد.

دستور LPM :
ازاین دستور جهت دستیابی به 64KB از فضای حافظه برنامه  FLASHاستفاده می شود. و توسط آن می توان به Look Up Table دسترسی پیدا نمود. الگوی این دستور به صورت زیر است:

LPM
LPM               Rd,Z
LPM               Rd,Z+

z به عنوان آدرس خانه ای از فضای حافظه برنامه می باشد و Rd نیز می تواند یکی از رجیستر های R0 تا R31 باشد.

مثال: اگر محتوای خانه  Hex 300  از حافظه برنامه (FLASH) برابر 45H باشد، با اجرای دستور زیر رجیستر R5 نیز دارای مقدار 45H خواهد شد. 

LDI               ZL,$00
LDI               ZH,$03
LPM              R5,Z

دستور SPM :
این دستور یکی از جالب ترین دستورات AVR می باشد. از این دستور جهت پاک کردن یک صفحه در حافظه برنامه، و نوشتن یک صفحه در حافظه برنامه و تنظیم بیتهای قفل در بخش Boot مورد استفاده قرار می گیرد و الگوی آن بصورت زیر است:

SPM

دستورات مهم و حیاتی که در هر برنامه حتی کوچک استفاده می شود:

  1. دستور مبدأ ORG . : دستور مبدأ Origin به اسمبلر می گوید که کدهای دستورالعمل بعد از ORG در آدرسی که توسط این دستور مشخص می شود در حافظه برنامه قرار خواهد گرفت مثلاً:
  2. .ORG                0000H

  3. دستور مساوی قرار دادن EQU. : این دستور برای مساوی قرار دادن یک برچسب با برچسب دیگر بکار می رود. مثلاً:
  4. .EQU                VAR=SREG

  5. دستور ضمیمه Include. : این دستور به اسمبلر می گوید که فایل Asm دیگری را که در برنامه نیاز می باشد به برنامه اصلی متصل نماید. مثلاً:

    .Include       "m16def.inc"

  6. در دستور بالا میکروکنترلر ATmega16را به برنامه معرفی نمودیم. در صورتی که از دستور بالا در ابتدای برنامه استفاده نکنیم اگر در طول برنامه نام رجیستری را به جای آدرس آن بکار ببرید. اسمبلر یک خطا را اعلام می کند.

  7. دستور ضمیمه DEF. : با استفاده از این دستور یک نام به رجیسترهای عمومی R0 تا R31 نسبت داده می شود. مثلاً:
  8. .DEF                Temp= R16

  9. دستور بازگشت از زیر برنامه RET: با اجرای این دستور بایتهای موجود در پشته به درون PC منتقل می شوند، پس از آن برنامه از مقدار جدید شروع به اجرای ادامه برنامه می کند.

  10. دستور بازگشت از زیر برنامه وقفه RETI : با اجرای این دستور که مشابه دستور بالا می باشد با این تفاوت که پرچم وقفه سراسری I را هم یک می کند تا میکرو برای وقفه دو باره آماده باشد.
  11. دستور  WDR :  این دستور تایمر نگهبان (Watchdog)  را بازنشانی می کند. البته دربخش های بعد توضیح کامل این دستور یاد داده خواهد شد.
  12. دستور  SLEEP با اجرای این دستور میکروکنترلر وارد مد استراحت یا خواب می شود.
  13. دستور  NOP این دستور نیز به مدت یک سیکل ماشین ، کاری انجام نمی دهد. البته شمارنده برنامه PC یک واحد افزایش می یابد.

منابع تولید پالس ساعت درAVR :
همانطور که میدانید منابع مختلفی برای تأمین پالس ساعت میکروکنترلر وجود دارد. کاربر به کمک فیوز بیت ها می تواند هر کدام از این منابع را انتخاب نماید. منابع مختلف تولید پالس ساعت با فیوز بیت های CKSEL3..0 قابل انتخاب است. جدول زیر این انتخاب ها را نشان می دهد در این جدول صفر0 به معنای برنامه ریزی شدن فیوزبیت و یک 1 به معنی برنامه ریزی نشدن فیوزبیت است.

Microcontroller AVR (19)

منابع کلاک در AVR به طور کلی به دو بخش داخلی و خارجی طبقه بندی می شود. منبع داخلی همان اسیلاتور RC است که کالیبره شده و ثبات تقریباً خوبی نیز دارد. در اکثر میکروکنترلر های خانواده  AVR  این اسیلاتور در فرکانس های 1Mhz, 2Mhz, 4Mhz, 8Mhz  وجود داشته و توسط فیوزبیتهای مربوطه در زمان برنامه ریزی قابل انتخاب است. این اسیلاتور داخلی کاربر را از اسیلاتور خارجی بی نیاز می کند. قابل ذکر است که معمولاً به طور پیش فرض اسیلاتور داخلی با فرکانس  1Mhzاز سوی کارخانه سازنده در زمان تولید انتخاب میشود .

Microcontroller AVR (20)

منابع خارجی متنوع بوده و شامل اسیلاتور کریستالی/سرامیکی فرکانس بالا، اسیلاتور کریستالی فرکانس پائین، اسیلاتور RC خارجی و کلاک دهی خارجی به پین XTAL2 میباشد .
به طور معمول و مخصوصاً زمانی که به فرکانس کاری بالا نیاز باشد یک کریستال فرکانس بالا به پین های  XTAL1  و XTAL2 متصل می گردد. در این وضعیت جهت پایداری اسیلاتور بین هرکدام از این پینها با زمین مدار باید یک خازن با ظرفیت 12 الی 22 PF  متصل گردد. نحوه انتخاب انواع اسیلاتور در جدول زیر آمده است .

Microcontroller AVR (21)

نحوه اتصال کریستال به پایه های تراشه

Microcontroller AVR (22)

اتصال منابع تغذیه به AVR :
برای تغذیه تراشه می توانید از مدار زیر استفاده کنید البته باید یک مدار رگولاتور 5 ولت قبل از این بخش قرار دهید. خازن های بکار رفته حتماً باید در نزدیکی تراشه میکرو مونتاژ شوند تا بتوانند نویز حاصل از تغذیه را حذف کنند.

Microcontroller AVR (23)


نسخه ی pdf قابل دانلود این صفحه:

لینک دانلود:

http://s3.picofile.com/file/7406135806/AVR_Prog_Assembly_Primary_.zip.html

رمز فایل: www.Project-esisis.com

راھنمای دانلودگزارش خرابی لینک

صفحه نخست  

 

این وب سایت را در گوگل محبوب کنید:

تشکر از حمایت شما
<img src="Background/Signbot LED (1).gif" width="249" height="49" alt="Signbot LED (1)" />
فروشگاه موبایل تبلت لپتاپ
کانال تلگرام