فهرست مطالب:

AVRSH: یک پوسته مفسر دستور برای آردوینو/AVR .: 6 مرحله (همراه با تصاویر)
AVRSH: یک پوسته مفسر دستور برای آردوینو/AVR .: 6 مرحله (همراه با تصاویر)

تصویری: AVRSH: یک پوسته مفسر دستور برای آردوینو/AVR .: 6 مرحله (همراه با تصاویر)

تصویری: AVRSH: یک پوسته مفسر دستور برای آردوینو/AVR .: 6 مرحله (همراه با تصاویر)
تصویری: سخنرانی جدید، دریای اسرار آمیز قرآن و معجزه ریاضی کعبه 2024, نوامبر
Anonim
AVRSH: یک پوسته مفسر دستور برای Arduino/AVR
AVRSH: یک پوسته مفسر دستور برای Arduino/AVR

آیا تا به حال خواسته اید که به میکروکنترلر AVR خود وارد شوید؟ آیا تا به حال فکر کرده اید که "گربه" ثبت شده برای دیدن محتویات آن جالب باشد؟ آیا همیشه به دنبال راهی برای تقویت و خاموش کردن سیستم های فرعی فرعی AVR یا Arduino خود در * زمان واقعی * بوده اید؟ من نیز ، بنابراین AVR Shell ، یک پوسته شبیه یونیکس را نوشتم. شبیه یونیکس است زیرا یادآور پوسته پوسته ای است که برای خرید ربات های برخورد irc nick خود خریداری کرده اید و همچنین دارای یک یا دو دستور مشترک هستید. همچنین دارای یک سیستم فایل است که شبیه extix های UNIX است ، با استفاده از EEPROM خارجی ، اما این به خودی خود یک پروژه شده است ، بنابراین وقتی این ماژول آماده تولید می شود ، آن را جداگانه تحت یک دستورالعمل متفاوت منتشر می کنم. در اینجا لیستی از کارهایی است که می توانید در حال حاضر با AVR Shell انجام دهید:

  • همه ثبت نامهای جهت داده (DDRn) ، پورت ها و پین ها را در زمان واقعی بخوانید
  • برای روشن کردن موتورها ، LED ها یا خواندن حسگرها در زمان واقعی ، به تمام DDRn ها ، پورت ها و پین های خود بنویسید
  • لیست تمام رجیسترهای شناخته شده روی سیستم را لیست کنید
  • ایجاد و ذخیره مقادیر در متغیرهای تعریف شده توسط کاربر که توسط EEPROM پشتیبانی می شوند.
  • ایجاد یک رمز عبور ریشه و احراز هویت در برابر آن (برای دسترسی به Telnet استفاده می شود)
  • سرعت کلاک پیکربندی شده CPU را بخوانید
  • سرعت ساعت CPU خود را با تنظیم پیش شماره گیری تغییر دهید
  • تایمرهای 16 بیتی را برای زمان بندی موارد مختلف شروع و متوقف کنید
  • تقویت و/یا خاموش کردن سیستم های فرعی جانبی: مبدل های آنالوگ به دیجیتال (ADC) ، رابط جانبی سریال (SPI) ، رابط دو سیمه (TWI/I2C) ، UART/USART. برای زمانی که می خواهید مصرف برق میکروکنترلر را کاهش دهید یا عملکردهای خاصی را فعال کنید مفید است.
  • به زبان C ++ با اشیاء قابل استفاده مجدد نوشته شده است.

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

مرحله 1: آنچه شما نیاز دارید

آنچه شما نیاز دارید
آنچه شما نیاز دارید

این دستورالعمل نیاز چندانی ندارد مگر اینکه شما:

  • آردوینو یا ATmega328P داشته باشید. سایر AVR ها می توانند کار کنند ، اما ممکن است لازم باشد که کد را تغییر دهید تا هر رجیستری که منحصر به MCU شما است لیست شود. نامها فقط باید با آنچه در فایل هدر منحصر به MCU شما ذکر شده مطابقت داشته باشد. بسیاری از نام های ثبت شده بین AVR ها یکسان هستند ، بنابراین مسافت پیموده شده شما هنگام انتقال ممکن است متفاوت باشد.
  • راهی برای اتصال به سریال USART Arduino/AVR خود داشته باشید. این سیستم با ترمینال AVR ، یک برنامه ویندوز که از طریق درگاه USB یا COM شما اتصال سری می دهد ، به طور گسترده آزمایش شده است. با Arduinos با استفاده از اتصال USB و هرگونه AVR با استفاده از USB-BUB از Moderndevice.com کار می کند. سایر گزینه های ترمینال عبارتند از: Putty ، minicom (Linux و FreeBSD) ، صفحه نمایش (Linux/FreeBSD) ، Hyperterminal ، Teraterm. من متوجه شدم که بتونه و teraterm هنگام اتصال مقداری زباله ارسال می کنند تا اولین فرمان شما دچار خرابی شود.
  • سیستم عامل AVR Shell را نصب کرده و اجرا کنید ، که می توانید از این صفحات بارگیری کنید ، یا همیشه آخرین نسخه را در BattleDroids.net دریافت کنید.

برای نصب ترمینال AVR ، کافی است آن را باز کرده و اجرا کنید. برای نصب سیستم عامل AVR Shell ، آن را بارگیری کرده یا فایل hex را مستقیماً بارگذاری کرده و ترمینال سریال خود را در 9600 baud متصل کنید ، یا خودتان آن را با "make" و سپس "make program" برای بارگذاری hex کامپایل کنید. توجه داشته باشید ، ممکن است لازم باشد تنظیمات AVRDUDE را تغییر دهید تا درگاه COM شما منعکس شود. توجه: ویژگی PROGMEM در اجرای AVR GCC فعلی برای C ++ خراب است و این یک اشکال شناخته شده است. اگر آن را کامپایل کرده اید ، انتظار داشته باشید پیام های هشداردهنده زیادی دریافت کنند که می گوید "هشدار: فقط متغیرهای اولیه شده را می توان در ناحیه حافظه برنامه قرار داد." این هشدار علاوه بر آزاردهنده برای دیدن ، بی ضرر است. از آنجا که C ++ در پلت فرم جاسازی شده در لیست اولویت های AVR GCC قرار ندارد ، مشخص نیست چه زمانی این مشکل برطرف می شود. اگر کد را بررسی کنید ، خواهید دید که در کجا سعی کرده ام این هشدار را با اجرای دستورات ویژگی خود کاهش دهم. بسیار ساده است. هر چیزی را که ممکن است نیاز داشته باشید بارگیری و نصب کنید تا صفحه را ورق بزنید و اجازه دهید کرک کنیم.

مرحله 2: خواندن و نوشتن ثبت

خواندن و نوشتن ثبت
خواندن و نوشتن ثبت

AVR Shell در ابتدا برای دسترسی به برخی از سنسورهایی که به AVR خود متصل کرده بودم نوشته شده است. با یک LED ساده شروع شد و سپس به سنسورهای نور ، سنسورهای دما و در نهایت به دو مبدل اولتراسونیک منتقل شد. avrsh می تواند اجزای دیجیتالی این سنسورها را با نوشتن در رجیسترهایی که آنها را کنترل می کنند تنظیم کند. دستکاری رجیسترهای AVR در حین اجرا برای دریافت لیستی از تمام رجیسترهای شناخته شده در Arduino خود ، عبارت زیر را تایپ کنید:

چاپ ثبت و چاپی شبیه به این خواهید داشت

من در مورد ثبت های زیر می دانم:

TIFR0 PORTC TIFR1 PORTD TIFR2 DDRD PCIFR DDRB EIFR DDRC EIMSK آلل Pinb EECR PINC EEDR از Pind SREG EEARL GPIOR0 EEARH GPIOR1 GTCCR GPIOR2 TCCR0A TCCR0B TCNT0 OCR0A OCR0B SPCR SPDR ACSR SMCR MCUSR MCUCR SPMCSR WDTCSR CLKPR PRR OSCCAL PCICR EICRA PCMSK0 PCMSK1 TIMSK0 TIMSK1 TIMSK2 ADCL ADCH ADCSRA ADCSRB ADMUX DIDR0 DIDR1 TCCR1A TCCR1B TCCR1C TCNT1L TCNT1H ICR1L ICR1H OCR1AL OCR1AH OCR1BL OCR1BH TCCR2A TCCR2B TCNT2 OCR2A OCR2B ASSR TWBR TWSR TWAR TWDR TWCR TWAMR UCSR0A UCSR0B UCSR0C UBRR0L UBRR0H UDR0 PORTB ریشه @ ATmega328p> برای مشاهده نحوه تنظیم بیت های جداگانه در هر ثبات ، از دستور cat یا echo استفاده کنید

گربه٪ GPIOR0 در اینجا من از مترجم دستور می خواهم که محتویات General Purpose I/O Register #0 را نمایش دهد. به علامت درصد (٪) در جلوی نام ثبت توجه کنید. شما به این مورد نیاز دارید تا به پوسته نشان دهید که این یک کلمه کلیدی رزرو شده برای شناسایی یک ثبات است. خروجی معمولی از دستور echo به این شکل است

GPIOR0 (0x0) روی [00000000] تنظیم شد خروجی نام رجیستر ، مقدار هگزا دسیمال موجود در رجیستر و نمایش دوتایی رجیستر را نشان می دهد (هر بیت را 1 یا 0 نشان می دهد). برای تنظیم یک بیت خاص در هر ثبت ، از عملگر "index of" استفاده کنید. به عنوان مثال ، فرض کنید من بیت سوم را به 1 می خواهم

٪ GPIOR0 [3] = 1 و پوسته به شما پاسخی می دهد که نشان دهنده عملکرد و نتیجه آن است

GPIOR0 (0x0) روی [00000000] (0x8) تنظیم شده [00001000] علامت درصد را فراموش نکنید تا به پوسته ای که با یک رجیستر کار می کنید بگویید. همچنین توجه داشته باشید که با تنظیم بیت سوم ، این مقدار 4 بیت است زیرا AVR ما از یک شاخص مبتنی بر صفر استفاده می کند. به عبارت دیگر ، با شمارش تا بیت سوم ، 0 ، 1 ، 2 ، 3 را شمارش می کنید ، که رتبه 4 است ، اما بیت سوم است. شما می توانید کمی به همان روش با تنظیم کمی بر روی صفر پاک کنید. با تنظیم بیت هایی مانند این می توانید عملکرد AVR خود را در حال تغییر تغییر دهید. به عنوان مثال ، با تغییر مقدار مطابقت تایمر CTC موجود در OCR1A. همچنین به شما امکان می دهد تنظیمات خاصی را که باید به صورت برنامه نویسی در کد خود بررسی کنید ، مانند مقدار UBBR برای نرخ Baud خود ، بررسی کنید. کار با DDRn ، PORTn و PINn پین های ورودی/خروجی نیز به رجیسترها اختصاص داده شده اند و می توانند دقیقاً به همان شیوه تنظیم شوند ، اما نحو خاصی برای کار با این نوع رجیسترها ایجاد شده است. در کد ، یک فرایند معمولی برای مثال ، روشن کردن یک LED یا دستگاه دیگری که به بالا یا پایین دیجیتالی نیاز دارد ، وجود دارد. نیاز به تنظیم Data Director Register دارد تا مشخص شود که پین برای خروجی است ، و سپس 1 یا 0 را به بیت خاص در پورت صحیح بنویسید. با فرض اینکه ما یک LED متصل به پین دیجیتال 13 (PB5) داریم و می خواهیم آن را روشن کنیم ، نحوه انجام این کار در حالی که AVR شما در حال اجرا است به شرح زیر است.

تنظیم پین pb5 خروجی نوشتن پین pb5 بالا خروجی ، علاوه بر اینکه می توانید LED خود را روشن کنید ، شبیه این خواهد بود

root@ATmega328p> تنظیم خروجی pin pb5 تنظیم pb5 برای outputroot@ATmega328p> نوشتن pin pb5 بالا نوشتن منطق بالا به pin pb5 "root@ATmega328p>" اعلان پوسته است که نشان می دهد آماده پذیرش دستورات از طرف شما است. برای خاموش کردن LED ، به سادگی نقطه پایینی را به پین بنویسید. اگر می خواهید ورودی دیجیتال را از طریق یک پین بخوانید ، از دستور read استفاده کنید. با استفاده از مثال فوق ما

root@ATmega328p> پین pb5 را بخوانید پین: pb5 بالا است از طرف دیگر ، کافی است از ثبت کننده پین که پورت پین را کنترل می کند ، استفاده کنید. به عنوان مثال ، اگر سوئیچ های متصل به پین دیجیتال 7 و 8 (PD7 و PD8) داریم ، می توانید فرمان را ارسال کنید

اکو٪ PIND و پوسته محتویات آن ثبت را نمایش می دهد و تمام حالت های ورودی/خروجی دستگاه های متصل و روشن یا خاموش بودن حالت سوئیچ را به شما نشان می دهد.

مرحله 3: خواندن و نوشتن فیوزها

فیوزهای خواندن و نوشتن
فیوزهای خواندن و نوشتن

فیوزها انواع خاصی از رجیسترها هستند. آنها همه چیز را از سرعت ساعت میکروکنترلر شما گرفته تا روشهای برنامه نویسی برای حفاظت از نوشتن EEPROM در دسترس هستند. گاهی اوقات شما نیاز به تغییر این تنظیمات دارید ، به خصوص اگر در حال ایجاد یک سیستم AVR مستقل هستید. مطمئن نیستم که باید تنظیمات فیوز خود را در آردوینو تغییر دهید. مراقب فیوزهای خود باشید ؛ اگر آنها را به اشتباه تنظیم کنید می توانید خود را قفل کنید. در دستورالعمل قبلی ، من نشان دادم که چگونه می توانید فیوزهای خود را با استفاده از برنامه نویس و avrdude بخوانید و تنظیم کنید. در اینجا به شما نشان می دهم که چگونه فیوزهای خود را در زمان اجرا بخوانید تا ببینید چگونه MCU شما واقعاً آنها را تنظیم کرده است. توجه داشته باشید ، این تنظیم زمان کامپایل نیست که از تعاریف دریافت می کنید ، بلکه فیوزهای واقعی است زیرا MCU آنها را در زمان اجرا می خواند. از جدول 27-9 در برگه اطلاعات ATmega328P (پایگاه داده ، بیشتر شبیه به آن) بیت های Fuse Low Byte به شرح زیر است:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0نکته جالبی که باید به آن توجه کرد این است که در فیوزها 0 به معنای برنامه ریزی شده و 1 به این معنی است که آن بیت خاص برنامه ریزی نشده است. تا حدی ضد شهود است ، اما وقتی آن را شناختید آن را می دانید.

  • CKDIV8 ساعت CPU شما را بر 8 تقسیم می کند. ATmega328P از کارخانه ای تهیه شده است که از نوسان ساز داخلی خود در 8 مگاهرتز با CKDIV8 برنامه ریزی شده (یعنی روی 0) استفاده می کند و فرکانس F_CPU یا CPU نهایی 1 مگاهرتز را به شما می دهد. در آردوینو ، این مورد تغییر کرده است زیرا آنها برای استفاده از یک نوسان ساز خارجی در 16 مگاهرتز پیکربندی شده اند.
  • CKOUT هنگام برنامه نویسی ، ساعت CPU شما را بر روی PB0 ، که پین دیجیتال 8 در Arduinos است ، خروجی می دهد.
  • SUT [1..0] زمان راه اندازی AVR شما را مشخص می کند.
  • CKSEL [3..0] منبع ساعت را تنظیم می کند ، مانند نوسان ساز RC داخلی ، نوسان ساز خارجی و غیره.

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

root@ATmega328p> lfuse را بخوانید فیوز پایین: 0xffبنابراین ، همه بیت ها روی 1 تنظیم شده اند. من همین روش را روی یک کلون آردوینو انجام دادم و مقدار یکسانی را بدست آوردم. با بررسی یکی از سیستم های AVR مستقل خود ، 0xDA دریافت کردم که مقداری است که هنگام پیکربندی تراشه تنظیم کرده بودم. همین روش برای بررسی فیوزهای High Fuse Byte ، Extended Fuse Byte و Lock fuses استفاده می شود. بایت های فیوز کالیبراسیون و امضا در کد با دستور پیش پردازنده #if 0 غیرفعال شده اند که در صورت احساس خرابی می توانید آن را تغییر دهید.

مرحله 4: سایر دستورات

دستورات دیگر
دستورات دیگر

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

root@ATmega328p> fcpu فرکانس CPU: 16000000این 16 میلیون یا 16 میلیون هرتز است که بیشتر با نام 16 مگاهرتز شناخته می شود. می توانید این حالت را به هر دلیلی با فرمان ساعت تغییر دهید. این فرمان یک استدلال دارد: پیش فروشنده که هنگام تقسیم سرعت ساعت از آن استفاده می کند. دستور clock این مقادیر پیش فروشنده را می فهمد:

  • ckdiv2
  • ckdiv4
  • ckdiv8
  • ckdiv16
  • ckdiv32
  • ckdiv64
  • ckdiv128
  • ckdiv256

با استفاده از دستور:

ساعت ckdiv2 وقتی سرعت پردازنده شما 16 مگاهرتز باشد ، سرعت کلاک شما به 8 مگاهرتز تغییر می کند. استفاده از پیش فروشنده ckdiv64 با سرعت کلاک اولیه 16 مگاهرتز منجر به سرعت کلاک نهایی 250 کیلوهرتز می شود. چرا می خواهید MCU خود را کندتر کنید؟ خوب ، سرعت یک ساعت کمتر انرژی کمتری مصرف می کند و اگر MCU شما در حال شارژ شدن باتری در محوطه پروژه باشد ، ممکن است نیازی به آن نداشته باشید تا با حداکثر سرعت کار کند ، بنابراین می تواند سرعت را کاهش داده و مصرف برق آن را کاهش دهد. ، افزایش عمر باتری همچنین ، اگر از ساعت برای هر نوع زمان بندی با MCU دیگر استفاده می کنید ، مثلاً برای اجرای UART نرم افزاری یا مواردی از این قبیل ، ممکن است بخواهید آن را بر روی مقدار خاصی تنظیم کنید که به راحتی می توان با آن سرعت خوب دریافت کرد نرخ خطای کمتر فعال سازی و خاموش کردن سیستم های فرعی جانبی با توجه به کاهش مصرف برق که قبلاً ذکر شد ، ممکن است بخواهید با خاموش کردن برخی از لوازم جانبی داخلی که از آنها استفاده نمی کنید ، برق را بیشتر کاهش دهید. مفسر دستور و پوسته در حال حاضر می تواند لوازم جانبی زیر را فعال و خاموش کند:

  • مبدل آنالوگ به دیجیتال (ADC). این وسیله جانبی هنگامی استفاده می شود که شما یک سنسور آنالوگ ارائه داده (مانند دما ، نور ، شتاب و غیره) داشته باشید و نیاز به تبدیل آن به مقدار دیجیتالی داشته باشید.
  • رابط محیطی سریال (SPI). گذرگاه SPI برای ارتباط با سایر دستگاه های مجهز به SPI مانند حافظه خارجی ، درایورهای LED ، ADC های خارجی و غیره استفاده می شود. بخش هایی از SPI برای برنامه نویسی ISP استفاده می شود ، یا حداقل پین ها استفاده می شود ، بنابراین هنگام خاموش کردن آن مراقب باشید اگر از طریق ISP برنامه نویسی می کنید
  • رابط دو سیم. برخی از دستگاههای خارجی برای برقراری ارتباط از گذرگاه I2C استفاده می کنند ، اگرچه این دستگاهها به سرعت با دستگاههای دارای SPI جایگزین می شوند زیرا SPI دارای توان بیشتری است.
  • USART این رابط سریال شما است. اگر از طریق اتصال سریال به AVR متصل شده اید ، احتمالاً نمی خواهید این مورد را خاموش کنید! با این حال ، من این را در اینجا به عنوان یک اسکلت برای انتقال به دستگاه هایی که دارای چندین USART مانند ATmega162 یا ATmega644P هستند ، اضافه کردم.
  • همه. این استدلال در فرمان powerup یا powerdown همه لوازم جانبی ذکر شده را روشن می کند یا همه آنها را با یک فرمان خاموش می کند. مجدداً از این دستور عاقلانه استفاده کنید.

root@ATmega328p> powerdown twi Powerdown of twi complete.root@ATmega328p> powerup twi پاورپوینت twi کامل است.

شروع و توقف تایمرها پوسته دارای یک تایمر 16 بیتی داخلی است که برای استفاده در دسترس است. شما با دستور timer تایمر را شروع می کنید:

شروع زمان سنجو تایمر را با آرگومان توقف متوقف کنید

توقف تایمراین تایمر با تایمر داخلی USART در تعارض نخواهد بود. در صورتی که این نوع جزئیات جالب به شما علاقه مند است ، کد جزئیات پیاده سازی تایمر USART را مشاهده کنید

root@ATmega328p> زمان سنج شروع به کار timer.root@ATmega328p> تایمر توقف زمان سپری شده: 7 157 ثانیه احراز هویت پوسته می تواند رمز عبور 8 کاراکتری را در EEPROM ذخیره کند. این مکانیزم رمز عبور برای پشتیبانی از قابلیت ورود به شبکه telnet ایجاد شده است ، اما می تواند برای محافظت از موارد دیگر گسترش یابد. به عنوان مثال ، ممکن است از طریق مکانیزم احراز هویت به دستورات خاصی مانند تغییر مقادیر ثبات نیاز داشته باشید. گذرواژه را با دستور رمز عبور تنظیم کنید

root@ATmega328p> passwd blah رمز عبور ریشه را به EEPROM نوشتبا استفاده از دستور author ، اجازه عبور از گذرواژه (یا مجوز برنامه ای از طریق کد) را بدهید. توجه داشته باشید که اگر سعی می کنید رمز اصلی را تغییر دهید و قبلاً یک رمز عبور ریشه تنظیم شده است ، قبل از اینکه اجازه تغییر رمز عبور جدید را بدهید ، باید خود را در برابر رمز عبور قبلی مجوز دهید.

root@ATmega328p> passwd blinky شما باید ابتدا به خود اجازه دهید.root@ATmega328p> author blahAuthorized.root@ATmega328p> passwd blinky رمز عبور جدید ریشه را به EEPROM بنویسیدالبته اگر سیستم عامل را پاک کنید تا مقادیر و متغیرهای قدیمی شما بازیابی شوند ، باید فایل avrsh.eep را بارگیری کنید. Makefile فایل EEPROM را برای شما ایجاد می کند. متغیرها پوسته مفهوم متغیرهای تعریف شده توسط کاربر را درک می کند. کد این را به 20 محدود می کند ، اما اگر دوست دارید با تغییر MAX_VARIABLES تعریف شده در script.h می توانید آن را تغییر دهید. می توانید هر مقدار 16 بیتی (یعنی هر عددی تا 65 ، 536) را در متغیری ذخیره کنید تا بعداً فراخوانی شود. نحو مشابه ثبت هاست با این تفاوت که از علامت دلار ($) برای نشان دادن متغیرهای پوسته استفاده می شود. همه متغیرهای خود را با دستور print variables لیست کنید

متغیرهای چاپ شده توسط کاربر: نام فهرست -> ارزش (01): $ FREE $ -> 0 (02): $ FREE $ -> 0 (03): $ FREE $ -> 0 (04): $ FREE $ -> 0 (05): $ FREE $ -> 0 (06): $ FREE $ -> 0 (07): $ FREE $ -> 0 (08): $ FREE $ -> 0 (09): $ FREE $ -> 0 (10): $ FREE $ -> 0 (11): $ FREE $ -> 0 (12): $ FREE $ -> 0 (13): $ FREE $ -> 0 (14): $ FREE $ -> 0 (15): $ FREE $ -> 0 (16): $ FREE $ -> 0 (17): $ FREE $ -> 0 (18): $ FREE $ -> 0 (19): $ FREE $ -> 0 (20): $ FREE $ -> 0 کامل.یک متغیر تنظیم کنید

$ newvar = 25 $ timeout = 23245مقدار یک متغیر داده شده را بدست آورید

root@ATmega328p> echo $ newvar $ newvar 25می توانید همه متغیرهایی را که در حال حاضر با دستور چاپ که قبلاً می دانید ، ایجاد کرده اید ، ببینید

متغیرهای تعریف شده توسط کاربر: نام فهرست -> ارزش (01): newvar -> 25 (02): زمان پایان -> 23245 (03): $ FREE $ -> 0 (04): $ FREE $ -> 0 (05): $ FREE $ -> 0 (06): $ FREE $ -> 0 (07): $ FREE $ -> 0 (08): $ FREE $ -> 0 (09): $ FREE $ -> 0 (10): $ FREE $ -> 0 (11): $ FREE $ -> 0 (12): $ FREE $ -> 0 (13): $ FREE $ -> 0 (14): $ FREE $ -> 0 (15): $ FREE $ -> 0 (16): $ FREE $ -> 0 (17): $ FREE $ -> 0 (18): $ FREE $ -> 0 (19): $ FREE $ -> 0 (20): $ FREE $ -> 0 کامل.$ $ FREE $ فقط نشان می دهد که آن مکان متغیر رایگان است و هنوز نام متغیری به آن اختصاص داده نشده است.

مرحله 5: سفارشی کردن پوسته

سفارشی کردن پوسته
سفارشی کردن پوسته

در صورت تمایل می توانید کد را هک کرده و آن را بر اساس نیازهای خود سفارشی کنید. اگر می دانستم که این کد را منتشر می کنم ، یک کلاس مفسر و ساختار دستور جداگانه ایجاد می کردم و به سادگی از طریق این اشاره گر تابع تکرار می کردم. این مقدار کد را کاهش می دهد ، اما در حالت ایستاده پوسته خط فرمان را تجزیه می کند و متد shell مناسب را فراخوانی می کند. برای افزودن دستورات سفارشی خود ، موارد زیر را انجام دهید: 1. دستور خود را به لیست تجزیه اضافه کنید تجزیه کننده فرمان خط فرمان را تجزیه کرده و فرمان و هر آرگومان را به طور جداگانه به شما می دهد. استدلال ها به عنوان اشاره گر به اشاره گرها یا مجموعه ای از اشاره گرها منتقل می شوند ، هرچند که دوست دارید با آنها کار کنید. این در shell.cpp یافت می شود. shell.cpp را باز کرده و متد ExecCmd کلاس AVRShell را بیابید. ممکن است بخواهید دستور را به حافظه برنامه اضافه کنید. در این صورت ، دستور را در progmem.h و progmem.cpp اضافه کنید. می توانید دستور را مستقیماً با استفاده از ماکرو PSTR () به حافظه برنامه اضافه کنید ، اما هشدار دیگری از نوع قبلی ذکر شده ایجاد می کنید. مجدداً ، این یک اشکال شناخته شده است که با C ++ کار می کند ، اما می توانید با افزودن دستور مستقیماً در پرونده های برنامه*. این کار را انجام دهید. اگر با اضافه کردن استفاده از SRAM مشکلی ندارید ، می توانید دستور را همانطور که من با دستور "clock" نشان داده ام ، اضافه کنید. بگویید می خواهید یک فرمان جدید به نام "newcmd" اضافه کنید. به AVRShell:: ExecCmd بروید و یک مکان مناسب برای درج کد زیر پیدا کنید:

else if (! strcmp (c، "newcmd")) cmdNewCmd (args)؛این دستور شما را اضافه می کند و متد cmdNewCmd را که در مرحله بعد می نویسید فراخوانی می کند. 2. کد فرمان سفارشی خود را بنویسید در همان فایل ، کد فرمان سفارشی خود را اضافه کنید. این تعریف روش است. شما همچنان می خواهید اظهارنامه را به shell.h اضافه کنید. فقط کافی است آن را به دستورات دیگر اضافه کنید. در مثال قبلی ، کد ممکن است چیزی شبیه به این باشد

voidAVRShell:: cmdNewCmd (char ** args) {sprintf_P (buff، PSTR ("فرمان شما٪ s / r / n" ، args [0]) ؛ WriteRAM (buff)؛}چند مورد در اینجا وجود دارد. اول ، "buff" یک بافر آرایه 40 کاراکتری است که در کد برای استفاده شما ارائه شده است. ما از نسخه حافظه برنامه sprintf استفاده می کنیم ، زیرا از PSTR استفاده می کنیم. در صورت تمایل می توانید از نسخه معمولی استفاده کنید ، اما اطمینان حاصل کنید که قالب را در PSTR ارسال نمی کنید. همچنین ، آرگومان ها در آرایه args هستند. اگر "newcmd arg1 arg2" را تایپ کرده اید ، می توانید با زیرنویس args [0] و args [1] به این استدلال ها برسید. می توانید حداکثر MAX_ARGS آرگومان را همانطور که در کد تعریف شده است ارسال کنید. در صورت نیاز به آرگومان های بیشتر برای تصویب همزمان ، مقدار آن را تغییر دهید. استدلال دوم برای این تابع ضمنی است. اگر چیزی را رد نکردید ، بعد از آن یک خط فرمان نوشته می شود. اگر یک عدد صفر را به عنوان آرگومان دوم تصویب کنید ، اعلان نوشته نمی شود. این زمانی مفید است که بخواهید قبل از بازگشت خط فرمان به کاربر چندین رشته جداگانه برای خروجی بنویسید. 3. از پوسته بخواهید کد فرمان را اجرا کند قبلاً به اجرای کننده پوسته گفته اید که هنگام نصب دستور جدید ، متد cmdNewCmd را اجرا کند ، اما آن را به فایل shell.h اضافه کنید تا توسط شیء پوسته درک شود. فقط کافی است آن را در زیر آخرین فرمان یا جلوی اولین فرمان یا هرجای دیگر آنجا اضافه کنید. و تمام. سیستم عامل را مجدداً کامپایل کرده و در Arduino خود بارگذاری کنید و دستور جدید شما در پوسته در دسترس است.

مرحله 6: خلاصه

شما باید بدانید که چگونه AVR/Arduino خود را نصب کرده و به آن متصل شوید و از میکروکنترلر در حال اجرا اعلان زنده دریافت کنید. شما چندین فرمان را می شناسید که داده های زمان اجرا را از MCU می کشد یا مقادیر را در حال پرواز به MCU تنظیم می کند. همچنین به شما نشان داده شده است که چگونه می توانید کد سفارشی خود را برای ایجاد دستورات منحصر به فرد خود به پوسته اضافه کنید تا بتوانید آن را برای نیازهای خود سفارشی کنید. شما حتی می توانید مترجم دستور را در دستور کار خود قرار دهید تا در صورت نیاز شما فقط شامل دستورات سفارشی شما باشد. امیدوارم از این دستورالعمل لذت برده باشید و AVR Shell برای شما مفید باشد ، چه به عنوان یک مترجم دستور زمان واقعی یا به عنوان یک فرایند یادگیری در اجرای خود. مثل همیشه ، من مشتاقانه منتظر هرگونه نظر یا پیشنهادی در مورد نحوه بهبود این دستورالعمل هستم! با AVR خود لذت ببرید!

توصیه شده: