جدول المحتويات:

AVRSH: غلاف مترجم الأوامر لـ Arduino / AVR: 6 خطوات (بالصور)
AVRSH: غلاف مترجم الأوامر لـ Arduino / AVR: 6 خطوات (بالصور)

فيديو: AVRSH: غلاف مترجم الأوامر لـ Arduino / AVR: 6 خطوات (بالصور)

فيديو: AVRSH: غلاف مترجم الأوامر لـ Arduino / AVR: 6 خطوات (بالصور)
فيديو: اتهموها باستغلال الموقف.. ممرضة أميركية تنشر فيديو غريب من داخل مستشفى 2024, يوليو
Anonim
AVRSH: غلاف مترجم الأوامر لـ Arduino / AVR
AVRSH: غلاف مترجم الأوامر لـ Arduino / AVR

هل أردت يومًا أن يتم "تسجيل الدخول" إلى متحكم AVR الخاص بك؟ هل فكرت يومًا أنه سيكون من الرائع استخدام سجل لمشاهدة محتوياته؟ هل أردت دائمًا طريقة لتشغيل وإيقاف تشغيل الأنظمة الفرعية الطرفية الفردية في AVR أو Arduino في * الوقت الفعلي *؟ أنا أيضًا ، لقد كتبت AVR Shell ، قذيفة تشبه UNIX. إنه يشبه UNIX لأنه يذكرنا بحساب shell الذي قمت بشرائه لتشغيل روبوتات الاصطدام الخاصة بك على irc nick ، بالإضافة إلى وجود أمر أو اثنين مشتركين. يحتوي أيضًا على نظام ملفات يشبه UNIX extfs ، باستخدام EEPROM خارجي ، لكن هذا أصبح مشروعًا في حد ذاته ، لذا سأطلق هذه الوحدة بشكل منفصل تحت تعليمات مختلفة عندما تكون جاهزة للإنتاج. فيما يلي قائمة بالأشياء التي يمكنك فعلها حاليًا باستخدام AVR Shell:

  • اقرأ جميع سجلات توجيه البيانات (DDRn) والمنافذ والدبابيس في الوقت الفعلي
  • اكتب إلى جميع DDRn والمنافذ والدبابيس لتشغيل المحركات أو LED أو قراءة المستشعرات في الوقت الفعلي
  • ضع قائمة بجميع السجلات المعروفة في النظام
  • قم بإنشاء وتخزين القيم في المتغيرات المعرفة من قبل المستخدم والمدعومة بواسطة EEPROM.
  • قم بإنشاء كلمة مرور جذر وقم بالمصادقة عليها (تستخدم للوصول إلى telnet)
  • اقرأ سرعة ساعة وحدة المعالجة المركزية التي تم تكوينها
  • قم بتغيير سرعة ساعة وحدة المعالجة المركزية الخاصة بك عن طريق ضبط مقياس مسبق
  • ابدأ وأوقف مؤقتات 16 بت لتوقيت أشياء مختلفة
  • تشغيل و / أو إيقاف تشغيل الأنظمة الفرعية الطرفية: المحولات التناظرية إلى الرقمية (ADC) ، الواجهة الطرفية التسلسلية (SPI) ، الواجهة ثنائية الأسلاك (TWI / I2C) ، UART / USART. مفيد عندما تريد تقليل استهلاك الطاقة لوحدة التحكم الدقيقة أو لتمكين وظائف معينة.
  • مكتوب بلغة C ++ مع كائنات قابلة لإعادة الاستخدام.

سيرشد هذا التوجيه خلال تثبيت واستخدام وتخصيص avrsh.

الخطوة 1: ما سوف تحتاجه

ماذا ستحتاج
ماذا ستحتاج

لا يتطلب هذا التوجيه الكثير إلا أنك:

  • لديك بطاقة Arduino أو ATmega328P. يمكن أن تعمل أنظمة AVR الأخرى ، ولكن قد تحتاج إلى تعديل الكود لإدراج أي سجلات فريدة لـ MCU الخاص بك. تحتاج الأسماء فقط لمطابقة ما هو مدرج في ملف الرأس الفريد لوحدة التحكم الرئيسية الخاصة بك. العديد من أسماء التسجيل هي نفسها بين AVRs ، لذلك قد يختلف عدد الأميال الخاصة بك عند النقل.
  • لديك طريقة للاتصال بالمسلسل USART الخاص بـ Arduino / AVR. تم اختبار النظام على نطاق واسع باستخدام AVR Terminal ، وهو تطبيق Windows يقوم بإجراء اتصال تسلسلي عبر منفذ USB أو COM. يعمل مع Arduinos باستخدام اتصال USB وأي AVR باستخدام USB-BUB من Moderndevice.com. تشمل الخيارات الطرفية الأخرى: Putty و minicom (Linux و FreeBSD) والشاشة (Linux / FreeBSD) و Hyperterminal و Teraterm. لقد وجدت المعجون و teraterm يرسلان بعض القمامة عند الاتصال لذا قد يكون الأمر الأول مشوهًا.
  • قم بتثبيت وتشغيل برنامج AVR Shell الثابت ، والذي يمكنك تنزيله من هذه الصفحات ، أو احصل دائمًا على أحدث إصدار على BattleDroids.net.

لتثبيت AVR Terminal ، ما عليك سوى فكه وتشغيله. لتثبيت برنامج AVR Shell الثابت ، قم بتنزيله وقم إما بتحميل الملف السداسي مباشرة وتوصيل الجهاز التسلسلي الخاص بك على باود 9600 ، أو قم بتجميعه بنفسك باستخدام "make" ثم "إنشاء البرنامج" لتحميل الملف السداسي. ملاحظة ، قد تحتاج إلى تغيير إعدادات AVRDUDE لتعكس منفذ COM الخاص بك. ملاحظة: سمة PROGMEM معطلة في تطبيق AVR GCC الحالي لـ C ++ وهذا خطأ معروف. إذا قمت بتجميعها ، فتوقع الحصول على العديد من رسائل التحذير التي تقول "تحذير: يمكن فقط وضع المتغيرات التي تمت تهيئتها في منطقة ذاكرة البرنامج". إلى جانب كون هذا التحذير مزعجًا للرؤية ، فإن هذا التحذير غير ضار. نظرًا لأن C ++ على النظام الأساسي المضمن ليست عالية في قائمة أولويات AVR GCC ، فمن غير المعروف متى سيتم إصلاح ذلك. إذا قمت بفحص الكود ، فسترى أين قمت بعمل حلول لتقليل هذا التحذير من خلال تنفيذ عبارات السمات الخاصة بي. قم بتنزيل وتثبيت أي شيء قد تحتاج إليه ثم اقلب الصفحة ودعنا نبدأ.

الخطوة الثانية: سجلات القراءة والكتابة

سجلات القراءة والكتابة
سجلات القراءة والكتابة

تمت كتابة 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 TWSR0A لمعرفة كيفية تعيين البتات الفردية في أي سجل ، استخدم الأمر cat أو echo

قطة٪ GPIOR0 هنا أطلب من مترجم الأوامر عرض محتويات سجل الإدخال / الإخراج للأغراض العامة رقم 0 أو صدى. لاحظ علامة النسبة المئوية (٪) أمام اسم التسجيل. تحتاج إلى هذا للإشارة إلى الصدفة أن هذه كلمة رئيسية محجوزة تحدد السجل. يبدو الإخراج النموذجي من أمر echo هكذا

تم تعيين GPIOR0 (0x0) على [00000000] يُظهر الإخراج اسم السجل والقيمة السداسية العشرية الموجودة في السجل والتمثيل الثنائي للسجل (يظهر كل بت على هيئة 1 أو 0). لتعيين بت معين في أي سجل ، استخدم "فهرس" عامل التشغيل . على سبيل المثال ، لنفترض أنني أريد البت الثالث إلى 1

٪ GPIOR0 [3] = 1 وستعطيك القشرة ردًا يشير إلى عملها والنتيجة

تم تعيين GPIOR0 (0x0) على [00000000] (0x8) مضبوطًا على [00001000] لا تنس علامة النسبة المئوية لإخبار الصدفة بأنك تعمل مع سجل. لاحظ أيضًا أنه من خلال تعيين البت الثالث ، يكون هذا هو 4 بتات لأن AVR الخاص بنا يستخدم فهرسًا على أساس الصفر. بعبارة أخرى ، بالعد إلى البت الثالث ، فإنك تحسب 0 ، 1 ، 2 ، 3 ، وهو المكان الرابع ، لكن البت الثالث. يمكنك مسح بعض الشيء بنفس الطريقة عن طريق ضبط قليلاً على الصفر. من خلال ضبط أجزاء مثل هذه ، يمكنك تغيير أداء AVR الخاص بك أثناء التنقل. على سبيل المثال ، عن طريق تغيير قيمة مطابقة مؤقت CTC الموجودة في OCR1A. يتيح لك أيضًا إلقاء نظرة خاطفة على إعدادات معينة قد يتعين عليك التحقق منها برمجيًا في التعليمات البرمجية ، مثل قيمة UBBR لمعدل الباود الخاص بك. العمل مع DDRn و PORTn و PINn يتم أيضًا تعيين دبابيس الإدخال / الإخراج للسجلات ويمكن تعيينها بنفس الطريقة تمامًا ، ولكن تم إنشاء بنية خاصة للعمل مع هذه الأنواع من السجلات. في الكود ، هناك عملية عادية لتشغيل مصباح LED أو أي جهاز آخر يتطلب ارتفاعًا أو انخفاضًا رقميًا على سبيل المثال. يتطلب إعداد سجل اتجاه البيانات للإشارة إلى أن الدبوس للإخراج ، ثم كتابة 1 أو 0 إلى البت المعين في المنفذ الصحيح. بافتراض أن لدينا مؤشر LED متصل بالرقم الرقمي 13 (PB5) ونريد تشغيله ، فإليك كيفية القيام بذلك أثناء تشغيل AVR

تعيين الإخراج دبوس pb5 إخراج دبوس pb5 عالية الإخراج ، إلى جانب القدرة على رؤية مؤشر LED الخاص بك ، سيبدو هكذا

root @ ATmega328p> تعيين pin pb5 outputSet pb5 للإخراج @ ATmega328p> كتابة pin pb5 highWrote logic high to pin pb5 "root @ ATmega328p>" هو موجه shell الذي يشير إلى أنه جاهز لقبول الأوامر منك. لإيقاف تشغيل مؤشر LED ، يمكنك ببساطة كتابة قيمة منخفضة إلى الدبوس. إذا كنت تريد قراءة الإدخال الرقمي من دبوس ، فاستخدم الأمر read. باستخدام المثال أعلاه

root @ ATmega328p> قراءة pin pb5Pin: pb5 مرتفع بدلاً من ذلك ، ما عليك سوى تكرار سجل الدبوس الذي يتحكم في منفذ الدبوس هذا. على سبيل المثال ، إذا كان لدينا مفاتيح dip متصلة بالرقم الرقمي 7 و 8 (PD7 و PD8) ، فيمكنك إرسال الأمر

صدى٪ PIND ثم يعرض الغلاف محتويات هذا السجل ، ويعرض لك جميع حالات الإدخال / الإخراج للأجهزة المتصلة وما إذا كانت حالة المفتاح قيد التشغيل أو الإيقاف.

الخطوة الثالثة: فيوزات القراءة والكتابة

قراءة وكتابة فيوزات
قراءة وكتابة فيوزات

الصمامات هي أنواع خاصة من السجلات. إنهم يتحكمون في كل شيء بدءًا من سرعة ساعة وحدة التحكم الدقيقة الخاصة بك إلى طرق البرمجة المتاحة لحماية الكتابة عبر EEPROM. ستحتاج أحيانًا إلى تغيير هذه الإعدادات ، خاصة إذا كنت تقوم بإنشاء نظام AVR مستقل. لست متأكدًا من أنه يجب عليك تغيير إعدادات المصهر على Arduino. كن حذرا مع الصمامات الخاصة بك ؛ يمكنك قفل نفسك إذا قمت بتعيينها بشكل غير صحيح. في تعليمات سابقة ، أوضحت كيف يمكنك قراءة وتعيين الصمامات الخاصة بك باستخدام مبرمجك و avrdude. هنا ، سأوضح لك كيفية قراءة الصمامات مرة أخرى في وقت التشغيل لمعرفة كيف قامت MCU بضبطها بالفعل. لاحظ أن هذا ليس إعداد وقت الترجمة الذي تحصل عليه من التعريفات ولكن الصمامات الفعلية حيث تقرأها MCU في وقت التشغيل. من الجدول 27-9 في ورقة بيانات ATmega328P (كتاب البيانات ، أشبه به) ، تكون بتات Fuse Low Byte كما يلي:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0من المثير للاهتمام ملاحظة أنه مع الصمامات ، يعني 0 أنه مبرمج ويعني 1 أن هذا الجزء المعين غير مبرمج. غير بديهي إلى حد ما ، ولكن بمجرد أن تعرفه ، فإنك تعرفه.

  • يضبط CKDIV8 ساعة وحدة المعالجة المركزية الخاصة بك ليتم تقسيمها على 8. يأتي ATmega328P من المصنع المبرمج لاستخدام مذبذب داخلي عند 8 ميجا هرتز مع CKDIV8 مبرمج (أي مضبوط على 0) مما يمنحك F_CPU أو تردد وحدة المعالجة المركزية النهائي 1 ميجا هرتز. في Arduino ، تم تغيير هذا لأنه تم تكوينه لاستخدام مذبذب خارجي بسرعة 16 ميجاهرتز.
  • سيؤدي استخدام CKOUT عند برمجته إلى إخراج ساعة وحدة المعالجة المركزية الخاصة بك على PB0 ، وهو رقم التعريف الشخصي 8 على Arduinos.
  • يحدد SUT [1..0] وقت بدء تشغيل AVR الخاص بك.
  • يضبط CKSEL [3..0] مصدر الساعة ، مثل مذبذب RC الداخلي ، مذبذب خارجي ، إلخ.

عندما تقرأ الصمامات ، ستتم إعادتها إليك بالنظام الست عشري. هذا هو التنسيق الذي تحتاجه إذا كنت تريد كتابة الصمامات عبر avrdude. على اردوينو الخاص بي ، هذا ما أحصل عليه عندما أقرأ بايت الفتيل السفلي:

root @ ATmega328p> قراءة lfuseLower Fuse: 0xffلذلك ، تم ضبط جميع وحدات البت على 1. قمت بنفس الإجراء على نسخة Arduino وحصلت على نفس القيمة. عند التحقق من أحد أنظمة AVR المستقلة الخاصة بي ، حصلت على 0xDA وهي القيمة التي قمت بتعيينها لبعض الوقت عند تكوين الشريحة. يتم استخدام نفس الإجراء لفحص High Fuse Byte و Extended Fuse Byte و Lock fuses. تم تعطيل بايتات فتيل المعايرة والتوقيع في الكود باستخدام توجيه #if 0 للمعالج المسبق ، والذي يمكنك تغييره إذا شعرت بعدم الراحة.

الخطوة 4: أوامر أخرى

أوامر أخرى
أوامر أخرى

هناك العديد من الأوامر الأخرى التي يفهمها مترجم الأوامر الافتراضي والتي قد تجدها مفيدة. يمكنك رؤية جميع الأوامر التي تم تنفيذها وإصدارها في المستقبل عن طريق إصدار تعليمات أو قائمة عند المطالبة. سأغطيها بسرعة هنا لأنها في الغالب تشرح نفسها بنفسها. إعدادات تردد ساعة وحدة المعالجة المركزية (CPU) يمكنك معرفة ما تم تكوين البرنامج الثابت الخاص بك لاستخدامه كإعدادات ساعة وحدة المعالجة المركزية باستخدام الأمر fcpu:

الجذر @ ATmega328p> fcpuCPU التكرار: 16000000هذا هو 16 مليون ، أو 16 مليون هيرتز ، والمعروف أكثر باسم 16 ميجاهرتز. يمكنك تغيير هذا على الفور ، لأي سبب من الأسباب ، باستخدام أمر الساعة. يأخذ هذا الأمر حجة واحدة: المقياس المسبق الذي يجب استخدامه عند قسمة سرعة الساعة. يتفهم أمر الساعة هذه القيم المسبقة للمقياس:

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

باستخدام الأمر:

ساعة ckdiv2 عندما تكون سرعة وحدة المعالجة المركزية الخاصة بك 16 ميجاهرتز ، فإن ذلك سيؤدي إلى تغيير سرعة الساعة إلى 8 ميجاهرتز. سيؤدي استخدام مقياس مسبق لـ ckdiv64 مع سرعة ساعة أولية تبلغ 16 ميجاهرتز إلى سرعة ساعة نهائية تبلغ 250 كيلو هرتز. لماذا تريد على الأرض جعل MCU أبطأ؟ حسنًا ، على سبيل المثال ، تستهلك سرعة الساعة المنخفضة طاقة أقل ، وإذا كانت وحدة MCU الخاصة بك تنفد من البطارية في حاوية المشروع ، فقد لا تحتاجها للتشغيل بأقصى سرعة ، وبالتالي يمكن أن تخفض السرعة وتقليل استهلاكها للطاقة ، مما يزيد من عمر البطارية. أيضًا ، إذا كنت تستخدم الساعة لأي نوع من مشكلات التوقيت مع MCU أخرى ، على سبيل المثال ، تنفيذ برنامج UART أو شيء من هذا القبيل ، فقد ترغب في تعيينه على قيمة معينة يسهل الحصول على معدل باود لطيف مع معدلات خطأ أقل. تشغيل الأنظمة الفرعية الطرفية وإيقاف تشغيلها في نفس الملاحظة مثل تقليل استهلاك الطاقة المذكور سابقًا ، قد ترغب في تقليل الطاقة بشكل أكبر عن طريق إيقاف تشغيل بعض الأجهزة الطرفية الموجودة على متن الطائرة التي لا تستخدمها. يمكن لمترجم الأوامر و shell حاليًا تشغيل الأجهزة الطرفية التالية وإيقاف تشغيلها:

  • محول تناظري إلى رقمي (ADC). يتم استخدام هذا الجهاز الطرفي عندما يكون لديك مستشعر تناظري يوفر البيانات (مثل درجة الحرارة والضوء والتسارع وما إلى ذلك) وتحتاج إلى تحويلها إلى قيمة رقمية.
  • الواجهة الطرفية التسلسلية (SPI). يتم استخدام ناقل SPI للتواصل مع الأجهزة الأخرى التي تدعم SPI ، مثل الذكريات الخارجية ، ومحركات LED ، و ADC الخارجية ، وما إلى ذلك. تُستخدم أجزاء من SPI لبرمجة ISP ، أو على الأقل الدبابيس ، لذا كن حذرًا عند إغلاق هذا إذا كنت تقوم بالبرمجة عبر ISP.
  • واجهة ذات سلكين. تستخدم بعض الأجهزة الخارجية ناقل I2C للتواصل ، على الرغم من أنه يتم استبدالها سريعًا بأجهزة تدعم SPI نظرًا لأن SPI لديها إنتاجية أكبر.
  • USART. هذه هي واجهتك التسلسلية. ربما لا ترغب في إيقاف تشغيل هذا إذا كنت متصلاً بـ AVR عبر الاتصال التسلسلي! ومع ذلك ، أضفت هذا هنا كهيكل للتنقل إلى الأجهزة التي تحتوي على العديد من USART مثل ATmega162 أو ATmega644P.
  • الكل. هذه الحجة لأمر powerup أو powerdown تعمل على تشغيل جميع الأجهزة الطرفية المذكورة أو إيقاف تشغيلها جميعًا بأمر واحد. مرة أخرى ، استخدم هذه الوصية بحكمة.

root @ ATmega328p> powerdown twiPowerdown of twi complete.root@ATmega328p> powerup twi

بدء الموقتات وإيقافها يحتوي الهيكل على مؤقت مدمج 16 بت متاح للاستخدام. تبدأ المؤقت بأمر المؤقت:

بدء الموقتوإيقاف المؤقت مع وسيطة التوقف

توقف الموقتلن يتعارض هذا المؤقت مع مؤقت USART الداخلي. راجع الكود للحصول على تفاصيل تنفيذ مؤقت USART ، إذا كان هذا النوع من التفاصيل الدموية يثير اهتمامك

root @ ATmega328p> بدء الموقت المصادقة يمكن لـ shell تخزين كلمة مرور مكونة من 8 أحرف في EEPROM. تم إنشاء آلية كلمة المرور هذه لدعم إمكانيات تسجيل الدخول إلى telnet ، ولكن يمكن توسيعها لحماية أشياء أخرى. على سبيل المثال ، قد تطلب أوامر معينة ، مثل تغيير قيم التسجيل ، من خلال آلية المصادقة ، اضبط كلمة المرور باستخدام الأمر password

root @ ATmega328p> passwd blah اكتب كلمة مرور الجذر إلى EEPROMالتخويل مقابل كلمة المرور الخاصة به (أو طلب التفويض برمجيًا من خلال الكود) باستخدام الأمر auth. لاحظ أنه إذا حاولت تغيير كلمة مرور الجذر وكان هناك بالفعل مجموعة كلمة مرور جذر ، فيجب عليك تفويض نفسك باستخدام كلمة المرور القديمة قبل السماح لك بتغييرها إلى كلمة مرور جديدة

root @ ATmega328p> passwd blinky يجب عليك تفويض نفسك أولاً.بالطبع ، ستحتاج إلى تحميل ملف 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): $ مجاني $ -> 0 (06): $ مجاني $ -> 0 (07): $ مجاني $ -> 0 (08): $ مجاني $ -> 0 (09): $ مجاني $ -> 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 دولارًا أمريكيًا انتهت المهلة = 23245 دولارًا أمريكيًااحصل على قيمة متغير معين

root @ ATmega328p> صدى $ newvar $ newvar 25يمكنك رؤية جميع المتغيرات التي قمت بإنشاء مثيل لها حاليًا باستخدام أمر الطباعة الذي تعرفه بالفعل

المتغيرات التي يحددها المستخدم: اسم الفهرس -> القيمة (01): newvar -> 25 (02): المهلة -> 23245 (03): $ FREE $ -> 0 (04): $ FREE $ -> 0 (05): $ مجاني -> 0 (06): $ مجاني $ -> 0 (07): $ مجاني $ -> 0 (08): $ مجاني $ -> 0 (09): $ مجاني $ -> 0 (10): $ مجاني -> 0 (11): $ مجاني $ -> 0 (12): $ مجاني $ -> 0 (13): $ مجاني $ -> 0 (14): $ مجاني $ -> 0 (15): $ مجاني -> 0 (16): $ مجاني $ -> 0 (17): $ مجاني $ -> 0 (18): $ مجاني $ -> 0 (19): $ مجاني $ -> 0 (20): $ FREE $ -> 0 كامل.يشير اسم $ FREE $ فقط إلى أن هذا الموقع المتغير مجاني ولم يتم تعيين اسم متغير له بعد.

الخطوة 5: تخصيص شل

تخصيص شل
تخصيص شل

أنت حر في اختراق الكود وتخصيصه حسب احتياجاتك الخاصة ، إذا كنت ترغب في ذلك. إذا كنت قد علمت أنني سأطلق هذا الرمز ، لكنت قد صنعت فئة منفصلة لمترجم الأوامر وهيكل الأمر وببساطة تكررت من خلال استدعاء مؤشر الوظيفة. سيقلل من مقدار الكود ، ولكن كما هو الحال ، تقوم الصدفة بتحليل سطر الأوامر واستدعاء طريقة الصدفة المناسبة. لإضافة الأوامر المخصصة الخاصة بك ، قم بما يلي: 1. أضف الأمر إلى قائمة التحليل سيقوم محلل الأوامر تحليل سطر الأوامر وإعطائك الأمر وأي وسيطات بشكل منفصل. يتم تمرير الوسيطات كمؤشرات إلى مؤشرات ، أو مجموعة من المؤشرات ، ولكنك ترغب في التعامل معها. تم العثور على هذا في shell.cpp. افتح shell.cpp وابحث عن طريقة ExecCmd لفئة AVRShell. قد ترغب في إضافة الأمر إلى ذاكرة البرنامج. إذا قمت بذلك ، أضف الأمر في progmem.h و progmem.cpp. يمكنك إضافة الأمر إلى ذاكرة البرنامج مباشرةً باستخدام ماكرو PSTR () ، لكنك ستنشئ تحذيرًا آخر من النوع المذكور سابقًا. مرة أخرى ، هذا خطأ معروف يعمل مع C ++ ، ولكن يمكنك التغلب على هذا عن طريق إضافة الأمر مباشرة في ملفات. * progmem ، كما فعلت. إذا كنت لا تمانع في إضافة استخدام SRAM الخاص بك ، يمكنك إضافة الأمر كما أوضحت مع الأمر "clock". لنفترض أنك تريد إضافة أمر جديد يسمى "newcmd". انتقل إلى AVRShell:: ExecCmd وابحث عن مكان مناسب لإدخال الكود التالي:

وإلا إذا (! 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 من الوسيطات كحد أقصى ، كما هو محدد في الكود. لا تتردد في تغيير هذه القيمة عند إعادة التحويل البرمجي إذا كنت بحاجة إلى العديد من الوسائط لتمريرها في وقت واحد. يعد كل من WriteLine و WriteRAM دالات عامة تُرجع أساليب UART التي تحمل الاسم نفسه. الحجة الثانية لهذه الوظيفة ضمنية. إذا لم تمرر شيئًا ، فسيتم كتابة موجه الأوامر بعد ذلك. إذا مررت 0 كوسيطة ثانية ، فلن تتم كتابة موجه. يكون هذا مفيدًا عندما تريد كتابة عدة سلاسل منفصلة للإخراج قبل إرجاع موجه الأوامر إلى المستخدم. 3. اجعل shell ينفذ كود الأمر لقد أخبرت منفذ الصدفة أن ينفذ الأسلوب cmdNewCmd عند إعداد الأمر الجديد ، لكن أضفه إلى ملف shell.h لكي يفهمه كائن shell. ما عليك سوى إضافته أسفل الأمر الأخير أو أمام الأمر الأول ، أو في أي مكان هناك ، وهذا كل شيء. أعد ترجمة البرامج الثابتة وتحميلها على Arduino وسيصبح الأمر الجديد متاحًا من shell عند الموجه.

الخطوة 6: الملخص

يجب أن تعرف كيفية التثبيت والاتصال بـ AVR / Arduino والحصول على موجه مباشر على وحدة التحكم الدقيقة قيد التشغيل. أنت تعرف العديد من الأوامر التي ستسحب بيانات وقت التشغيل من MCU أو تحدد القيم في MCU بسرعة. لقد تم توضيح كيفية إضافة التعليمات البرمجية المخصصة الخاصة بك لإنشاء أوامر فريدة خاصة بك إلى shell لتخصيصها بشكل أكبر لاحتياجاتك الخاصة. يمكنك حتى الحصول على مترجم الأوامر لجعله يحتوي فقط على أوامرك المخصصة ، إذا كان ذلك يناسب احتياجاتك ، وآمل أن تكون قد استمتعت بهذه التعليمات وأن يكون AVR Shell مفيدًا لك ، إما كمترجم أوامر في الوقت الفعلي أو كعملية تعليمية في تنفيذ العملية الخاصة بك. كما هو الحال دائمًا ، أتطلع إلى أي تعليقات أو اقتراحات حول كيفية تحسين هذه التعليمات! استمتع مع AVR الخاص بك!

موصى به: