فهرست مطالب:

آموزش AVR Assembler 6: 3 مرحله
آموزش AVR Assembler 6: 3 مرحله

تصویری: آموزش AVR Assembler 6: 3 مرحله

تصویری: آموزش AVR Assembler 6: 3 مرحله
تصویری: 15دیمەنی سەرسوڕهێنەرتاکو بە چاوی خۆت نەیانبینی بڕوایان پێ ناکەیت😱 2024, نوامبر
Anonim
آموزش AVR Assembler 6
آموزش AVR Assembler 6

به آموزش 6 خوش آمدید!

آموزش امروز مختصر خواهد بود که در آن ما یک روش ساده برای انتقال داده ها بین یک atmega328p و دیگری با استفاده از دو پورت متصل به یکدیگر ایجاد می کنیم. سپس تاس را از آموزش 4 و تحلیل کننده ثبت را از آموزش 5 می گیریم ، آنها را به هم متصل می کنیم و از روش خود برای انتقال نتیجه تاس از غلتک به آنالیز استفاده می کنیم. سپس با استفاده از LED هایی که برای آنالیز در آموزش 5 ساخته ایم ، رول را به صورت باینری چاپ می کنیم. هنگامی که این کار را انجام دادیم ، می توانیم قطعه بعدی پروژه کلی خود را در آموزش بعدی بسازیم.

در این آموزش شما نیاز دارید:

  1. تابلوی نمونه اولیه شما
  2. تاس انداز شما از آموزش 4
  3. ثبت نام شما از آموزش 5
  4. دو سیم اتصال
  5. یک کپی از برگه اطلاعات کامل (ویرایش 2014):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. یک نسخه از دستورالعمل مجموعه دستورالعمل (ویرایش 2014):

    www.atmel.com/images/atmel-0856-avr-instruc…

در اینجا پیوندی به مجموعه کامل آموزش های مونتاژ AVR من آمده است:

مرحله 1: چگونه می توانیم دو میکروکنترلر را مجبور کنیم که با یکدیگر صحبت کنند؟

چگونه می توانیم دو میکروکنترلر را مجبور کنیم با یکدیگر صحبت کنند؟
چگونه می توانیم دو میکروکنترلر را مجبور کنیم با یکدیگر صحبت کنند؟

از آنجا که ما شروع به توسعه پروژه خود کرده ایم به طوری که محصول نهایی ما از مجموعه ای از قطعات کوچکتر تشکیل شده است ، ما نیاز به پین بیشتری نسبت به یک Atmega328P واحد داریم. بنابراین ما قصد داریم هر قسمت از پروژه کلی را روی یک میکروکنترلر جداگانه انجام دهیم و سپس از آنها بخواهیم داده ها را بین خود به اشتراک بگذارند. بنابراین مشکلی که ما باید حل کنیم این است که چگونه می توانیم یک روش ساده برای کنترل کننده ها برای صحبت با یکدیگر و انتقال داده ها بین آنها ارائه دهیم؟ خوب ، یک نکته در مورد این کنترلرها این است که هر کدام 16 میلیون دستور را در ثانیه اجرا می کنند. این زمان بسیار دقیق است و بنابراین ما می توانیم از این زمان برای انتقال داده ها استفاده کنیم. اگر از تاخیرهای میلی ثانیه ای برای تشکیل داده استفاده کنیم ، واقعاً لازم نیست که آنقدر دقیق باشیم ، زیرا CPU 16000 دستورالعمل را در یک میلی ثانیه اجرا می کند. به عبارت دیگر ، یک میلی ثانیه برای CPU ابدی است. بنابراین بیایید آن را با تاس های تاس امتحان کنیم. من می خواهم نتیجه یک تاس را از تراشه تاس به تراشه آنالیزور منتقل کنم. فرض کنید شما آن طرف خیابان ایستاده بودید و من می خواستم نتیجه چرخش یک جفت تاس را به شما نشان دهم. اگر ما هر دو یک ساعت داشتیم ، می توانستم یک چراغ قوه روشن کنم ، هنگامی که شما آماده دریافت اطلاعات من شدید ، چراغ قوه خود را روشن کرده و هر دو ساعت خود را روشن می کنیم. سپس چراغ قوه خود را برای تعداد دقیق میلی ثانیه روشن نگه می دارم و تاس می چرخد و سپس آن را خاموش می کنم. بنابراین اگر 12 را بچرخانم ، نور خود را برای 12 میلی ثانیه روشن نگه می دارم. در حال حاضر مشکل در مورد بالا این است که ، برای من و شما ، به هیچ وجه نمی توانیم چیزها را به اندازه کافی دقیق زمان بندی کنیم تا بین 5 و 12 میلی ثانیه تمایز قائل شویم. میلی ثانیه اما در این مورد چطور؟ فرض کنید ما تصمیم گرفتیم که به ازای هر عدد روی تاس ، چراغ خود را یک سال روشن نگه دارم؟ سپس اگر 12 را بچرخانم ، 12 سال به شما نور می دهم و فکر می کنم شما موافقت می کنید که هیچ اشتباهی در تشخیص عدد وجود ندارد؟ می توانید استراحت کنید و بیس بال بازی کنید ، حتی می توانید به مدت 6 ماه در وگاس بازی کراپ انجام دهید ، تا جایی که در طول سال به خیابان نگاه کنید تا ببینید چراغ روشن است ، شمارش را از دست نمی دهید. خوب این دقیقاً همان کاری است که ما برای میکروکنترلرها انجام می دهیم! یک میلی ثانیه واحد برای CPU مانند یک سال است. بنابراین اگر سیگنال را برای 12 میلی ثانیه روشن کنم ، تقریبا هیچ شانسی وجود ندارد که میکروکنترلر دیگر آن را برای 10 یا 11 اشتباه کند ، بدون توجه به وقفه ای که در این مدت رخ می دهد. برای میکروکنترلرها ، یک میلی ثانیه یک ابدیت است. بنابراین در اینجا این است که ما چه کاری انجام خواهیم داد. ابتدا ما دو پورت روی کنترلر را به عنوان پورت های ارتباطی خود انتخاب می کنیم. من برای دریافت داده ها از PD6 استفاده می کنم (در صورت تمایل می توانیم آن را Rx بنامیم) و PD7 را برای انتقال داده ها انتخاب می کنم (در صورت تمایل می توانیم آن را Tx نیز بنامیم). تراشه آنالایزر به صورت دوره ای پین Rx آن را بررسی می کند و در صورت مشاهده سیگنال به "زیر روال ارتباطی" می افتد و سپس یک سیگنال بازگشت را به غلطک تاس منتقل می کند و می گوید آماده دریافت است. هر دو زمان بندی را شروع می کنند و غلتک تاس یک سیگنال (یعنی 5 ولت) را برای میلی ثانیه در هر عدد روی تاس منتقل می کند. بنابراین اگر این رول شش سیکس یا 12 بود ، آنگاه تاس بر روی PD7 آن را به مدت 12 میلی ثانیه روی 5 ولت قرار می داد و سپس آن را روی 0 ولت تنظیم می کرد. آنالایزر پین PD6 خود را در هر میلی ثانیه ، هر بار شمارش می کند ، و هنگامی که به 0V بر می گردد ، عدد حاصل را به نمایشگر آنالایزر نشان می دهد و دوازده عدد باینری را روی LED نشان می دهد. بنابراین این طرح است. بیایید ببینیم آیا می توانیم آن را اجرا کنیم یا خیر.

مرحله 2: زیر برنامه های ارتباطی

اولین کاری که باید انجام دهیم اتصال دو کنترلر است. بنابراین یک سیم از PD6 را بردارید و از طرف دیگر آن را به PD7 وصل کنید و برعکس. سپس آنها را با تنظیم PD7 به OUTPUT در هر دو و PD6 به INPUT در هر دو تنظیم کنید. در نهایت همه آنها را روی 0 ولت تنظیم کنید. به طور خاص ، موارد زیر را به قسمت Init یا Reset کد در هر میکروکنترلر اضافه کنید:

sbi DDRD ، 7 ؛ PD7 روی خروجی تنظیم شده است

cbi PortD ، 7 ؛ PD7 در ابتدا 0V cbi DDRD ، 6 ؛ PD6 روی ورودی cbi PortD ، 6 تنظیم شده است ؛ PD6 در ابتدا 0V کلر کل مجموع روی تاس در ابتدا 0

حالا بیایید زیر روال ارتباطات را روی تراشه تاس غلتکی تنظیم کنیم. ابتدا یک متغیر جدید در بالا به نام "total" تعریف کنید که تعداد کل چرخانده شده روی جفت تاس را ذخیره کرده و مقدار آن را به صفر می رساند.

سپس یک زیر برنامه برای ارتباط با آنالیز کننده بنویسید:

برقراری ارتباط:

cbi PortD ، 7 sbi PortD ، 7 ؛ ارسال سیگنال آماده منتظر بمانید: sbic PinD، 6؛ PinD را بخوانید و در صورت صبر کردن 0V rjmp صبر کنید 8 ؛ تأخیر در همگام سازی (این مورد به صورت تجربی یافت شد) ارسال: کاهش کل تاخیر 2؛ تاخیر برای تعداد شمارش cpi کل ، 0 ؛ 0 در اینجا به معنی "کل" تاخیرهای شماره ارسال شده است breq PC+2 rjmp send cbi PortD، 7؛ کل PD7 تا 0V clr ؛ مجموع تاس ها را به 0 بازنشانی کنید

در تجزیه و تحلیل ما یک rcall از روال اصلی را به زیر روال ارتباطی اضافه می کنیم:

تجزیه و تحلیل clr ؛ برای شماره جدید آماده شوید

sbic PinD ، 6 ؛ PD6 را برای برقراری ارتباط با سیگنال 5V بررسی کنید. اگر 5V برای برقراری ارتباط با تجزیه و تحلیل حرکت کند ، در کل ؛ خروجی به آنالیزور rcall تجزیه و تحلیل

و سپس زیر روال ارتباطی را به صورت زیر بنویسید:

برقراری ارتباط:

کل کلر ؛ بازنشانی کل به 0 تاخیر 10 ؛ تاخیر در خلاص شدن از شر برگشت sbi PortD، 7؛ PB7 را روی 5V تنظیم کنید تا سیگنال دریافت آماده دریافت شود: تأخیر 2؛ صبر کنید تا شماره بعدی شامل کل شود ؛ افزایش کل sbic PinD ، 6 ؛ اگر PD6 به 0V بازگردد ، کار دریافت rjmp به پایان رسیده است. در غیر این صورت حلقه پشتیبان گیری برای داده های بیشتر cbi PortD، 7؛ تنظیم مجدد PD7 را پس از انجام مجدد انجام دهید

شما برو! اکنون هر میکروکنترلر تنظیم شده است تا نتیجه چرخش تاس را منتقل کرده و سپس آنالیز کننده را نمایش دهد.

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

تمرین 1: ببینید آیا می توانید روش بهتری را پیاده سازی کرده و از آن برای انتقال تاس به عنوان یک عدد باینری 8 بیتی استفاده کنید.

ویدئویی را ضمیمه می کنم که نشان می دهد کار من چگونه است.

مرحله 3: نتیجه گیری

نتیجه
نتیجه

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

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

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

تمرین 2: به جای استفاده از یک سیگنال آماده برای نشان دادن زمان انتقال تاس و ارسال دیگری برای آمادگی آنالیزور ، از "وقفه خارجی" به نام "وقفه تغییر پین" استفاده کنید. پین های atmega328p را می توان از این طریق استفاده کرد ، به همین دلیل آنها در نمودار pinout در کنار خود دارای PCINT0 از طریق PCINT23 هستند. شما می توانید این را به عنوان یک وقفه به شیوه ای مشابه با وقفه سرریز تایمر اجرا کنید. در این حالت "کنترل کننده" وقفه ، روال فرعی است که با غلتک تاس ارتباط برقرار می کند. به این ترتیب نیازی نیست که زیر برنامه ارتباطی را از main فراخوانی کنید: هر زمان که وقفه ای از تغییر وضعیت روی آن پین ایجاد شود ، به آنجا می رود.

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

وقتی کنترلرهای بیشتری اضافه می کنیم ، در آینده از این تکنیک های پیچیده تر استفاده خواهیم کرد.

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

در آموزش بعدی ما هدف "تجزیه کننده" خود را تغییر می دهیم ، چند عنصر مدار دیگر را معرفی می کنیم و از تاس ها به شکل جالب تری استفاده می کنیم.

تا دفعه بعد…

توصیه شده: