ما در حال نوشتن یک بوت لودر OTA برای ATmega128RFA1 (به عنوان بخشی از دستگاه Smart Response XE) هستیم.

ما در حال نوشتن یک بوت لودر OTA برای ATmega128RFA1 (به عنوان بخشی از دستگاه Smart Response XE) هستیم.

همه چیز با خرید نویسنده یک دستگاه جالب در بازار ثانویه آغاز شد - Smart Response XE (توضیح کوتاه). برای مدارس در نظر گرفته شده است: هر دانش آموز در کلاس دستگاهی شبیه دفترچه یادداشت الکترونیکی یا مترجم دهه نود دریافت می کند، معلم سؤالی می پرسد و دانش آموزان پاسخ ها را روی صفحه کلید دستگاه ها تایپ می کنند که از طریق یک دستگاه دریافت می شود. کانال رادیویی (802.15.4) به یک گیرنده متصل به رایانه شخصی معلم.

این دستگاه‌ها چندین سال پیش متوقف شدند و مدارسی که هر کدام به قیمت 100 تا 200 دلار خریداری کردند، اکنون با قیمت 10 دلار یا کمتر در eBay ظاهر می‌شوند. سخت افزار آنجا برای آزمایش های گیک بسیار مناسب است:

  • صفحه کلید 60
  • صفحه نمایش با وضوح 384×136، 2 بیت در هر پیکسل - شبیه به BC، CGA، اما 4 رنگ نه، بلکه درجه بندی روشنایی
  • میکروکنترلر ATmega128RFA1 (حافظه فلش 128 کیلوبایتی، رام 4 کیلوبایتی، رم 16 کیلوبایتی، فرستنده و گیرنده 802.15.4)
  • فلش مموری خارجی (در رابطه با میکروکنترلر نه کل دستگاه) 1 مگابیت (128 کیلوبایت) با رابط SPI
  • محفظه برای 4 عنصر AAA.

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

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


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

  • فلش مموری با رابط SPI سریال
  • بوت لودر برای AVR
  • استاندارد 802.15.4

نویسنده با نوشتن شروع کرد کتابخانه ها (GPL v3)، که به شما امکان می دهد نمایشگر را مقداردهی اولیه کنید، متن و مستطیل ها را تولید کنید و به حافظه فلش SPI دسترسی داشته باشید. سپس او شروع به ارائه ایده هایی برای استفاده عملی از دستگاه کرد: یک ترمینال جیبی سازگار با VT-100، بازی های چند نفره. پس از بازسازی سه دستگاه، او تصمیم گرفت که به آنها "آموزش" دهد که طرح ها را "از طریق هوا" دریافت کنند. چیزی که نه تنها جالب، بلکه بسیار راحت است: هر بار باز کردن قاب دستگاه دشوار است و در زیر درب محفظه باتری فقط سوراخ هایی وجود دارد که به شما امکان می دهد برنامه نویس JTAG را به برد متصل کنید.

ما در حال نوشتن یک بوت لودر OTA برای ATmega128RFA1 (به عنوان بخشی از دستگاه Smart Response XE) هستیم.

این برای آپلود بوت لودر آردوینو کافی است، اما نه طرح - پورت سریال به آنجا متصل نیست، بنابراین هنوز نمی توانید بدون باز کردن کیس انجام دهید. همچنین، خطوط TX0 و RX0 اولین پورت سریال با خطوط نظرسنجی ماتریس صفحه کلید ترکیب می شوند، یعنی خطوطی که کلیدهای عملکرد در کناره های نمایشگر را نظرسنجی می کنند. اما چه کاری می توانید انجام دهید - نویسنده این را ساخته است:

ما در حال نوشتن یک بوت لودر OTA برای ATmega128RFA1 (به عنوان بخشی از دستگاه Smart Response XE) هستیم.

او خطوط JTAG را به آنجا آورد و حالا دیگر نیازی به باز کردن محفظه باتری نیست. و برای اینکه بتوان طرح ها را آپلود کرد، هر دو پورت سریال را به یک کانکتور وصل کردم، همچنین یک سوئیچ اضافه کردم، زیرا با نصب باتری، از نظر فیزیکی غیرممکن است که دستگاه را به روش دیگری خاموش کنید.

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

Arduino IDE از این برنامه برای آپلود طرح ها استفاده می کند avrdude. با استفاده از پروتکل با میکروکنترلر تعامل دارد STK500، که به شما امکان می دهد فایل ها را در هر دو جهت انتقال دهید. با کانال هایی که تاخیر متغیر، اعوجاج و از دست دادن داده ها ممکن است، سازگاری ضعیفی دارد. اگر چیزی در کانال سریال شل شد یا خش خش کرد، می توانید دیوانه شوید و دنبال علت شوید. یک بار نویسنده به مدت نیم روز رنج کشید تا اینکه متوجه شد مشکل از کابل بد و همچنین مبدل واسط CP2102 است. حتی یک میکروکنترلر با مبدل رابط داخلی، به عنوان مثال، ATmega32u4، گاهی اوقات می تواند اینگونه عمل کند. هر کاربر آردوینو متوجه شده است که خطاها هنگام آپلود اسکچ ها چندان نادر نیستند. گاهی اوقات ضبط به خوبی انجام می شود، اما در حین خواندن تست، یک خطا تشخیص داده می شود. این به این معنی نیست که در هنگام نوشتن خطایی رخ داده است - در هنگام خواندن خطا وجود دارد. حالا تصور کنید که هنگام کار کردن "در هوا" همان اتفاق می افتد، اما خیلی بیشتر.

نویسنده پس از تلاش از راه های مختلف برای غلبه بر این مشکل، به موارد زیر رسید. دستگاه دارای یک حافظه فلش 128 کیلوبایتی با رابط SPI است - ما داده ها را از طریق سیم دریافت می کنیم (به یاد داشته باشید که نویسنده قبلاً یک دستگاه با کانکتور در کناره دارد)، از این حافظه به عنوان بافر استفاده می کنیم و داده ها را از طریق رادیو ارسال می کنیم. کانال به دستگاه دیگری سلام از Cybiko.

پس از نوشتن کد کار با کانال رادیویی و همچنین فونت، حجم لودر از 4 کیلوبایت بیشتر شد. بنابراین، مقدار HFUSE باید از 0xDA به 0xD8 تغییر کند. اکنون بوت لودر می تواند تا 8 کیلوبایت طول داشته باشد و آدرس شروع اکنون 0x1E000 است. این در Makefile منعکس شده است، اما باید هنگام پر کردن نیز در نظر گرفته شود بوت لودر از طریق avrdude.

فرستنده گیرنده 802.15.4 در ATmega128RFA1 در اصل برای کار با استفاده از پروتکل طراحی شده است. ZigBee، که بسیار پیچیده است، بنابراین نویسنده تصمیم گرفت به جای آن فقط بسته ها را منتقل کند. این در سخت افزار در ATmega128RFA1 پیاده سازی شده است، بنابراین کد کمی مورد نیاز است. همچنین، برای سادگی، نویسنده تصمیم گرفت از یک کانال ثابت استفاده کند، و به شما اجازه نمی دهد آن را حتی به صورت دستی انتخاب کنید. استاندارد 802.15.4 از 16 کانال با اعداد 11 تا 26 پشتیبانی می کند. آنها کاملاً شلوغ هستند، برخی نیز کانال های WiFi را با هم همپوشانی می کنند (قرمز کانال های ZigBee، آبی، سبز و زرد WiFi هستند).

ما در حال نوشتن یک بوت لودر OTA برای ATmega128RFA1 (به عنوان بخشی از دستگاه Smart Response XE) هستیم.

مشخص شد که کانال های 15 و 26 کمترین آسیب را در برابر تداخل وای فای دارند. نویسنده دومی را انتخاب کرد. سلب مسئولیت: مترجم نمی داند که آیا مجاز است ZigBee را به این طریق ساده کند. شاید بهتر باشد کمی بیشتر برنامه نویسی کنیم و آن را به طور کامل پیاده سازی کنیم؟

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

یکی از اجزای مهم این گفتگو، ارسال بسته هایی است که برای نوشتن در حافظه فلش دستگاه مقصد در نظر گرفته شده است. برای میکروکنترلرهای ساده از خانواده AVR حجم صفحه 128 بایت ولی برای ATmega128RFA1 256 و برای فلش مموری که از طریق پروتکل SPI وصل می شود همینطور است. برنامه در دستگاه اول، هنگام آپلود یک طرح، بلافاصله آن را به دستگاه دوم منتقل نمی کند، بلکه آن را در این حافظه می نویسد. هنگامی که Arduino IDE صحت ورودی را بررسی می کند، آنچه در آنجا نوشته شده است ارسال می شود. حال باید داده های دریافتی را از طریق کانال رادیویی به دستگاه دوم منتقل کنیم. در همان زمان، تغییر از دریافت به ارسال و برگشت اغلب اتفاق می افتد. پروتکل STK500 نسبت به تأخیر بی تفاوت است، اما از دست دادن داده ها را تحمل نمی کند (عجیب است، اما در بالا گفته شد که تأخیر بر انتقال داده ها نیز تأثیر می گذارد). و تلفات در طول انتقال بی سیم اجتناب ناپذیر است. ATmega128RFA1 دارای یک پیاده سازی سخت افزاری داخلی از درخواست های مکرر در مواقعی است که در مورد صحت انتقال شک و تردید وجود دارد، اما نویسنده تصمیم گرفت همان را در نرم افزار پیاده سازی کند. او پروتکلی را توسعه داد که در آن داده های بسیار بیشتری به یک سمت نسبت به دیگری جریان می یابد.

این کامل نیست، اما کار می کند. صفحه 256 بایتی به چهار بخش تقسیم می شود که هر بخش به صورت یک بسته از طریق هوا منتقل می شود. یک بسته می تواند تا 125 بایت داده به اضافه یک بایت برای طول و دو بایت برای CRC نگه دارد. بنابراین قطعات 64 بایتی به همراه شماره صفحه و بخش (از 0 تا 3) در آنجا قرار می گیرند. دستگاه دریافت کننده دارای متغیری است که به آن امکان می دهد تعداد بخش های دریافت شده را ردیابی کند و هنگامی که هر چهار بخش وارد شدند، دستگاه فرستنده تأیید دریافت کل صفحه را دریافت می کند. بدون تایید (CRC مطابقت نداشت) - کل صفحه را دوباره ارسال کنید. سرعت حتی بیشتر از انتقال از طریق کابل است. دیدن:


اما به طور کلی، ارائه یک راه مناسب برای اتصال کابل به دستگاه های آپلود طرح ها و از طریق آن ضروری است. به عنوان مثال، مانند عکس، داخل چنین مبدل رابطی روی CP2102 قرار دهید و آن را به برد بچسبانید تا بتواند در هنگام اتصال و جدا کردن کابل Micro USB در برابر نیرو مقاومت کند.

ما در حال نوشتن یک بوت لودر OTA برای ATmega128RFA1 (به عنوان بخشی از دستگاه Smart Response XE) هستیم.

همچنین دارای یک تثبیت کننده 3,3 ولتی است (و نحوه استفاده از آن در دستگاهی با منبع تغذیه 6 ولت - اگر همان تثبیت کننده را داشته باشد و می توانید دو دیود اضافه کنید تا به طور خودکار انتخاب کنید که کدام یک از آنها دستگاه را تغذیه می کند) . هر سه LED باید از برد مبدل رابط لحیم نشده باشند، در غیر این صورت هنگام کار بر روی آنها باتری ها را بارگیری می کنند و همچنین در نظرسنجی صفحه کلید اختلال ایجاد می کنند و با حافظه فلش با رابط SPI کار می کنند.

دنبال کردن یک هدف حتی جالب‌تر از دستیابی به آن بود (و نیازی به شوخی در مورد اتوبوس ندارید). نویسنده چیزهای زیادی در مورد بوت لودرهای AVR، حافظه فلش SPI، پروتکل STK500 و استاندارد 802.15.4 آموخت.

تمام کدهای دیگر علاوه بر کتابخانه ای که در بالا توضیح داده شد − است اینجا، و همچنین تحت GPL v3 است. توییتر نویسنده - اینجا.

منبع: www.habr.com

اضافه کردن نظر