Slide
Slide

آموزش سخت افزار AVR
نویسنده: مسئول فنی در
۱۴ اسفند ۱۳۹۱
[ آخرین به روزرسانی در ۱۵ ارديبهشت ۱۳۹۳ ]

پورت ها:

* اگر می خواهید از روی پایه های AVR بخوانید، باید از PIN بخوانید و نه از روی PORT . چون PORT محتوای رجیستر داخلی را به شما بر می گرداند.
* اگر می خواهید کی بورد به یک پورت AVR اضافه کنید، برای PullUp پورت ورودی لازم نیست مقاومت قرار دهید و با تنظیمات می توانید PORT را PullUp کنید.
* برای PullUp کرد پورت باید سه کار انجام دهید. 1- پورت را ورودی تعریف کنید. 2- داخل پورت 0xFF بنویسید  3- بیت PUD را صفر کنید.
* پورتهای A,B,C,D,E در  ATMega128 بصورت بیتی قابل کنترل هستند و پورتهای F , G را نمی توان بیتی کنترل کرد. پس در موقع طراحی سخت افزاری واسط هایی همچون TWI(I2C) را به آنها متصل نکنید.
* توجه داشته باشید که تنها 32 رجیستر اول فضای I/O بصورت بیتی قابل  کنترل هستند.
* اگر به پورت های بیشتر نیاز دارید، میکروکنترلر اضافه نکنید. با استفاده از یک پورت بعنوان باس انتقال داده و چند بیت از پورت دیگر برای انتخاب پورت ( دیکدر آدرس )  و بافرهای سه وضعیتی  دهها پورت با یک میکروکنترلر می توانید بسازید.

Port Adress decoder

* اگر میکروکنترلر شما مانند ATMEGA64 و بالاتر دارای امکان حافظه خارجی است، با استفاده از تکنیک Memory Mapped  I/O هر چقدر پورت می خواهید بسازید.

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

* رجیسترهای R0 تا R15 را نمی توان با دستورالعمل LDI بار کرد.
*تفاوت دستورالعمل انتقال براست منطقی و انتقال به راست حسابی : در انتقال براست منطقی از چپ صفر وارد می شود و در انتقال به راست حسابی علامت عدد حفظ می شود. جالب است بدانید در زبان C یک انتقال به راست بیشتر نداریم و با تعریف نوع متغیر می توان دو انتقال متفاوت داشت.
* دستورالعمل NEG با COMP  فرق می کند. دستورالعمل NEG عدد را منفی ( متمم 2 ) می کند، ولی دستورالعمل COM یا NOT بیتها را بر عکس ( متمم 1 ) می کند. پس در محاسبات باید از NEG استفاده کرد.
* به فرق RET و RETI توجه داشته باشید، هرچند هر دو آدرس برگشت را از Stack به PC  منتقل می کنند، اما دستورالعمل RETI علاوه بر آن فلگ وقفه را نیز فعال می کند.
* آیا می دانید که دستورالعمل WDR (Watch Dog Reset) را در صورت فعال کردن WDT(WatchDogTimer) باید در برنامه بنویسید. این دستورالعمل باید قبل از زمان ری ست شدن میکروکنترلر توسط بخش WDT به صورت متناوب اجرا شود، در غیر اینصورت میکروکنترلر بطور متناوب ری ست می شود.

مبدل آنالوگ به دیجیتال

در استفاده از A2D دو نکته مهم است. 1_ دقت  2_ سرعت

دقت : وقتی شما می خواهید، یک سیگنال آنالوگ را به دیجیتال تبدیل کنید، باید ابتدا دقت مورد نظر خود را مشخص نمایید. برای مثال اگر می خواهید دمای یک مخزن را که بین 20- تا 350 درجه است، را با دقت  0.5 درجه اندازه گیری کنید، لازم است که این بازه را به  740 قسمت کوانتیزه کنید، پس به یک A2D  حداقل 10 بیتی نیاز دارید. یا اگر بخواهید یک سیگنال که تغییرات آن بین 0 تا 220 ولت است را با دقت 2/. اندازه گیری کنید، پس باید این بازه را به (220-0)/0.2=1100 قسمت تقسیم کنید، پس  یک A2D  حداقل 11 بیتی لازم است. برای انتخاب تعداد بیت A2D لازم است حداکثر تغییرات سیگنال را بر دقت مطلوب خود تقسیم کنید، تا تعداد پله ها را بدست آورید و با توجه به آن تعداد بیت A2D مشخص می شود. (Full Scale/Resolution=Steps)

سرعت : در انتخاب سرعت، شما باید سرعت نمونه برداری از سیگنال آنالوگ را بدانید. برای انتخاب سرعت نمونه برداری باید با مفاهیم درس سیگنال و سیستم بخش Sampling آشنا باشید. در اینجا اشاره ای کوتاه به آن می کنم. یک راه انتخاب فرکانس نمونه برداری، دانستن پهنای باند سیگنال است، فرکانس نمونه برداری حداقل دو برابر بالاترین فرکانس موجود در سیگنال باشد ( قانون نایکوئیست ). برای مثال پهنای باند سیگنال صدا 4 کیلوهرتز است، پس برای اینکه اطلاعات صدا را از دست ندهیم، باید با فرکانس حداقل 8 کیلوهرتز از سیگنال نمونه برداری کنیم. یا اگر بخواهیم یک سیگنال تصویر را که پهنای باند آن 6 مگاهرتز است پردازش کنیم، باید فرکانس نمونه برداری حداقل 12 مگاهرتز باشد، تا اطلاعات تصویر را از دست ندهیم. اگر بخواهیم سیگنال مغز را که پهنای باند آن 90 هرتز است پردازش کنیم، باید از آن حداقل 180 نمونه در ثانیه بگیریم.
اما گاهی از اوقات پهنای باند یک سیستم را ممکن است، نداشته باشیم. برای مثال شما در مسابقات روباتیک یک موتور DC را میخواهید کنترل کنید، برای کنترل سیستم، باید از خروجی در ثانیه چند نمونه بردارید. یک راه سرانگشتی استفاده از پاسخ پله سیستم است. به سیستم یک پله اعمال کرده و خروجی را ثبت و یا با اسیلوسکوپ مشاهده کنید. حال  زمان نمونه برداری را یک دهم زمان بالا آمدن (Rise Time) سیستم بگیرید.  من از این روش بارها استفاده کرده ام.

  • در A2D ولتاژ مرجع مهم است. در صورتیکه نمی توانید ولتاژ مرجع با ثبات و دقیق خارجی ایجاد کنید، از ولتاژ مرجع داخلی استفاده کنید.
  • به امپدانس ورودی A2D توجه داشته باشید. امپدانس خروجی سیگنال شما باید بسیار کمتر از امپدانس ورودی A2D باشد، وگرنه سیگنال توسط A2D بار می شود. ( درس مدارهای الکترونیک )
  • در حالت Free Running اولین تبدیل باید توسط شما و به کمک بیت ADSC انجام شود و تبدیل های بعدی بطور خودکار، پس از پایان تبدیل قبلی شروع می شود.
  • در صورتیکه از ولتاژ مرجع داخلی یا AVCC به عنوان ولتاژ مرجع استفاده می کنید، هرگز پایه AREF به ولتاژ وصل نکنید و فقط یک خازن 0.1uf کافیست.
  • از انتخاب حالت دیفرانسیلی با دو ورودی یکسان مانند MUX4..0=01000 تعجب زیادی نکنید. در این حالت هر دو ورودی OPAmp به ADC0 وصل می شود. این حالت برای بدست آوردن ولتاژ آفست ورودی و حذف آن به روش دیجیتال به کار می رود. ( از درس مدارهای الکترونیک می دانید که   در OPAmp ها، علیرغم اینکه هر دو ورودی به صفر وصل شود، خروجی صفر نیست و ولتاژ ناچیزی دارد که به آن Offset Voltage می گویند. در آنجا با پتانسیومتر ولتاژ آفست را حذف می کردیم.)

ارتباط سریال

در بعضی موارد از انتقال داده موازی نمی توان استفاده کرد، در این حالت از انتقال سریال استفاده می کنیم. مفهوم انتقال سریال همان مفهوم ساده ای است که شما در درس مدارهای منطقی دیده اید.
روشهای انتقال سریال متعددی وجود دارد، که غالب آن ها در AVR پیاده سازی شده است. مشکل غالب ما در استفاده از ارتباط سریال، قبل از پیاده سازی آن ها روی AVR انتخاب روش است. برای مثال از  USB,CAN Bus,TWI(I2C),SPI,RS485,RS232 کدامیک را استفاده کنیم.
در ابتدا می خواهم نگاهی کلی به این روش ها داشته باشم.  توجه داشته باشید، اینها پروتکلهای ارتباطی نیستند، بلکه بیشتر مشخصات فیزیکی و الکتریکی را مشخص می کنند.

RS232 : برای فواصل طولانی در حدود چند 100 متر قابل استفاده است. یک روش اتصال دو دستگاه به شکل زیر است. همانطور که می بینید، خط TxD دستگاه 1 به خط RxD دستگاه 2 وصل می شود و بر عکس خط TxD دستگاه 2 به خط RxD دستگاه 1 متصل می گردد و زمینها به هم وصل می شوند.

لذا RS23  به صورت باس قابل استفاده نیست. یعنی نمی توان بیش از دو دستگاه را بصورت دو طرفه وصل کرد، چرا که دو خروجی TxD را نمی توان به هم متصل کرد، چون خروجی مبدل RS232 بصورت کلکتور باز یا درین باز نیست.(Open Collector,Open Drain)

پس هر پورت RS232 برای اتصال فقط به یک پورت RS232  دیگراست. واضح است که یک TxD را می توان به چندین RxD متصل کرد، در این صورت اطلاعات یک طرفه است.

 
   
  • در صورتی که دستگاهها را بصورت زنجیری یا پشت سرهم Daisy Chain وصل کنید، می توان چندین دستگاه را به هم متصل کرد. در این روش داده بین تمام دستگاهها  دست به دست می شود، تا به مقصد برسد و اگر یک دستگاه خراب شود، ارتباط کل دستگاهها خراب می شود. در اینجا TXD فرمانده Master را به RXD فرمانبر1 Slave1 می دهید و TXD فرمانبر1 را به RXD فرمانبر2 و TXD فرمانبر2 را به ... تا به آخرین فرمانبر می رسید، حال خروجی TXD فرمانبر آخری را به RXD فرمانده وصل می کنید. در واقع یک رینگ  تشکیل می دهید. این روش توصیه نمی شود، مگر مجبور باشید.

از نظر سطوح ولتاژی برای 0 و 1 توجه داشته باشید، که مشابه TTL نیست، بلکه همانطور که در شکل زیر می بینید، منطق 0 متناظر ولتاژ 3 تا 15 ولت و منطق1  متناظر با ولتاژ 3-  تا 15- است. لذا یک AVR را نمی توان مستقیماً به یک وسیله مانند کامپیوتر که دارای پورت سریال RS232 است، وصل کرد. برای تبدیل سطوح TTL به RS232 از آی سی MAX232 استفاده می شود.

RS485 : RS485 نیز برای ارسال فواصل طولانی استفاده می شود، به دلیل ارسال داده ها به صورت دیفرانسیلی فاصله از RS232 بیشتر است. از طرف دیگر تجهیزاتی که دارای پورت RS485 هستند، به صورت باس مطابق شکل زیر به هم متصل می شوند. در کل RS485 تمام کارآیی های RS232 را دارد و فقط در برنامه نویسی باید دقت بیشتری کرد و یک پایه میکروکنترلر را برای کنترل جهت انتقال داده باید استفاده کنید. برای تبدیل سطوح TTL به RS485 از MAX485 استفاده می کنند. دستگاههای صنعتی غالباً به جای پورت RS232 پورت RS485 دارند.
برای درک عملکرد RS485 بهتر است ابتدا با مبدل MAX485 آشنا شوید.

 

آشنایی با پایه ها :

Receiver Output – RO خروجی گیرنده : این پایه به پایه RxD میکروکنترلر برای دریافت داده متصل می شود. اگر A>B به اندازه 200mV باشد، این پایه 1 می شود و اگر A<B به اندازه 200mV باشد، این پایه 0 می شود.

Driver Input – DI ورودی درایور : این پایه به پایه TxD میکروکنترلر برای ارسال داده متصل می شود. اگر به این پایه 1 داده شود، خروجی A یا Y بالا و خروجی B  یا Z مقدار پایین را میگیرد و اگر 0 بدهیم، برعکس. همانطور که می بینید، داده ها به صورت دیفرانسیلی روی خروجی های A و B قرار می گیرند. حدود ولتاژ خروجی درایور ( ارسال ) و حساسیت درایور ( دریافت ) در شکل زیر آمده است.

 

 

 

Receiver Output Enable – RE فعال ساز خروجی گیرنده : برای دریافت داده باید این پایه را 0 کنیم. اگر این پایه 1 باشد خروجی RO به حالت شناور یا امپدانس بالا (High Impedance) می رود.
Driver Output Enable – DE فعال ساز خروجی درایور : با 1 کردن این پایه خروجی های A و  B فعال می شوند و داده روی ورودی DI روی خروجی های A و B برای ارسال قرار می گیرد. اگر این پایه غیر فعال یعنی 0 باشد، خروجی های A و B به حالت شناور می روند.
حالت فعال پایه های کنترلی RE و DE برعکس هم هستند، شما می توانید دو پایه را به هم وصل و به یکی از پایه های میکروکنترلر متصل کنید. برای حالت دریافت این پایه مشترک را 0 و برای ارسال این پایه را 1 کنید.
مطابق شکل زیر شما میتوانید دهها دستگاه با خروجی RS485 را به هم به کمک یک زوج سیم متصل کنید.

چند نکته در مورد USART :

  • واحد سریال بطور سنکرون و آسنکرون برنامه ریزی می شود. پورت RS232 کامپیوتر فقط بصورت آسنکرون است.
  • در روش سرکشی برای ارسال داده جدید از بیت UDRE به جای TXC استفاده کنید، این بیت پس از RESET میکروکنترلر 1 است و مبین اینست که بافر ارسال UDR میکروکنترلر آماده دریافت داده جدید است.
  • خطای FE فقط در حالت آسنکرون رخ می دهد.
  • در موقع دریافت همواره قبل از خواندن UDR رجیستر UCSRA را بخوانید. چون خواندن رجیستر UDR باعث پاک شدن خطاها به طور خودکار می شود، و شما خطاهای احتمالی که ممکن است رخ داده باشد، را پاک می کنید.
  • برای ارسال داده سعی کنید از اطلاعات درس شبکه خود استفاده کنید. داده ها را حتماً به صورت یک فریم ارسال کنید. در زیر چند فریم نمونه آمده است.  فرمت PROFIBUS در کارخانجات و صنایع  استفاده می شود.
  • داده ها را با فرمت ASCII بفرستید، تا مشابه بقیه قسمتها نباشد.
  • FCS که عبارت چک کردن فریم است، معادل متمم 2 جمع تمام داده ها با حذف کری است .

PROFIBUS

رابط SPI

یکی دیگر از روشهای انتقال سریال واسط SPI است. این واسط سریال سنکرون است و برای فواصل کم در حد چند متر با سرعت بالا استفاده می شود. به صورت دو طرفه است. به صورت Master/Slave عمل می کند. تمام کنترل ها توسط Master انجام می شود.
شکل زیر روش انتقال داده را نشان می دهد. دو رجیستر انتقال داده به صورت زنجیری به هم متصل هستند، در زمانیکه داده، بیت به بیت از Master به Slave منتقل می شود، همزمان داده Slave نیز به Master منتقل می گردد. همانطور که می بینید، پالس کلاک توسط Master ایجاد می شود. برای تبادل داده باید پایه SS=Slave Select دستگاه Slave فعال یعنی 0 شود. از این پایه برای انتخاب دستگاه Slave در حالتیکه چندین Slave داریم، استفاده می شود.

در صورتیکه چندین Slave داشته باشید، به کمک پایه های دیگر میکروکنترلر مستقیماً و یا با استفاده از یک دیکدر می توانید Slave ها را انتخاب کنید.

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

واسط سریال TWI یا I2C

این واسط برای فواص کم در حد چند متر و سرعت بالا استفاده می شود.
همانطور که از نام آن پیداست، یک واسط دو سیم است. انتخاب دستگاه با آدرس دادن به صورت نرم افزاری انجام می شود و تا 128 دستگاه را می توان به هم متصل کرد.
اضافه کردن دستگاه جدی به سادگی انجام می شود. کافیست دو سیم SDA و SCL را به دستگاه جدید اضافه کنید یا  به زبان ساده باس انتقال را بدوانید.
شکل زیر سیگنال های TWI و باس انتقال را نشان می دهد. حتماً تا به حال متوجه شده اید، هر گاه خروجی یک سیگنال مطابق شکل زیر به صورت درین باز (Open Drain) باشد، آنرا به باس می توان متصل کرد.
در TWI هر کدام از دستگاهها می توانند، تصمیم به انتقال داده بگیرند و کلاک توسط خودشان ایجاد می شود.
روش انتقال بین دستگاه ها به صورت Master/Slave و یا روش مرسوم در شبکه CSMA/CD باشد.
در این روش باید در برنامه نویسی تجربه بیشتری داشته باشید.

مقایسه واسط های سریال :

در مورد RS232 با پایین آوردن سرعت انتقال، برای فواصل بیشتر قابل استفاده است.
در مورد سرعتهای TWI و SPI محدودیت شما بیشتر به  سرعت AVR  مربوط می شود.

نظرات کاربران
کاربر 1 :    
۱۴ فروردين ۱۳۹۳
۱۴ فروردين ۱۳۹۳
لطفا در رابطه با روش ارتباط یک سیمه - چگونگی ارتباط بین میکرو به درگاهUSB بدون استفاده از IC FTI232i که مبدل سریال به USB است و انواع پروتکل استفاده از USB باستفاده ازتراشهPDIUSBD12 وهمچنین نحوه استفاده ازکارت حافظه SD با استفاده از میکرو را در صورت امکان توضیح دهید . ممنون


یه دانشجوی پاس نشده :    
۳۱ خرداد ۱۳۹۳
۳۱ خرداد ۱۳۹۳
سلام استاد واقعا با امتحان امروزتون گل کاشتین سوال سخت میدین که دانشجو ها درس شما رو پاس نکنن . شما الان وقت استراحتتون هستش برین خونه استراحت کنید . با تشکر
۰۲ تير ۱۳۹۳
مسئول فنی :

سوالات امتحان را جهت اطلاع شما و بقیه آوردم. مشابه و غالباً عین تمام سوال ها را بارها در کلاس حل کردیم. مشابه سوال اول حداقل 10 مورد در کلاس حل شد. مشابه سوال دوم و به مراتب مشکل تر در کلاس حل شد، مانند مرتب کردن اعداد، شیفت دادن اعداد، پیدا کردن یک پاترن و... مسئله سوم در باره اینتراپت بود که در کلاس مشابه آن حل و در بخش تمرین اینتراپت سایت آمده است. سوال 4 در حالت های مختلف در سایت بخش تایمر آمده و در 4 حالت مختلف در کلاس حل کردم. سوال 5 مشابه تمرین 1-2-6 سایت است و در کلاس درباره آن مفصل صحبت کرده ام. 
پیشنهاد می کنم شما 5 مسئله برای امتحان طرح و برایم ارسال کنید. تا ترم آینده ازت بپرسم.
و اما سخن دیگر:
تو امتحان سخت ندیده ای، یادم می آید 20 سال قبل 4 سوال می دادم  و بچه ها از ساعت 5 عصر تا 10 شب، با علاقه ای دیدنی سر جلسه امتحان می نشستند و حتی فراموش می کردند که 5 ساعت گذشته است و ... یادش بخیر.
1-      برنامه ای بنویسید که بیتهای 0و1و4و5و6 پورت C را خروجی با مقدار صفر و بقیه بیتها را ورودی  و به صورت PullUp تعریف کند.

1-      برنامه ای بنویسید که از میان ده عدد زیر که در حافظه FlashROM هستند، اعداد



كاربر :    
۰۴ اسفند ۱۳۹۳
۰۴ اسفند ۱۳۹۳
سلام استاد.امپدانس ورودي A2D چقدره؟


كاربر :    
۰۴ اسفند ۱۳۹۳
۰۴ اسفند ۱۳۹۳
ديتاشيت atmega16 رو كه نگاه كردم امپدانس ورودي A2D رو ننوشته بود استاد...


رستمخانی :    
۱۶ خرداد ۱۳۹۴
۱۶ خرداد ۱۳۹۴
سلام, دانشجوی رشته سخت افزار هستم درمورد انتقال داده‌ام طریق میکرو سوالی داشتم قبلا از صرف وقت شما سپاسگزارم با میکروهای avr و بدون استفاده از آی سی , میتوان بااستفاده از خصوصیات و توانایی های میکروکنترلر های این دسته انتقال داده انجام داد???? پارت نامبر, یا همون شماره میکرو مورد نظر و نحوه انجامش را میخوام خیلی مهم و ضروریست ممنون میشم اگر کمکم کنید سپاسگزارم
۳۱ خرداد ۱۳۹۴
مسئول فنی :

بین دو avr با روشهای مختلف می توان داده منتقل کرد و نیاز به آی سی ندارد. به بخش ارتباط سریال مراجعه کنید. از روش USART، SPI و TWI می توانید استفاده کنید. 



نظر بدهید

ایمیل شما پنهان می ماند.